如何做无限循环

时间:2015-09-04 20:09:17

标签: c stack-overflow infinite-loop buffer-overflow exploit

我的目标是写一个无限循环。我必须无限地打印这个字符串“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;
}

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个字节。