我可以为 x64 系统执行字符串格式漏洞利用吗?

信息安全 开发 开发开发 格式字符串
2021-09-08 22:50:14

我试图在Gray Hat Hacking - 第三版第 12 章中复制有关格式化字符串漏洞的实验,但他们的架构是 IA32,而我的架构是 AMD 64 位。因此,当我使用以下命令检查堆栈中的值时:

$ ./fmtstr "AAAAAAAA %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x"   

什么都没有出现,这类似于它在内存中的表示 (41414141 41414141)。为什么漏洞利用缓冲区没有返回实际和连续的内存数据?有关详细信息,请参阅他的控制台图像帮助!。

1个回答

如果您正在使用本书(如下)中的示例代码,在某些时候您应该会达到“AAAAAAAA”模式(0x41)。请注意,由于您在 64 位机器上运行它,每个元素在堆栈中存储 8 个字节,因此您应该$ ./fmtstr "AAAAAAAA %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x"改为运行它,否则您将丢失堆栈中每个元素的一部分。

#include <stdlib.h>
int main(int argc, char *argv[]){
        static int canary=0;   // stores the canary value in .data section
        char temp[2048];       // string to hold large temp string
      strcpy(temp, argv[1]);   // take argv1 input and jam into temp
      printf(temp);            // print value of temp
      printf("\n");            // print carriage return
      printf("Canary at 0x%08x = 0x%08x\n", &canary, canary); //print canary
}

您应该注意书中的引述:

显示的第四项(来自堆栈)是我们的格式字符串这一事实取决于所使用的格式函数的性质以及易受攻击的调用在易受攻击的程序中的位置。要找到这个值,只需使用蛮力并不断增加 %08x 标记的数量,直到找到格式字符串的开头。对于我们的简单示例 (fmtstr),称为偏移量的距离定义为 4。

请记住,被解析的参数printf不是字符串本身,而是字符串的地址。因此,它在程序的内存布局上相对于printf堆栈的位置将定义您必须搜索多远才能找到它。