情景再现

下载先查壳 然后运行一下

image-20230222181808512

image-20230222181836207

没啥好看的 拖入ida64分析

image-20230222182024067

然后也打不开 F5 然后space看下汇编窗口

显然有问题 需要修复 这儿用到了idc脚本执行

不懂去Google 不多赘述了

image-20230222182100619

从开始的地址按D 转化为data

image-20230222182319379

shift + F2 打开 内置脚本命令行

执行脚本Run

image-20230222182444610

1
2
3
4
5
6
7
8
9
10
#include <idc.idc>

static main()
{
auto addr = 0x402219;
auto i;
for(i = 0; i <= 223; ++i){
PatchByte(addr+i,Byte(addr+i)^0x99);
}
}

image-20230222182503987

然后

依次按c (机器语言变汇编) p(创建函数)

这个call成功修复了

image-20230222182636070

image-20230222182710225

跟入40207B (双击603170发现没有值 应该是个关键值)

image-20230222182810968

跟进401CF9

跟进call 笔者没看懂 后来了解是MD5加密

这是MD5特征码

image-20230222183247937

(603120是个标准base64表)

image-20230222182858736

看不懂我们就分析外面这个call

这样看着好一些 -

所以我们可以直接动调得到上文提到的603170的值

这个值就是这个call的意义所在

image-20230222183620497

不会动调的去Google 或者去看我怕前面的文章

这儿就不赘述了

image-20230222184130813

image-20230222184241836

image-20230222184259059

image-20230222184452736

image-20230222184517008

1
2
603170-
[0xCB, 0x8D, 0x49, 0x35, 0x21, 0xB4, 0x7A, 0x4C, 0xC1, 0xAE, 0x7E, 0x62, 0x22, 0x92, 0x66, 0xCE]

跟进这儿个关键call

image-20230222184658126

经过分析这几个call 发现是AES加密

然后把MD5后的值传入作为AES的key

得到6030A0这个数组

提取这个

1
2
6030A0-
[0xBC, 0x0A, 0xAD, 0xC0, 0x14, 0x7C, 0x5E, 0xCC, 0xE0, 0xB1, 0x40, 0xBC, 0x9C, 0x51, 0xD5, 0x2B, 0x46, 0xB2, 0xB9, 0x43, 0x4D, 0xE5, 0x32, 0x4B, 0xAD, 0x7F, 0xB4, 0xB3, 0x9C, 0xDB, 0x4B, 0x5B]

然后 有cipher 有key

贴exp

1
2
3
4
5
6
7
8
9
10
11
from Crypto.Cipher import AES
from Crypto.Util.number import *

key = long_to_bytes(0xcb8d493521b47a4cc1ae7e62229266ce)
lun = AES.new(key, mode=AES.MODE_ECB)

mi = long_to_bytes(0xbc0aadc0147c5ecce0b140bc9c51d52b46b2b9434de5324bad7fb4b39cdb4b5b)
flag = lun.decrypt(mi)
print(flag)

# flag{924a9ab2163d390410d0a1f670}

提交一下 过啦

Orz

总结


今天你 RE 了嘛


这道题 学习到了 ida中怎么运行idc解密脚本(smc)

然后就是AES动调key and cipher

得出flag

好的 本期结束

感谢观看

Orz