在反汇编代码中查找密码

时间:2016-07-26 15:31:47

标签: assembly x86 disassembly ida

我试图学习逆向工程技术,如果我遗漏任何事情,请提前道歉

我试图在反汇编代码的以下部分中找到密码(如果需要包含其他代码块,还有其他代码块)

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,但这显然是错误的答案。我在这里缺少什么?

1 个答案:

答案 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调试器跟踪这将大大简化此检查