我正在尝试对用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 ...和其他东西时,这种情况才会发生。