我在以前讲过几篇shellcode调试的文章,有《汇编:定位 EIP/RIP》《如何调试shellcode》《识别和分析 shellcode的一些方法》等。这篇文章也是和shellcode有关,这次我们结合Frida来看看效果。
一、思路
.用工具RunShell加载起来shellcode,但不执行;
.将Frida附加到工具进程中,Frida 将允许我们在不修改代码的情况下拦截 Win32 API。
工具及shellcode放在文后的网盘中供下载。
二、安装Frida
安装12.8.0版本,虽然不是最新的,但稳定。
python3 -m pip install frida==12.8.0
python3 -m pip install frida-tools==5.3.0
三、过程
打开RunShell64加载“x64-ret.bin”Shellcode文件,点击“Run”命令并不要确认运行Shellcode。
然后打开命令提示符并将Frida附加到RunShell64进程ID (-p),指示该工具包含MessageBoxA 和 LoadLibrary API 函数 (-i):
frida-trace -p 129532 -i MessageBoxA -i LoadLibraryA
Frida将在当前目录中生成带有JS文件的handlers文件夹(在映射到modules/dlls的子目录中)来处理与我们在命令中指定的函数的函数调用/离开(onEnter/onLeave)相关的事件
让我们跳回RunShell64并点击Ok运行Shellcode,同时监控frida-trace 的输出
发现在这个shellcode中输出了三个API。
四、修改JS
我们先来看看Frida生成的js文件,
我们将调整LoadLibraryA.JS中的代码,以了解Shellcode请求的是哪个DLL,以下是更新后:
再次运行 Shellcode,让我们检查输出:
再修改JS 代码需要修改为使用第一个参数(LPCSTR lpLibFilname)作为ANSI字符串(MessageBoxA 使用ANSI字符串)使用Memory.readAnsiString(args[0]):
再次运行 Shellcode,
以上无需修改任何代码或使用任何挂钩库来拦截 Win32 API。
例子二:拦截更改API的参数
在上面的函数中有个MessageBoxA函数(以这个为例),我们想修改它的参数。这个功能很实用,在实际场景中分析很有用。
让我们通过更改消息框文本来调整在MessageBoxA.JS文件中传递给onEnter函数的参数:
再次运行 Shellcode,
Frida功能强大!!!
下载:
链接:https://pan.baidu.com/s/1rCzwtityhe_phy7hsoBimA
提取码:gapm
原文始发于微信公众号(MicroPest):Frida调试shellcode
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论