2024春秋杯网络安全联赛冬季赛
upx2023
upx壳,原版upx -d脱不了,x64dbg手动调试脱壳然后scylla dump
F5直接得到主函数逻辑
1 |
|
enc对输入flag做加密,最后与随机数异或
1 |
|
enc看起来比较麻烦,实际上是置换操作,将输入打乱,让输入的42个字符两两不同,把置换规则跑出来
1 |
|
随机数种子爆破
1 |
|
拿到flag
file_encryptor
F5发现有问题
故意触发异常
调试发现还没运行到main函数就挂了
看导入表有导入函数IsDebuggerPresent
,交叉引用
TlsCallback_0
里面有反调试
把jz patch成jmp
调试发现TlsCallback_0
里面也有出发异常,pass之后跳到了loc_C41916
直接在0x00C418ED用jmp跳到loc_C41916
再运行main处触发异常,pass之后跳到loc_C619CC
patch一下
patch之后就能无痛F5了
1 |
|
仔细看有怪东西
1 |
|
主函数和loc_1221320
里有花指令,nop掉,再F5就正常了
1 |
|
从资源节加载名字叫DATA
的资源文件,然后异或0x33解密,调试然后dump下来,PE文件,看导入表可以看出来是加解密相关的dll
sub_1221CE0
应该是加载该dll的函数,运行完进程里多了cryptsp.dll
,应该就是导入的dll
继续往后分析,sub_1221320
1 |
|
里面检测磁盘序号,nop掉
sub_1221000
里面对字符串做操作,估计是密钥
sub_1221210
比较怪
1 |
|
v7的内容
刚好是cryptsp.dll
里的第2个导出函数CryptAcquireContextW
,sub_F71BB0
应该是根据ordinal获取函数地址
把其他几个函数获取一下
1 |
|
调用这几个函数应该是初始化密钥
接着分析sub_972000
1 |
|
懒得看win api了,直接调试看内容
遍历桌面上document
文件夹里的所有文件,过滤.
开头的文件
sub_F717E0
是一些宽字符串转换
1 |
|
sub_F71640
是一些密码操作,没对文件进行操作,忽略掉
sub_F713E0
里面有文件操作
1 |
|
读文件,用密钥加密,再写回去
加解密密钥应该一样,直接把CryptEncrypt
替换成CryptDecrypt
(要nop掉一个参数)就能解密
flag{7sa963fa-91a6-4371-bl7b-225102y789a0}
coos
main函数输入,enc加密,末尾每8字节跟密文比较
1 |
|
密文的比较只有4次,手动运行dump一下
1 |
|
enc
里面是虚拟机,先初始化虚拟机指令,将输入数据每8字节用虚拟机进行加密
vm_main
是个比较简单的虚拟机
1 |
|
0x4E
调用了虚拟机,指令长度只有5,进行两次异或操作
1 |
|
0x4F
里面调用虚拟机,指令长度较长,不过很多重复指令,当循环操作处理
1 |
|
0x50
里面调用虚拟机操作,跟0x4F
类似,循环操作
1 |
|
分析第一次调用vm_main
的指令,实际上依然是循环,vm_main返回之后,还调用了一次虚拟机,做最后一次处理
1 |
|
完整的enc指令如下:
1 |
|
用python翻译一下
1 |
|
不难看出是SPN加密,逆向出解密
1 |
|
解密得到flaga9d99caef9ae999a299129c91299fc95