小编sha*_*ank的帖子

使用堆栈粉碎删除指令

我一直试图通过堆栈粉碎更改返回地址来跳过指令.以下代码跳过main中的++并输出"1 3"的输出.我已经在32位英特尔机器上执行了这段代码.

#include<stdio.h>
void fun(int a,int b) {
    // buffer
    char buf[8];
    char *p;
    p = (char *)buf+24;
    *p=*p+5;
    return;
}

int main() {
    int a=1,b=2;
    fun(a,b);
    a++;
    b++;
    printf("%d %d",a,b);
 }
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么返回地址存储在距buf起始地址24字节的位移处.我尝试在不同的32位英特尔机器上执行相同的代码,我不得不使用20字节而不是24字节的位移.我已将我的理解放在下图中.我不确定是什么填补了"?"所代表的差距.在图中.gcc是否存在任何金丝雀价值或者我错过了什么?

链接到图:http://www.cse.iitb.ac.in/~shashankr/stack.png

粉碎堆栈example3.c混乱问了同样的问题,但无法解释一般的置换原因.

下图给出了通过在函数中放置断点获得的堆栈的视图.

堆栈内容http://www.cse.iitb.ac.in/~shashankr/stack4.png

以下是main和fun的汇编代码:

 Dump of assembler (fun):
 0x08048434 <+0>:   push   %ebp
 0x08048435 <+1>:   mov    %esp,%ebp
 0x08048437 <+3>:   sub    $0x18,%esp
 0x0804843a <+6>:   mov    %gs:0x14,%eax
 0x08048440 <+12>:  mov    %eax,-0xc(%ebp)
 0x08048443 <+15>:  xor    %eax,%eax
 0x08048445 <+17>:  lea    -0x14(%ebp),%eax
 0x08048448 <+20>:  add    $0x18,%eax
 0x0804844b <+23>: …
Run Code Online (Sandbox Code Playgroud)

c stack buffer-overflow stack-smash

5
推荐指数
1
解决办法
489
查看次数

标签 统计

buffer-overflow ×1

c ×1

stack ×1

stack-smash ×1