在反汇编代码中查找密码

Finding password in disassembled code

我正在努力学习逆向工程技术,如有遗漏请提前致歉

我正在尝试在下面的反汇编代码部分中找到密码(还有其他代码块,以防这些代码也需要包含在内)

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

strncmp 在最后一行,比较字符串 "FBQ2GE9" 中的 "input",就像 C 中的 strncmp("FBQ2GE9", input, 1000) input 来自 std::istream::get(char *,int),它基本上是从第一个参数的地址中提取一个字符串。

因为这个二进制文件是 ELF,不能使用调试器导致 OS 约束,假设你知道你想改变的分支在哪里,检查 dword ptr [esp] 的内容(如下所示)和偏移量 s1,在调用 strncmp 调用之前,您必须 trace/monitor 通过检查这些内存地址来生成这些数据的方式。

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

有人告诉我您的输入被操纵,因此输入 FBQ2GE9 将打印不正确。使用您的 ELF 调试器进行跟踪将大大简化此检查