ACTF dropper 复现

拿到程序拖入PE中可以发现是一个UPX壳的 64 位程序,我们如果直接upx -d进行脱壳可以发现程序无法运行,因此我们运行x64dbg开始尝试手动脱壳。

1.png

脱壳完后的程序在修复一下IAT,之后拖入IDA中,依次进入

2.png

3.png

4.png

可以看出来程序创建了一个线程,在运行些什么东西,我们运行原来的程序,打开任务管理器进行查看

5.png

可以看到多出来一个进程,而且在跑一个可执行的程序,我们对此需要想办法将其dump出来,分析这个子进程的功能,我们再次回到x64dbg中,进行单步调试,在调试过程中我们可以在内存中看到对应的PE文件结构

6.png

我们将其dump出来保存为exe,即可得到子进程创建的程序,我们将其拖入IDA进行分析

7.png

在前半截我们动调可以发现程序将内存中的数据进行取反,之后得到flag:这个也就是为什么我们无法直接从内存中进行读取,同时我们可以明显的看到cincout,得知这个是一个C++逆向,对于C++逆向在编译中最喜欢套娃和产生一些莫名的函数,对此我们不需要完全分析出每一项函数的作用,只需要推出大致逻辑即可。

8.png

在程序下方有一个除 0 异常,在这个异常中我们可以观察到其对虚函数表进行了修改

9.png

原来对应虚函数表的操作:

10.png

在异常中:

11.png

执行触发异常后我们继续F8进行运行,切换至汇编界面,可以发现程序的执行流程被异常改变了,将原先的虚函数表进行了替换操作

12.png

我们跟进到这个sub_7FF78950C0CF函数中,查看这个新的虚函数对程序的处理,找对应哪些地方将我们的输入进行了处理加密

13.png

14.png

分析代码发现程序将对应key进行处理成以万为单位,每 4 个数字一组,进行处理,我们将每一个key通过调试进行dump出来,跟据对应的程序加密,可以判断出程序是将key与我们的输入进行大数运算,之后进行比较函数,判断我们的输入

因此对应的解密脚本可以编写了,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import base64

res = 834572051814337070469744559761199605121805728622619480039894407167152612470842477813941120780374570205930952883661000998715107231695919001238818879944773516507366865633886966330912156402063735306303966193481658066437563587241718036562480496368592194719092339868512773222711600878782903109949779245500098606570248830570792028831133949440164219842871034275938433
res = res + 57705573952449699620072104055030025886984180500734382250587152417040141679598894
res = res - 71119332457202863671922045224905384620742912949065190274173724688764272313900465
res = res + 55079029772840138145785005601340325789675668817561045403173659223377346727295749
res = res - 14385283226689171523445844388769467232023411467394422980403729848631619308579599
res = res + 80793226935699295824618519685638809874579343342564712419235587177713165502121664
res = res // 7537302706582391238853817483600228733479333152488218477840149847189049516952787
res = res - 17867047589171477574847737912328753108849304549280205992204587760361310317983607
res = res + 55440851777679184418972581091796582321001517732868509947716453414109025036506793
res = res // 11783410410469738048283152171898507679537812634841032055361622989575562121323526
res = res - 64584540291872516627894939590684951703479643371381420434698676192916126802789388

s = ''
while res:
s += chr(res % 128)
res = res // 128

print(base64.b64decode(s))
# ACTF{dr0pp3r_1s_v3ry_int3r3st1ng_1d7a90a63039831c7fcaa53b766d5b2d!!!!!}

ACTF dropper 复现
https://equinox-shame.github.io/2022/07/03/ACTF dropper 复现/
作者
梓曰
发布于
2022年7月3日
许可协议