AWD
本篇主要讲的是相对于pwn来说比较基础的awd攻防对抗的几种类型,比如对溢出漏洞,格式化字符串漏洞,整数溢出漏洞,数组索引越界漏洞,以及跟堆有关的UAF漏洞的修复。
在了解这些之前呢首先你的掌握对IDA的最基本的使用以及汇编代码的基本了解
格式化字符串漏洞:
直接来个最简单的例子
#include <stdio.h> |
当我们运行该代码时
当我们正常输入时,可以看到并没有什么问题,可是当我们输入格式化字符串%s时却出现了一些奇怪的输出,
这是因为我们在printf函数上并没有规定b的输出格式,从而导致了内存泄漏的问题。解决方法呢,思路也很简单
就是再给printf函数添加一个%s不就行了嘛,可是要怎么添加呢,直接加上去肯定不现实,因为比赛时人家肯定不会给你C语言源代码,这时候我们就要想到人家给你的文件进行反汇编修改,这时候就要用到IDA一个插件keypatch
然后找到我们要修改的函数
先确定我们的思路就是将printf(b);修改为printf(“%s”,b);所以我们要将printf函数的第一个参数修改%s,第二个参数修改为b;
但是这里我们就要注意几个问题:
1.我们在修改一个地方的时候别的地方会不会改变;
2.在没有%s的情况下怎么办;
3.最重要的还是如何修改;
首先呢,第一个问题,肯定是会变的,因此我们要将变化的这一段重新放回到一个地方进行修改,可问题是在哪里修改呢,得在一个有执行权限的地方
在gdb中调试可知道0x400000~0x401000是由可执行权限的因此我们可以jmp到0x4006b9的地方来部署我们的汇编。
接下来解决第二个问题,如何增加%s,我们可以在rodata段进行二进制修改
将0x4006b1和0x4006b2的地方将0和2修改为%和s(前提是这里没有被利用)查询%和s的ascll码分别为25和73
那么第三个问题自然就简单了,思路为先跳转到.eh_frame_hdr,在将%s传入rdi,b传入rsi,再跳转到刚才的代码中
那么汇编代码就是
jmp 0x4006b9 //最后要nop一下 |
最后呢要在这里应用一下才有效哦
然后我们保存文件再来gdb调试一下
可以看到已经成功地修改我们运行测试一下
可以看到该程序的输出已经正常。
可是呢该程序是没有开启pie保护的,如果开启了pie保护呢,那我们在jmp的时候地址岂不是不确定了,但是我在开启pie式的时候发现按照上面的地址方式(开了pie时成了偏移)照样行得通。
先写这么多吧。