[英]Differences in disassembling 32 bit and 64bit
我从逆向工程开始了我的冒险,但我有一些从一开始就无法解决的问题。 我正在关注 YT 上的教程,但我遇到了一些差异。 因此,当我使用教程中的这段代码时:
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
但是当我使用gcc -g -z execstack -fno-stack-protector
在 32 位虚拟机上编译我的程序并得到如下结果时:
当我使用gcc -g -z execstack -fno-stack-protector -m32
在 64 位虚拟机上编译相同的 cod 时,我得到了相同的结果。 但是,如果我使用gcc -g -z execstack -fno-stack-protector
编译它,我会得到如下结果:
所以它看起来像教程中的屏幕截图,但它是 64 位版本。 所以我的问题是,我做错了什么还是我应该改变什么? 我不知道我是否应该学习使用 64 位系统或找到修复 32 位系统的方法。 任何人都可以帮助我吗?
对于 x86 和 x64,您不需要两台不同的虚拟机,只需为 x64 制作一台,您就可以同时执行 x86 和 x64 二进制文件。
您可能想找到提供二进制文件的教程,这样您就不必弄乱编译器标志。 程序集不同的原因是因为不同的编译器版本和设置。 您可以尝试禁用优化,但有时会浪费时间,最好找到提供二进制文件的教程。
您的漏洞利用必须针对您的二进制文件量身定制,而不是教程中的不同二进制文件。
最值得注意的是,在您的示例中,本地堆栈帧的大小在第二个屏幕截图中为 0x200,但在原始屏幕截图中为 0x1F4。
您需要对齐您的 shellcode 以匹配放大的堆栈框架的布局。
使用试错法编写各种长度的'aaaaaaaaaaaaaaaaaaa'并检查内存以查看它的位置
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.