Reversing Tools & Basic Methods
最后更新于
最后更新于
Try Hard Security Group
软件:
ReverseKit: https://github.com/zer0condition/ReverseKit
在线工具:
使用https://webassembly.github.io/wabt/demo/wasm2wat/index.html将wasm(二进制)反编译为wat(明文)
使用https://webassembly.github.io/wabt/demo/wat2wasm/将wat编译为wasm
您也可以尝试使用https://wwwg.github.io/web-wasmdec/进行反编译
软件:
dotPeek是一个反编译器,可以反编译和检查多种格式,包括库(.dll)、Windows元数据文件(.winmd)和可执行文件(.exe)。反编译后,一个程序集可以保存为Visual Studio项目(.csproj)。
这里的优点是,如果需要从旧程序集中恢复丢失的源代码,此操作可以节省时间。此外,dotPeek提供了方便的导航功能,使其成为Xamarin算法分析的完美工具之一。
借助全面的插件模型和API,.NET Reflector可以节省时间并简化开发。让我们看看这个工具提供的众多逆向工程服务:
提供数据如何在库或组件中流动的见解
提供.NET语言和框架的实现和使用见解
查找未记录和未公开的功能,以充分利用所使用的API和技术。
查找依赖项和不同的程序集
追踪代码中所有.NET代码的源代码的确切位置。
Visual Studio Code的ILSpy插件:您可以在任何操作系统中使用它(您可以直接从VSCode安装,无需下载git。点击Extensions,然后搜索ILSpy)。 如果您需要反编译,修改和重新编译,可以使用dnSpy或其积极维护的分支dnSpyEx。(右键单击 -> 修改方法**来更改函数内部的内容)。
为了让DNSpy在文件中记录一些信息,您可以使用以下代码片段:
要使用DNSpy调试代码,您需要:
首先,更改与调试相关的程序集属性:
至:
然后点击编译:
然后通过 文件 >> 保存模块... 保存新文件:
这是必要的,因为如果不这样做,在运行时会对代码应用几个优化,可能会导致在调试时断点永远不会触发或一些变量不存在。
然后,如果您的.NET应用程序正在由IIS运行,您可以使用以下方法重新启动它:
然后,为了开始调试,您应该关闭所有已打开的文件,并在调试选项卡中选择附加到进程...:
然后选择w3wp.exe以附加到IIS服务器,并单击附加:
现在我们正在调试该进程,是时候停止它并加载所有模块了。首先单击 调试 >> 中断所有,然后单击 调试 >> 窗口 >> 模块:
单击模块中的任何模块,然后选择打开所有模块:
右键单击程序集资源管理器中的任何模块,然后单击排序程序集:
https://github.com/skylot/jadx https://github.com/java-decompiler/jd-gui/releases
加载rundll32(64位位于C:\Windows\System32\rundll32.exe,32位位于C:\Windows\SysWOW64\rundll32.exe)
选择Windbg调试器
选择“在库加载/卸载时暂停”
配置执行的参数,放入DLL的路径和要调用的函数:
然后,当您开始调试时,每次加载DLL时执行将会停止,然后当rundll32加载您的DLL时,执行将会停止。
但是,如何查看已加载的DLL的代码呢?使用这种方法,我不知道。
加载rundll32(64位位于C:\Windows\System32\rundll32.exe,32位位于C:\Windows\SysWOW64\rundll32.exe)
更改命令行( 文件 --> 更改命令行 )并设置dll的路径和要调用的函数,例如:“C:\Windows\SysWOW64\rundll32.exe” “Z:\shared\Cybercamp\rev2\\14.ridii_2.dll”,DLLMain
更改 选项 --> 设置 并选择“DLL入口”。
然后开始执行,调试器将在每个dll主函数处停止,最终您将停在您的dll的dll入口。从那里,只需搜索要设置断点的位置。
请注意,当win64dbg由于任何原因停止执行时,您可以看到您正在查看的代码位于win64dbg窗口顶部:
然后,查看此内容,您可以看到执行已在您要调试的dll中停止。
Cheat Engine是一个有用的程序,可用于查找运行游戏内存中保存的重要值并更改它们。更多信息请参见:
Cheat EnginePiNCE是GNU Project Debugger(GDB)的前端/逆向工程工具,专注于游戏。但是,它也可用于任何逆向工程相关的内容。
Decompiler Explorer是一种连接多个反编译器的Web前端。此Web服务可让您比较不同反编译器在小型可执行文件上的输出。
Blobrunner将在内存空间中分配shellcode,并将向您指示shellcode分配的内存地址,然后将停止执行。 然后,您需要将调试器(Ida或x64dbg)附加到进程,并在指示的内存地址处设置断点,然后恢复执行。这样您就可以调试shellcode了。
发布的github页面包含包含编译版本的zip文件:https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5 您可以在以下链接中找到Blobrunner的稍作修改的版本。为了编译它,只需在Visual Studio Code中创建一个C/C++项目,复制并粘贴代码,然后构建。
Blobrunnerjmp2it 与blobrunner非常相似。它将在内存空间中分配shellcode,并启动一个永久循环。然后,您需要将调试器附加到进程,开始等待2-5秒然后停止,您将发现自己处于永久循环中。跳转到永久循环的下一条指令,因为它将是对shellcode的调用,最终您将发现自己正在执行shellcode。
您可以在发布页面中下载jmp2it的编译版本。
Cutter是radare的GUI。使用Cutter,您可以动态地模拟和检查shellcode。
请注意,Cutter允许您“打开文件”和“打开Shellcode”。在我的情况下,当我将shellcode作为文件打开时,它正确反编译了,但当我将其作为shellcode打开时,它没有:
为了从您想要的位置开始模拟,设置一个断点,显然Cutter将自动从那里开始模拟:
您可以在十六进制转储中查看堆栈,例如:
您应该尝试scdbg。 它将告诉您shellcode正在使用的哪些函数,以及shellcode是否在内存中解码自身。
scDbg还配备了一个图形启动器,您可以在其中选择所需的选项并执行shellcode
创建Dump选项将在内存中动态更改shellcode时转储最终shellcode(可用于下载解码后的shellcode)。起始偏移量对于在特定偏移处启动shellcode很有用。调试Shell选项可用于使用scDbg终端调试shellcode(但我发现前面解释的任何选项对于这个问题都更好,因为您可以使用Ida或x64dbg)。
将您的shellcode文件上传为输入,并使用以下配方对其进行反编译:https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)
这个混淆器修改所有mov
指令(是的,非常酷)。它还使用中断来改变执行流。有关其工作原理的更多信息:
如果您很幸运,demovfuscator将对二进制文件进行反混淆。它有几个依赖项
并安装keystone (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install
)
如果你在玩一个CTF,这个绕过方法找到flag可能非常有用: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html
要找到入口点,搜索函数::main
,如下所示:
在这种情况下,二进制文件被称为authenticator,所以很明显这是一个有趣的主函数。 有了被调用的函数的名称,搜索它们在互联网上了解它们的输入和输出。
对于Delphi编译的二进制文件,你可以使用https://github.com/crypto2011/IDR
如果你需要反向一个Delphi二进制文件,我建议你使用IDA插件https://github.com/Coldzer0/IDA-For-Delphi
只需按下ATL+f7(在IDA中导入Python插件)并选择Python插件。
这个插件将在调试开始时执行二进制文件并动态解析函数名称。开始调试后再次按下开始按钮(绿色按钮或f9),断点将在真正代码的开头命中。
这也非常有趣,因为如果你在图形应用程序中按下一个按钮,调试器将停在被该按钮执行的函数中。
如果你需要反向一个Golang二进制文件,我建议你使用IDA插件https://github.com/sibears/IDAGolangHelper
只需按下ATL+f7(在IDA中导入Python插件)并选择Python插件。
这将解析函数的名称。
在这个页面上,你可以找到如何从一个ELF/EXE Python编译的二进制文件中获取Python代码:
Decompile compiled python binaries (exe, elf) - Retreive from .pyc如果你得到一个GBA游戏的二进制文件,你可以使用不同的工具来模拟和调试它:
no$gba (下载调试版本) - 包含一个带界面的调试器
mgba - 包含一个CLI调试器
gba-ghidra-loader - Ghidra插件
GhidraGBA - Ghidra插件
在no$gba中,在_Options --> Emulation Setup --> Controls_** **你可以看到如何按下Game Boy Advance的按钮
按下时,每个键都有一个值来识别它:
因此,在这种程序中,有趣的部分将是程序如何处理用户输入。在地址0x4000130中,您将找到常见的函数:KEYINPUT。
在上图中,您可以发现该函数是从FUN_080015a8(地址:0x080015fa 和 0x080017ac)调用的。
在该函数中,在一些初始化操作之后(没有任何重要性):
发现了这段代码:
最后的if语句检查**uVar4
是否在最后的Keys中,而不是当前的密钥,也称为释放按钮(当前密钥存储在uVar1
**中)。
在前面的代码中,您可以看到我们正在将uVar1(按下按钮的值所在的位置)与一些值进行比较:
首先,它与值4(SELECT按钮)进行比较:在挑战中,此按钮清除屏幕
然后,将其与值8(START按钮)进行比较:在挑战中,这检查代码是否有效以获取标志。
在这种情况下,将变量**DAT_030000d8
**与0xf3进行比较,如果值相同,则执行一些代码。
在任何其他情况下,将检查一些cont(DAT_030000d4
)。这是一个cont,因为在输入代码后立即加1。
如果小于8,则执行涉及**向**DAT_030000d8
**添加值的操作(基本上是将按下的键的值添加到此变量中,只要cont小于8)。
因此,在这个挑战中,了解按钮的值,您需要按下长度小于8的组合,使得结果相加为0xf3。
本教程的参考资料: https://exp.codes/Nostalgia/
https://github.com/malrev/ABD(二进制反混淆)
Try Hard Security Group