- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
别担心,我不会问答案。
我试图在一个简单的 1 函数 32 位 exe 中找到隐藏的字符串(也许是电子邮件?)
我已经在文件上运行了字符串,没有任何用处。
我已经将文件反编译为 ASCII 并找到了主要函数。
文件显示它是 GCC 可执行文件。
这是主要功能的汇编:
; ================ B E G I N N I N G O F P R O C E D U R E ================
; Variables:
; arg_0: int, 4
main:
080489cc lea ecx, dword [esp+arg_0] ; Begin of unwind block (FDE at 0x80d6cb8), DATA XREF=_start+23
080489d0 and esp, 0xfffffff0
080489d3 push dword [ecx-4]
080489d6 push ebp
080489d7 mov ebp, esp
080489d9 push esi
080489da push ebx
080489db push ecx
080489dc sub esp, 0x2c
080489df call __x86.get_pc_thunk.cx ; __x86.get_pc_thunk.cx
080489e4 add ecx, 0xa261c
080489ea mov eax, dword [gs:0x14]
080489f0 mov dword [ebp-0x1c], eax
080489f3 xor eax, eax
080489f5 mov eax, esp
080489f7 mov esi, eax
080489f9 mov dword [ebp-0x2c], 0x15
08048a00 mov eax, dword [ebp-0x2c]
08048a03 lea edx, dword [eax-1]
08048a06 mov dword [ebp-0x28], edx
08048a09 shl eax, 0x2
08048a0c lea edx, dword [eax+3]
08048a0f mov eax, 0x10
08048a14 sub eax, 0x1
08048a17 add eax, edx
08048a19 mov ebx, 0x10
08048a1e mov edx, 0x0
08048a23 div ebx
08048a25 imul eax, eax, 0x10
08048a28 sub esp, eax
08048a2a mov eax, esp
08048a2c add eax, 0x3
08048a2f shr eax, 0x2
08048a32 shl eax, 0x2
08048a35 mov dword [ebp-0x24], eax
08048a38 mov eax, dword [ebp-0x24]
08048a3b mov dword [eax], 0x2391
08048a41 mov eax, dword [ebp-0x24]
08048a44 mov dword [eax+4], 0x239d
08048a4b mov eax, dword [ebp-0x24]
08048a4e mov dword [eax+8], 0x239d
08048a55 mov eax, dword [ebp-0x24]
08048a58 mov dword [eax+0xc], 0x2399
08048a5f mov eax, dword [ebp-0x24]
08048a62 mov dword [eax+0x10], 0x239c
08048a69 mov eax, dword [ebp-0x24]
08048a6c mov dword [eax+0x14], 0x2363
08048a73 mov eax, dword [ebp-0x24]
08048a76 mov dword [eax+0x18], 0x2358
08048a7d mov eax, dword [ebp-0x24]
08048a80 mov dword [eax+0x1c], 0x2358
08048a87 mov eax, dword [ebp-0x24]
08048a8a mov dword [eax+0x20], 0x2390
08048a91 mov eax, dword [ebp-0x24]
08048a94 mov dword [eax+0x24], 0x2398
08048a9b mov eax, dword [ebp-0x24]
08048a9e mov dword [eax+0x28], 0x2398
08048aa5 mov eax, dword [ebp-0x24]
08048aa8 mov dword [eax+0x2c], 0x2357
08048aaf mov eax, dword [ebp-0x24]
08048ab2 mov dword [eax+0x30], 0x2390
08048ab9 mov eax, dword [ebp-0x24]
08048abc mov dword [eax+0x34], 0x2395
08048ac3 mov eax, dword [ebp-0x24]
08048ac6 mov dword [eax+0x38], 0x2358
08048acd mov eax, dword [ebp-0x24]
08048ad0 mov dword [eax+0x3c], 0x2377
08048ad7 mov eax, dword [ebp-0x24]
08048ada mov dword [eax+0x40], 0x235e
08048ae1 mov eax, dword [ebp-0x24]
08048ae4 mov dword [eax+0x44], 0x2380
08048aeb mov eax, dword [ebp-0x24]
08048aee mov dword [eax+0x48], 0x237a
08048af5 mov eax, dword [ebp-0x24]
08048af8 mov dword [eax+0x4c], 0x2381
08048aff mov eax, dword [ebp-0x24]
08048b02 mov dword [eax+0x50], 0x23a3
08048b09 mov eax, dword [ebp-0x2c]
08048b0c sub esp, 0xc
08048b0f push eax ; argument #1 for method __libc_malloc
08048b10 mov ebx, ecx
08048b12 call __libc_malloc ; __libc_malloc
08048b17 add esp, 0x10
08048b1a add eax, 0x1
08048b1d mov dword [ebp-0x20], eax
08048b20 mov dword [ebp-0x30], 0x0
08048b27 jmp loc_8048b44
第 08048a35 - 08048b09 行看起来一次移动 1 个字符,我确定它是字符串。
这里的问题是,有人可以帮我弄清楚这些字符是什么吗?它们不是 ASCII 编码,而且我不确定 ASM 是如何真正进行字符编码之类的操作的,所以也许我只是没有看到它。也许它被加密了?
我是新手,并不知道最好的方法。谢谢!
最佳答案
顺序
08048a38 mov eax, dword [ebp-0x24]
08048a3b mov dword [eax], 0x2391
08048a41 mov eax, dword [ebp-0x24]
08048a44 mov dword [eax+4], 0x239d
(依此类推)正在 32 位整数数组中的连续位置写入 0x2391、0x239d,...(请参阅间隔为 4 字节的连续偏移)其指针作为参数传递(加载指针值- 每次都莫名其妙 - 从 ebp 减去 一些东西)。最终其内容将是:
0x2391
0x239d
0x239d
0x2399
0x239c
0x2363
0x2358
0x2358
0x2390
0x2398
0x2398
0x2357
0x2390
0x2395
0x2358
0x2377
0x235e
0x2380
0x237a
0x2381
0x23a3
现在,这不是 ASCII,但是第二个和第三个元素的重复(加上后面的其他重复)以及它们几乎都在同一范围内的事实让我认为它们必须全部编码为同样简单的方法,大概是求和或具有某个固定值的异或(始终相同的顶部 0x23 字节是一个死赠品);因此,由于您的问题中缺少其余代码(大概是解码此数组的地方),我只是猜测并尝试将相同的值减去它们,以使它们返回到 ASCII 范围。
我的第一个猜测是上面重复的数字 (0x239d) 必须是 l
(在英语中通常成对出现)。因此,我需要一个数字,使 0x239d 成为 l
(ASCII 108); 0x239d - 108 = 9009,这就是我减去每个字符的结果。结果全是 ASCII(令人鼓舞 - 如果方案更复杂,除了两个 l
之外我会得到不可读的随机垃圾),但是荒谬。
我选择了一种蛮力方法(最合理的情况只有 62 个——大写、小写和数字——用这种方法进行的详尽搜索最多是 256 个情况,通过目视检查仍然可以管理)并尝试了一些类似的数字- 所有导致 ASCII 字符的内容,但希望更明智。
确实,一旦我到达 9001:
In [18]: [chr(int(x,16)-9001) for x in s.split()]
Out[18]:
['h',
't',
't',
'p',
's',
':',
'/',
'/',
'g',
'o',
'o',
'.',
'g',
'l',
'/',
'N',
'5',
'W',
'Q',
'X',
'z']
(s
这里是一个字符串,包含了本文第二个代码块的内容,也就是所有数组值的那个)
在游戏的下一关中尽情享受吧。 :-)
顺便说一下,那个集会真的很糟糕。其中一些,例如继续从堆栈重新加载相同的值到寄存器
mov eax, dword [ebp-0x24]
会让我考虑一个非优化的、调试器友好的构建; OTOH,有些东西似乎并不是来自编译器:
mov eax, 0x10
sub eax, 0x1
这里即使以适度的优化常量传播级别进行编译也会产生 mov eax, 0xf
,或者,在 -O0
处,它会在堆栈上执行,而不是在寄存器中,以帮助源代码级单步执行。
mov ebx, 0x10
mov edx, 0x0
div ebx
imul eax, eax, 0x10
这在多个层面上都是脑死亡;你永远不会看到编译器发出 mov edx, 0x0
一般 - 即使在 -O0
时,寄存器清零也几乎总是 xor edx, edx
.此外,数据类型存在一些混淆:首先是未签名的 div
,然后是已签名的 imul
(它映射到类似 ((int)((unsigned )(foo)/16))*16
,我觉得不太可能)。
但最重要的是,gcc 永远不会发出 div
或 mul
以除以/乘以 16; it transforms them to a shift even at -O0
; clang is the same (尽管在 -O0
时,它仍会为有符号除法发出 idiv
,而不是在更高优化级别上使用的 shift + sign-bit twiddling)。
最后,如果输入值是无符号的(根据 div
),这整个事情归结为屏蔽掉低 4 位,所以所有这些困惑可能只是和 eax,0xfffffff0
。
所以,在我看来,这是一个不太懂汇编的人手写的代码;这种事情甚至看起来都不是为了使反汇编更难而“故意困难” - 代码非常简单,只是非常幼稚。
关于assembly - 试图在 32 位 ELF 中找到隐藏的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50242769/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!