C语言中的堆栈溢出漏洞

C语言中的堆栈溢出漏洞,c,stack-overflow,buffer-overflow,exploit,C,Stack Overflow,Buffer Overflow,Exploit,问题实际上是关于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); }

问题实际上是关于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");

}
inti,n;
无效()
{
printf(“谁打电话给我”);
出口(0);
}
无效shell_调用(char*c)
{
printf(“***正在调用\%s\”shell命令***\n”,c);
系统(c);
出口(0);
}
无效受害者_func()
{
int a[4];
printf(“[8]:%x\n”,&a[8]);
printf(“输入n:”;scanf(“%d”,&n);
printf(“输入%d个十六进制值\n”,n);

对于(i=0;i我可能不应该为你做家庭作业。但基本上:

您需要在内存中的某个位置获得一个字符缓冲区来存储要执行的字符串。显然,您可以使用与调用其他函数相同的方法来执行此操作(即,您也可以将文本放在堆栈上)。编写完之后,需要将指向它的指针写入堆栈中shell_代码函数期望找到其参数的位置

在我不为你做所有工作的情况下,解决这个问题的最好方法是在一张纸/白板上写下你的堆栈/内存内容。写下如果你正常地从程序内部调用shell_代码,它会是什么样子。然后写下victum_func中堆栈的外观,并找出要更改哪些内容以获得i不要让它看起来“自然”(当然要记住,有些东西是“不在乎”的,比如回信地址)


这就是你今天将从我这里得到的所有善举!:-p

你需要操纵调用方的堆栈帧(
main()
),并以这样的方式安排它,即从溢出的
受害者函数()的尾声返回到
shell\u call()
main调用后,后者可以找到一个固定的堆栈


在执行此操作时,您可能必须损坏受害者stackframe中的帧指针,该指针将在%ebp中通过
leave

恢复。SoapBox在引导您正确方向方面做了大量工作

了解更多信息;

请注意,这是缓冲区溢出,而不是堆栈溢出。@Greg Rogers实际上是的,这是堆栈溢出。事实上,此应用程序中没有使用堆。@Rook:缓冲区在堆栈上。但缓冲区溢出是漏洞。堆栈溢出不可利用,否则地球上的每个XML解析器都会受到攻击;)@Rook:堆栈溢出意味着耗尽堆栈空间,例如无限递归,不可利用。这里的堆栈中存在缓冲区溢出。它的名称类似,但完全不同。:)哇,我利用了缓冲区溢出,我不知道你刚才说了什么。@Rook看起来像@Nicola使用了其中一个风扇cy马尔可夫链文本生成器内容。:P