C中的堆栈溢出漏洞利用

问题实际上是关于C中的堆栈溢出。我有一个我不能为我的生活完成的分配,我已经查看了gdb中的所有内容,我只是无法想象它。

问题如下:

int i,n; void confused() { printf("who called me"); exit(0); } void shell_call(char *c) { printf(" ***Now calling \"%s\" shell command *** \n",c); system(c); exit(0); } void victim_func() { int a[4]; printf("[8]:%x\n", &a[8]); printf("Enter n: "); scanf("%d",&n); printf("Enter %d HEX Values \n",n); for(i=0;i<n;i++) scanf("%x",&a[i]); printf("Done reading junk numbers\n"); } int main() { printf("ls=736c --- ps = 7370 --- cal = 6c6163\n"); printf("location of confused %x \n", confused); printf("location of shell_call %x \n", shell_call); victim_func(); printf("Done, thank you\n"); } 

好的,所以我设法正确地得到了第一个问题,即任意调用主路径中未明确调用的两个函数之一。 顺便说一下,这必须在运行程序时完成而不做任何修改。 我这样做是通过运行程序,将N设置为7 ,这使我进入victim_func帧的函数指针,我写a[7]与内存地址confused或shell_call ,它的工作原理。 (我有一台64位机器,这就是为什么我必须把它变为7,因为EBI指针是2英寸宽,而不是1)

我的问题如下,我怎样才能控制哪个参数传递给shell_code函数? 即。 如何将string写入char* c 。 重点是通过仅运行程序来执行像ps等unix命令。

我想用shell_call的hex表示编写EBI指针并将shell_call的arg列表设置为,但这不起作用。 我也尝试输入argsv参数并将argsv的arg列表设置为shell_callarg_list ,但也没有用。

我认为第二个版本应该可以工作,但我相信我没有正确设置新堆栈帧的arg列表(我是通过将a[8]写入0 ,因为它是函数指针的第一部分,并且写入a[9]=736ca[10]=0000 ,但它可能不正确,因为那些是victim_func的参数。那么如何访问shell_call的参数?

我可能不应该为你做功课。 但基本上:

您需要在内存中的某处获取字符缓冲区来存储您要执行的字符串。 显然,您可以像调用其他函数一样(即将文本也放在堆栈中)。 编写完成后,需要在shell_code函数期望找到其参数的位置写入指向堆栈的指针。

在没有我完成所有工作的情况下解决这个问题的最佳方法是在一张纸/白板上写下你的堆栈/内存内容。 如果从程序内部正常调用shell_code,请记下它的外观。 然后在victum_func中写下堆栈的样子,并找出要改变的东西,让它看起来像“自然”一样(当然要记住一些东西“不关心”,如返回地址)。

这就是你今天要从我这里得到的所有慈善事业! 😛

SoapBox已经做了很好的工作,引领你朝着正确的方向前进。

欲获得更多信息; http://www.skullsecurity.org/wiki/index.php/Example_4

你需要操纵调用者的堆栈框架( main() ),并以这样的方式安排它从溢出的victim_func()victim_func() ,后者可以找到一个固定的堆栈,因为它是主要叫做。

这样做你可能不得不在受害者的堆栈框架中破坏框架指针,这将通过leave在%ebp中恢复。