在反汇编代码中查找密码
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 调试器进行跟踪将大大简化此检查
我正在努力学习逆向工程技术,如有遗漏请提前致歉
我正在尝试在下面的反汇编代码部分中找到密码(还有其他代码块,以防这些代码也需要包含在内)
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 调试器进行跟踪将大大简化此检查