我正在学习各种各样的漏洞,我不能完全理解格式字符串的漏洞我在一个允许利用漏洞的环境中设置了一个相当简单的程序。

int woah(char *arg){
char buf[200];
snprintf(buf, sizeof buf, arg);
return 0;
}

我能够控制传入函数的arg,这将是在程序运行我的外壳代码并给我根目录的最终结果时攻击的方式使程序崩溃很容易,只需输入它%s%s,它就会出现分段错误我们想做的不止这些,所以我们给它一些东西,比如“AAAA%x%x%x%x%x%x%x%x%x”看看gdb中的程序,我们看看snprinf后面的缓冲区,我们可以看到:
"AAAA849541414141353934....blah blah blah"

太好了我们可以看到堆栈上的A和41s,它们都是十六进制的但接下来呢我知道这里的一般思想是用四个字节覆盖指令指针,在我们输入的字符串的开头有一个地址…..然后在这一行的某个地方有一个指向外壳代码的地址。
如何找到要覆盖的seip/返回地址的地址?

最佳答案

当调用snprintf()时,将创建一个堆栈帧-内存区域-以执行其函数语句但是,在发生这种情况之前,编译器需要知道函数返回点地址的前一个调用方此地址包含在堆栈帧中,因此当堆栈帧展开(即函数正在完成其工作)时,它已返回到该地址,以便程序可以继续运行你要做的是用你的外壳代码地址覆盖这个地址对堆栈帧,ESP,EBP,EIP进行更多的研究以获得这个想法。

关于c - 了解格式字符串漏洞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26079607/

10-12 14:52