我正在学习各种漏洞,而且我无法理解格式字符串漏洞。我在一个允许利用的环境中设置了一个相当简单的程序。
int woah(char *arg){
char buf[200];
snprintf(buf, sizeof buf, arg);
return 0;
}
我能够控制arg被传递到函数中,这将是攻击将如何发生,程序的最终结果是运行我的shellcode并给我root。让程序崩溃很容易,只需提供它"%s%s"它是段错误的。我们想要做的不仅仅是这样,所以我们提供的东西类似于" AAAA%x%x%x%x%x%x%x"。看一下gdb中的程序,我们在snprinf之后看看缓冲区,我们可以看到:
"AAAA849541414141353934....blah blah blah"
那很好!我们可以看到堆栈上的A以及A是十六进制的41s。但接下来会发生什么?我知道这里的一般想法是用四个字节覆盖指令指针,方法是将字符串放在我们输入的字符串的开头.....然后沿着这一行我们指向我们的shellcode。
如何找到要覆盖的seip / return地址?
答案 0 :(得分:0)
当调用snprintf()时,会创建一个堆栈帧 - 内存区域 - 来执行它的函数语句。但是,在此之前,编译器需要知道函数的前一个调用者 - 返回点地址。这个地址包含在堆栈框架中,所以当堆栈框架展开时,即函数正在完成其工作,它已经返回到该地址,因此程序可以继续运行。您要做的是用您的shellcode地址覆盖此地址。研究更多关于堆栈帧,ESP,EBP,EIP的想法。