本篇主要讲的是相对于pwn来说比较基础的awd攻防对抗的几种类型,比如对溢出漏洞,格式化字符串漏洞,整数溢出漏洞,数组索引越界漏洞,以及跟堆有关的UAF漏洞的修复。

在了解这些之前呢首先你的掌握对IDA的最基本的使用以及汇编代码的基本了解

格式化字符串漏洞:

直接来个最简单的例子

#include <stdio.h>

// gcc fmt.c -o fmt -no-pie -w
int main()
{
char b[100];
scanf("%s", b);
printf(b);

return 0;
}

当我们运行该代码时2

当我们正常输入时,可以看到并没有什么问题,可是当我们输入格式化字符串%s时却出现了一些奇怪的输出,

这是因为我们在printf函数上并没有规定b的输出格式,从而导致了内存泄漏的问题。解决方法呢,思路也很简单

就是再给printf函数添加一个%s不就行了嘛,可是要怎么添加呢,直接加上去肯定不现实,因为比赛时人家肯定不会给你C语言源代码,这时候我们就要想到人家给你的文件进行反汇编修改,这时候就要用到IDA一个插件keypatch3

然后找到我们要修改的函数4

先确定我们的思路就是将printf(b);修改为printf(“%s”,b);所以我们要将printf函数的第一个参数修改%s,第二个参数修改为b;

但是这里我们就要注意几个问题:

1.我们在修改一个地方的时候别的地方会不会改变;

2.在没有%s的情况下怎么办;

3.最重要的还是如何修改;

首先呢,第一个问题,肯定是会变的,因此我们要将变化的这一段重新放回到一个地方进行修改,可问题是在哪里修改呢,得在一个有执行权限的地方5

在gdb中调试可知道0x400000~0x401000是由可执行权限的6因此我们可以jmp到0x4006b9的地方来部署我们的汇编。

接下来解决第二个问题,如何增加%s,我们可以在rodata段进行二进制修改7

将0x4006b1和0x4006b2的地方将0和2修改为%和s(前提是这里没有被利用)查询%和s的ascll码分别为25和738

那么第三个问题自然就简单了,思路为先跳转到.eh_frame_hdr,在将%s传入rdi,b传入rsi,再跳转到刚才的代码中

那么汇编代码就是

jmp 0x4006b9            //最后要nop一下
lea rax,[rbp-0x70] //fomat
mov rsi,rax
lea rdi,[0x4006b1] //%s
jmp 0x4005fd

最后呢要在这里应用一下才有效哦9

然后我们保存文件再来gdb调试一下10

可以看到已经成功地修改我们运行测试一下12

可以看到该程序的输出已经正常。

可是呢该程序是没有开启pie保护的,如果开启了pie保护呢,那我们在jmp的时候地址岂不是不确定了,但是我在开启pie式的时候发现按照上面的地址方式(开了pie时成了偏移)照样行得通。

先写这么多吧。