我正在学习缓冲区溢出,我在利用基于堆栈的缓冲区溢出方面遇到了问题。 这是我的计划:
#include <stdio.h>
void func(){
printf("asd");
}
main(){
char buf[10];
scanf("%s", &buf);
}
我用A(缓冲区和旧EIP地址)覆盖前14个字节。我的目标是执行func函数,或者用它的地址更改EIP。但我总是得到非法指令。我检查了函数的HEX地址;我以相反的顺序写了它们,它们是正确的。
答案 0 :(得分:0)
你必须在汇编程序中查看已编译的代码,例如 你的main()可能看起来像:
char buf[10];
scanf("%s", &buf);
00D7B938 mov esi,esp
00D7B93A lea eax,[ebp-14h]
00D7B93D push eax
00D7B93E push offset string "%s" (0D818D4h)
00D7B943 call dword ptr [__imp__scanf (0D89684h)]
您必须进行调试以查看此时堆栈上的实际内容,例如如果你正在编译调试,很可能在堆栈上的数量比你想象的还要多!