MiniL-Reverse部分题解
MiniL-Reverse 部分题解
总体而言题目不错,就是后面的混淆写着感觉和吃屎一样(
bigbanana
52MB 的附件里有 53MB 的 bigbanana 视频,我很难评(
打开一看一个巨大 switch,鉴定为 vm,拷 opcode 出来后一个一个看是什么功能
特别注意 opcode 是在 -1 后进入 switch 进行运行的
功能表如下:
1 | 0 add v8 $0 |
然后根据此功能表写出汇编器
1 | void trans() { |
得到 vm 使用的汇编代码,实在是太长了就不放了
之后可以发现后续比对的一些特征
1 | stack.push(getchar()); |
先行读入 2 字符,加上某数字后异或后比对,之后就是读一个字符,简单加法,然后异或比较,只需要爆破一开始的 2 字符,之后的数据也可以爆破得到(其实是可以直接异或算出来的,但是懒得去想了,反正能爆)。数据提取问题,不难发现这些使用立即数以 4 个为一组,在汇编器针对此特征只在 opcode-1 为{0, 241, 243}时打印数字,即可提出其中用于爆破的数据。爆破脚本如下:
1 | int main() { |
得到最终 flag
不管怎么说还是很标准的 vm 题
longlongcall
一吨的 call 混淆,使我的 ida 去世
观察后不难发现这群 call 混淆机器码全都是 E8 02 00 00 00 C9 C3,编写 idapython 脚本去了
顺便把那些没啥用的 pushfq 和 popfq 去了
脚本如下
1 | def pattern_nop(start_addr, end_addr, pattern): |
然后 apply patch 后重新让 ida 分析(不然要 undefine 一堆函数,懒懒懒懒懒)
发现是一个异常简答的异或,直接写脚本解了
1 |
|
得到 flag
myrust
rust+安卓,狠狠地踩在我的雷点上
安卓用 jadx 打开一看一个就调用了一个 invokeCheck 检查输入的 flag,但是还 loadLibrary(“myrust”),直接解压 apk 拿到 myrust.so
从字符串表里找到 so 中对应的函数名并找到对应函数。在 mz1 师傅的帮助下发现他加载了 CryptoClass 类,遂回到安卓源代码中,果然找到这个类
里面就是简单 AES 比较后返回结果,但是 AES 直接解码后是乱码不是 flag
mz1 师傅直接使用调试机 hook 找到了 AES 的 key 与输入进行的一次倒序凯撒,byebye 大爹
实际上在 rust 中也能找到着这两部分(事后诸葛亮)
由于传入类的是一个字符串数组,可以通过 rust 中调用的构造字符串与给数组赋值确定相关逻辑位置。第一个箭头是将字符串” oa0-eikddi1@ecsa “载入,第二、三个箭头指向的函数大致是将字符串反转后给字符串中的每个字符+1。因此 AES 的 key 应该是上面的字符串反转后每个字符 -1 即”btdfA2jeeljf.1bp”,之后 CryptoClass 类中的数据拿出来按这个密钥解密后,再反转每个字符-1即可获取 flag。
olessvm
满地都是混淆,mz1大爹在经过不懈地动态调试后成功找到了主要的加密逻辑部分,之后靠动态调试直接提出数组的数值
解密得到 flag
脚本如下:
1 |
|
obf
屎山中的屎山,全是混淆。在与mz1大爹连蒙带猜各种调试后最终得出加密流程是一个异或和一个 xxtea 和一个异或以及另一个反转后异或,非常的杀时间
不写 wp 了