我的目标是编写一个无限循环。我必须无限地打印这个字符串“Hello World %s”,我只能使用ROP(面向返回的编程)。
gcc -fno-stack-protector loop.c -o loop
我可以如图所示进行编译。我该如何进行 ROP?
#include<stdio.h>
#include<string.h>
main(char argc, char ** argv){
char buffer[80];
strcpy(buffer,argv[1]);
printf("Hello World %s",buffer);
return 1;
}
最佳答案
所以,粗略的方法是:
buffer
位于堆栈上,main函数
被调用者的返回地址位于此处。由于堆栈向后增长,您可以覆盖返回地址,因为它之前已附加。堆栈应如下所示:
[buffer data][ebp save][callee return address]...anything
不太确定,但很可能,被调用者的返回地址位于 ebp
保存的值之后,该值位于缓冲区数据之后,因此您需要给出一个 84 字节长的值数据数组(不包含 0x00
,因为这会终止字符串),后跟返回地址。该地址需要指向某个地方,即您的“黑客”位于内存中的位置。一个可能的位置是堆栈本身,因此您可能需要在返回地址之后附加无限循环的机器代码。
需要注意的是,您必须生成不包含空字节的机器代码。您可以提供给程序的参数字符串的示例布局应如下所示:
[84 byte data][return address][machine code]
这应该适用于较旧的 Linux 内核。此外,假设您正在 32 位系统上工作,因此指针的长度为 4 个字节。在 64 位系统上它将是 8 个字节。
关于c - 如何进行无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32405851/