c - 如何进行无限循环

标签 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;
}

最佳答案

所以,粗略的方法是:

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/

相关文章:

python - 终止无限循环

Javascript 打字机片段使浏览器没有响应

c - C 中的段错误套接字

C程序不断向串口发送相同的数据

c++ - 为什么我在计算 Pascal 三角形的元素时在递归 C 程序中出现堆栈溢出错误?

linux - 利用导致程序在 GDB 中以不同的值退出?

c - 关于调用自身的函数的堆栈重用?

reactjs - UseEffect 和 useCallback 仍然导致 react 项目中的无限循环

c - 如何找到某个字母在句子中的位置? (C语言编程)

c - 在 C 中向前显示数字?