我的目标是写一个无限循环。我必须无限地打印这个字符串“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;
}
答案 0 :(得分:1)
所以,粗略的方法:
buffer
位于堆栈上,main function
- 被调用者的返回地址位于堆栈中。由于事实,堆栈向后增长,您可以覆盖返回地址,因为它之前已经附加了。堆栈应如下所示:
[buffer data][ebp save][callee return address]...anything
它不太确定,但很可能,被调用者的返回地址位于缓存数据之后的ebp
保存值之后,因此您需要给出一个84字节长的数据数组(不包含0x00
,因为这将终止字符串),后跟返回地址。地址需要指向某个地方,你的&#34; hack&#34;位于记忆中。一个可能的位置是堆栈本身,因此您可能希望在返回地址之后附加无限循环的机器代码。
需要注意的是,必须生成不包含空字节的机器代码。您可以为程序提供的参数字符串的示例布局应如下所示:
[84 byte data][return address][machine code]
这适用于较旧的Linux内核。此外,这假设您正在使用32位系统,因此指针长度为4个字节。在64位系统上,它将是8个字节。