【发布时间】:2019-04-15 12:40:19
【问题描述】:
我从逆向工程开始了我的冒险,但我遇到了一些从一开始就无法解决的问题。我正在关注 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 位虚拟机上编译我的程序并得到如下结果时:
当我在 64 位虚拟机上使用 gcc -g -z execstack -fno-stack-protector -m32 编译相同的代码时,我得到了相同的结果。但是,如果我用gcc -g -z execstack -fno-stack-protector 编译它,我会得到这样的结果:
所以它看起来像教程中的屏幕截图,但它是 64 位版本。所以我的问题是,我做错了什么还是我应该改变什么?我不知道我是否应该学习使用 64 位系统或找到修复 32 位系统的方法。谁能帮帮我?
【问题讨论】:
-
试试
-no-pie -
对
get_pc_thunk的调用告诉它与位置无关的代码according to this answer,因此可能是它不同的原因。在编译器中使用-no-pie禁用此功能可能会使它们看起来更相似。此外,优化器以神秘的方式工作,使用-O0禁用它也可以帮助您在代码转换为汇编后识别它。 -
但是你知道我之前的问题,可能是我的有效载荷不起作用的情况吗?还是只是表象,与shellcode和内存无关?
-
只要
eip/rip将函数的ret地址改写为shellcode的地址或之前的\x90,shellcode就可以工作了。跨度> -
函数的
ret地址,在使用__cdecl(C语言的默认调用约定)实现的任何函数中,地址为ebp-4(32位)或rbp-8(64 位)。
标签: c reverse-engineering disassembly