其实这个知识点应该算是栈溢出后面就可以讲的了 顺序没把握好 不过还好这篇的例题有点干货 就不丢到基础知识扩展那个专题了 在这面说吧
我们已经学习了基础的栈溢出对吧 总归就是覆盖栈上的高地址内的数据 通常我们都是用一些没有意义的垃圾数据去覆盖他
但是有些题目 就可能会故意刁难我们
比如下面这题
是吧 他都把var[13]赋值为了0 结果要var[13]>0并且=17才能达到我们系统调用的目的
这怎么整?
我们唯一的输入点就在第十行 其中肯定有漏洞
%s 读入字符串数据 注意这里的是%s 我们刚开始提到的干货就是这个
ps:这里我也理解不了 感兴趣的可以自己看大佬博客:
pwn中str()与p64() - ATKevin - 博客园 (cnblogs.com)
不然就是记个结论 %s就得用p32/p64 传输数据
也就是说我们在覆盖var[13]时 需要注意不能用b””或者是str()
说回题目
scanf没有对输入的字节长度进行限制 存在了栈溢出漏洞
我们只需要用垃圾数据填充var数组的前13个数据 然后用17填充var[13]
当然 这里还得注意一下
char类型的数组的每个值都是一个字节长度的 而这题并不是char类型的数组 所以我们应该用一个字长去覆盖一个数组元素
所以这里我们的payload应该写成
payload = cyclic(13*4)+p32(17) |
当然也可以写成
payload = p32(1)*13+p32(17) |
这样我们就成功覆盖了var[13]的值为17了