如何成功测试这个用 C 编写的简单缓冲区溢出?

问题描述 投票:0回答:1

我正在尝试从 StackOverflow 测试这个示例(how-can-i-invoke-buffer-overflow),但我没有成功。
两周前我也直接在帖子上要求澄清(通过评论),但仍然没有答案(也许太旧了,2010年)。
我要求一种简洁的方式来完成这项工作:编译器选项、操作系统配置,如果有必要,更改代码以使其符合当今的进程/内存布局,或者至少能够超越当今的安全操作系统保护
我尝试了自己的猜测,但似乎没有任何作用。 我想避免继续进行迷信尝试(无关的编译器选项,无关的操作系统修补),并选择在这里询问专家或消息灵通的人是否提出建议或至少指出一条充满希望的道路。

我的结果:

$ gcc overflow.c
$ ./a.out  
now inside f()!

应该发生的结果:

nils@doofnase:~$ gcc overflow.c
nils@doofnase:~$ ./a.out
now inside f()!
now inside g()!
now inside g()!
now inside g()!
now inside g()!
now inside g()!
now inside g()!
Segmentation fault

代码:

#include <stdio.h> 
#include <stdlib.h> 


void g()  
{ 
       printf("now inside g()!\n"); 
} 


void f()  
{ 
       int i; 
       void * buffer[1]; 
       printf("now inside f()!\n"); 

       // can only modify this section 
       // cant call g(), maybe use g (pointer to function) 

       // place the address of g all over the stack: 
       for (i=0; i<10; i++) 
               buffer[i] = (void*) g; 

       // and goodbye... 
} 


int main (int argc, char *argv[]) 
{ 
       f(); 
       return 0; 
}

我的机器:

x86_64 GNU/Linux 
6.10.9-amd64
linux buffer-overflow c
1个回答
0
投票

你正在“取得成功”:你的写作超出了你的缓冲范围。但这样做的效果并不能保证。您可能想阅读:

未定义、未指定和实现定义的行为

了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.