覆盖c中main的返回地址

时间:2018-06-19 16:58:56

标签: security

我正在尝试对用C编写的程序执行缓冲区溢出攻击,我正在使用GNU / Linux(Ubuntu 16.04 LTS)。 这是源代码:

#include<stdio.h>
void CALLME(){
    puts("successful!");
}
int main(void){
    char s[16];
    scanf("%s",s);
}

我想做的是覆盖main的返回地址,以便在main函数之后执行CALLME函数。 我用

编译程序
gcc -m32 -fno-stack-protector -o prog prog.c

使用命令:

nm prog | grep CALLME 

我收到了CALLME的地址:0804845b

在gdb中反汇编main我发现:在main函数中,返回地址位于8(%ebp),字符串s的地址位于-0x18(%ebp)。所以区别是0x8 + 0x18 = 32

我尝试利用:

perl -e'打印“ a” x 32。 “ \ x5b \ x84 \ x04 \ x08”'| ./main

它不起作用。

Segmentation fault (core dumped)

为什么?主要功能更特别吗?因为在具有类似漏洞的其他功能(我制造的)中它起作用吗?

注意:我不考虑ASLR,有人说只有当我编译gcc -pie ...和其他东西时,这种情况才会发生。

0 个答案:

没有答案