Assembly 在反汇编代码中查找密码

Assembly 在反汇编代码中查找密码,assembly,x86,disassembly,ida,Assembly,X86,Disassembly,Ida,我正在努力学习逆向工程技术,如果我遗漏了什么,我会提前道歉 我试图在反汇编代码的下一节中找到密码(如果需要包含其他代码块,也会有其他代码块) 推ebp 电动汽车 和esp,0fffff0h 推动esi 推ebx 副esp,158h mov eax,[ebp+arg_4] mov[esp+1Ch],eax mov eax,大型gs:14h mov[esp+14Ch],eax 异或eax,eax 莫夫·德沃德ptr[esp+2Eh],74726170小时 移动字ptr[esp+32h],32h 莫夫

我正在努力学习逆向工程技术,如果我遗漏了什么,我会提前道歉

我试图在反汇编代码的下一节中找到密码(如果需要包含其他代码块,也会有其他代码块)

推ebp
电动汽车
和esp,0fffff0h
推动esi
推ebx
副esp,158h
mov eax,[ebp+arg_4]
mov[esp+1Ch],eax
mov eax,大型gs:14h
mov[esp+14Ch],eax
异或eax,eax
莫夫·德沃德ptr[esp+2Eh],74726170小时
移动字ptr[esp+32h],32h
莫夫德沃德ptr[esp+141h],32656854小时
mov dword ptr[esp+145h],6150646Eh
移动字ptr[esp+149h],7472h
mov字节ptr[esp+14Bh],0
mov dword ptr[esp+4],偏移量密码;“密码:\n”
mov dword ptr[esp],偏移量ZSt4cout;标准::cout

调用uuu ZStlsISt11char u traitsicers13basic u ostreamIcT u ES5 u PKc;std::operatorstrncmp在最后一行,比较字符串“FBQ2GE9”中的“input”,类似于C input中的strncmp(“FBQ2GE9”,input,1000)来自std::istream::get(char*,int)的输出字符串,后者基本上从其第一个参数的地址提取字符串

由于此二进制文件是ELF,因此无法使用调试器,因为存在OS约束,如果您知道要更改的分支的位置,请检查dword ptr[esp](如下所示)和偏移量s1的内容,在调用strncmp调用之前,您必须通过检查这些内存地址来跟踪/监视这些数据是如何生成的

mov     dword ptr [esp], offset s1 ; "FBQ2GE9"
call    _strncmp
test    eax, eax

有些东西告诉我你的输入被操纵了,所以输入FBQ2GE9将打印不正确。使用ELF调试器跟踪这一点将大大简化此检查

这有点有趣,
cin
位于
esp+41h
,而
std::allocator
实例位于
esp+40h
(没有意义,所以我可能误解了该代码)?然后
std::string(const char*,allocator)
esp+38h上运行(输入前9个字节)。。。如果没有调试器,我无法理解它的意义,因为这可能会以某种方式覆盖输入的字符串(取决于分配器构造函数+析构函数和字符串构造函数中的代码)?或者我就是不明白。也许密码是“FBQ2GE9”?(当然不是,因为“notpassword”字符串也有一些函数)@Ped7g是无状态的,因此它没有成员。在C++空中,对象需要至少有1个大小(在这种情况下正好是1)。因此,分配器实例不会覆盖输入字符串。我投票将此问题作为主题外的问题结束,因为它确实属于反向工程堆栈()当然,我将其上载到了这里:我确实尝试过,但这不是密码,这是不正确的
mov     dword ptr [esp], offset s1 ; "FBQ2GE9"
call    _strncmp
test    eax, eax