如何跳过在C中执行缓冲区溢出的行

Per*_*rcy 12 c cracking buffer-overflow

我想跳过C中的一行x=1;,主要部分中的行使用bufferoverflow; 但是,我不知道为什么我不能跳过的地址4002f4下一个地址4002fb尽管如此,我就指望7个字节形式的事实<main+35><main+42>.

我还在Debian和AMD环境中配置了randomniZation和execstack环境的选项,但我还是得到了x=1;.这个程序有什么问题?

我用dba来调试堆栈和内存地址:

0x00000000004002ef <main+30>:    callq  0x4002a4 **<function>**  
**0x00000000004002f4** <main+35>:    movl   $0x1,-0x4(%rbp)  
**0x00000000004002fb** <main+42>:    mov    -0x4(%rbp),%esi  
0x00000000004002fe <main+45>:    mov    $0x4629c4,%edi  

void function(int a, int b, int c)  
{
  char buffer[5];
  int *ret;

  ret = buffer + 12;
  (*ret) += 8; 
}

int main()
{
   int x = 0; 
   function(1, 2, 3);
   x = 1;
   printf("x = %i \n", x);  
   return 0;  
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*lph 2

您在这里所做的事情似乎与经典的缓冲区溢出攻击没有太大关系。缓冲区溢出攻击的整个思想是修改“function”的返回地址。反汇编程序将显示ret指令(假设为 x86)从何处获取其地址。这是您需要修改以指向 的内容main+42

我假设您想在此处显式引发缓冲区溢出,通常您需要通过操作“函数”的输入来引发它。

通过声明 abuffer[5]您正在将堆栈指针移向错误的方向(通过查看生成的程序集来验证这一点),返回地址位于堆栈内部更深处的某个位置(它是由调用指令放置在那里的)。在 x86 中,堆栈向下增长,即向较低的地址增长。

我将通过声明 anint*并将其向上移动直到到达返回地址已被推送的指定地址来解决此问题,然后修改该值以指向main+42并让 function ret