gpt4 book ai didi

C 缓冲区溢出导致段错误

转载 作者:行者123 更新时间:2023-11-30 20:17:12 25 4
gpt4 key购买 nike

我正在尝试为我的安全类执行缓冲区溢出,我们不允许调用任何函数,并且我们需要跳转到 secret 函数并且还返回 0 而没有段错误。我编写了下面的代码并成功跳转到 secret ,但我遇到了段错误。如何才能成功终止程序呢?或者是否可以只写入单个地址而不是 for 循环,当我尝试时它没有改变任何内容。

#include <stdio.h>

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

void entrance()
{
int doNotTouch[10];
// can only modify this section BEGIN
// cant call secret(), maybe use secret (pointer to function)
for (int i = 0; i < 14; i++) {
*(doNotTouch + i) = (int) &secret;
}
// can only modify this section END
printf("now inside entrance()!\n");
}

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

最佳答案

在某些半汇编程序中,假设某种 x86。 (BP 是 EBP 或 RBP 的伪代码,假设您实际上不是针对 16 位模式进行编译。32 位模式很可能是这样 int 与返回地址的宽度相同。)

; entrance:
; - stack has return address to main
push bp ; decrement SP by a pointer width
mov bp,sp
sub sp, 10*sizeof(int) ; reserve space for an array
;....
; doNotTouch[0] is probably at [bp - 10*sizeof(int)]

当你循环到14时,你首先覆盖i==10处保存的bp,然后覆盖main的返回地址(这是正确的),然后覆盖更多的地址,最终导致seg错误。因此,您只需要执行 *(doNotTouch + 11) = (int) &secret; - 假设 int 是函数指针的大小。 (或者,如果编译器为堆栈对齐或其自身使用留下了间隙,则需要多一点。在调试版本中,其他本地变量将具有堆栈槽。覆盖它们可能会导致超出范围的无限循环。)

然后跟随你的 printf,然后函数返回,但它不会返回到 main 而是“跳转”到 secret

secret返回时,它实际上是从main返回,但它无法执行return 0;

所以 secret 应该是:

int secret()
{
printf("now inside secret()!\n");
return 0;
}

免责声明:“......我认为。”

关于C 缓冲区溢出导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58473294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com