我试图学习逆向工程技术,如果我遗漏任何事情,请提前道歉
我试图在反汇编代码的以下部分中找到密码(如果需要包含其他代码块,还有其他代码块)
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
push esi
push ebx
sub esp, 158h
mov eax, [ebp+arg_4]
mov [esp+1Ch], eax
mov eax, large gs:14h
mov [esp+14Ch], eax
xor eax, eax
mov dword ptr [esp+2Eh], 74726170h
mov word ptr [esp+32h], 32h
mov dword ptr [esp+141h], 32656854h
mov dword ptr [esp+145h], 6150646Eh
mov word ptr [esp+149h], 7472h
mov byte ptr [esp+14Bh], 0
mov dword ptr [esp+4], offset aPassword ; "password:\n"
mov dword ptr [esp], offset _ZSt4cout ; std::cout
call __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc ; std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const*)
mov dword ptr [esp+8], 100h ; int
lea eax, [esp+41h]
mov [esp+4], eax ; char *
mov dword ptr [esp], offset _ZSt3cin ; this
call __ZNSi3getEPci ; std::istream::get(char *,int)
lea eax, [esp+40h]
mov [esp], eax
call __ZNSaIcEC1Ev ; std::allocator<char>::allocator(void)
lea eax, [esp+40h]
mov [esp+8], eax
mov dword ptr [esp+4], offset aThisisnotthepa ; "thisisnotthepassword"
lea eax, [esp+38h]
mov [esp], eax
call __ZNSsC1EPKcRKSaIcE ; std::string::string(char const*,std::allocator<char> const&)
lea eax, [esp+40h]
mov [esp], eax
call __ZNSaIcED1Ev ; std::allocator<char>::~allocator()
mov dword ptr [esp+8], 3E8h ; n
lea eax, [esp+41h]
mov [esp+4], eax ; s2
mov dword ptr [esp], offset s1 ; "FBQ2GE9"
call _strncmp
test eax, eax
jnz short loc_8048A74
如果比较成功,则密码正确
我当时认为它应该是FBQ2GE9
,但这显然是错误的答案。我在这里缺少什么?
答案 0 :(得分:2)
strncmp在最后一行,比较&#34;输入&#34;从字符串&#34; FBQ2GE9&#34;,它与C输入中的strncmp(&#34; FBQ2GE9&#34;,输入,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调试器跟踪这将大大简化此检查