LILCTF2025逆向题解
LILCTF 2025
ARM ASM
先用jadx看,找到密文
反编译so文件,找到主函数,这里一共分为三处加密,第一处通过t表进行重新排列和按位xor,第二处对每三字节进行左循环移3位,右循环移1位,不变的变换,第三处用base64变表的加密
这里可以找到t表的内容
将以上加密过程逆过来写解密
1 |
|
1’M no7 A rO6oT
用vs看文本内容,得到看到这一串js代码,提取出来,发现这一段有好多混淆,这里我是利用python一步步解混淆的,可以直接梭,由于代码太长就不贴出来了
这是初始代码
1 |
|
解出第一步,中间内容省略(太长了)
这里贴出解出第一步代码的主要逻辑
1 |
|
第二层解出是一个powershell命令
1 |
|
十六进制字符串 (a5a9b49fb8adbe...
)被正则分成 2 位一组(即 "a5"
, "a9"
, "b4"
…)。
转成字节再异或 204
1 |
|
拼接成字符串,得到一个完整的命令/脚本,赋值给 $EFTE
。
1 |
|
- 拿
$EFTE
前 3 个字符作为程序名(可能是"cmd"
或"iex"
)。 - 剩下部分是参数/脚本。
- 最后动态执行。
解密这一层得到第三层代码,
这段代码在隐藏窗口下启动powershell,然后执行’http://…/bestudding.jpg,我们可以直接在浏览器窗口下载这个jpg
1 |
|
将图片用vs打开查看文本内容,得到这么一串
1 |
|
这一串就是加密的过程,$r
是核心变量。
最终结果
1 |
|
LILCTF{be_vigilant_against_phishing}
Qt_Creator
题目给的是一个安装包,下载下来后直接安装文件,就是一个登录的页面,要求输入注册码,注册码就是flag,所以解题的思路就是通过分析安装得到的文件得到注册码
整体来说这个题目难度不大,但是需要一步步动调来确定输入函数的位置
安装好的demo_code_editor.exe打开拖入ida
我们直接进入ida时看到的主函数入口是winmain,也可以从那里开始进行调试,这道题就是动调找主要函数的过程。
如果没有什么思路,我们就可以直接从start函数这里开始调试
进入sub_401150函数,我们可以利用动调或者直接分析函数内容
sub_417C00就是入口函数,点进去也能看到这个窗口程序的主函数winmain
可以在函数开头下断点,然后f8一步步动调
发现在sub_4015E0函数处就直接退出了,说明有反调试
可以在反调试的跳转函数那里下断点,在动调的时候改zf,或者直接将jz改为jmp(74改为EB)
顺便把exit退出函数给nop掉,然后patch保存,这样就顺利地反反调试了
继续调试,发现程序在运行到sub_403400函数的时候跳出让用户输入注册码,随便输入之后发现程序就直接退出了
重新调试,在sub_403400函数下断点然后f7进去一步步调试,发现在QDialog::exec这里让用户输入
重新调试,进入QDialog::exec函数一步步调试
在调试的过程中也可以发现QDialog::exec函数其实是一个窗口生成和输入的函数,在这里的调试过程中随便输入验证不会跳出exit,说明我们没有触碰到exit,也说明我们快接近验证字符串的函数部分了。
继续动调,一直到最后看到的退出exit函数,这里没什么技巧,一直f8
直接跟踪这个函数,于是发现了sub_410100函数
发现这里的QLineEdit::text() → 得到输入的字符串(Qt 的QString),这个函数就是用来验证输入的字符串的,我们成功找到了真正的flag存在的位置,
在 QLineEdit::text(*(a1[6] + 20));下断点重新调试
然后再次在QDialog::exec函数输入注册码之后就会跳转到sub_410100,然后再返回看a1的内容,就能得到flag
LILCTF{Q7_cre4t0r_1s_very_c0nv3ni3nt}
obfusheader.h
这题本来想去除花指令,就是一个jz跳转的花指令,但是有点多,就没有去除,好在汇编不太难,可以直接看出加密逻辑
可以通过搜索字符串找到关键函数的位置,也可以在初始函数这里找到(做过好多道题,一般都会在start函数里的code处是主函数入口)
在输入flag这里下断点
这里如果输入的字符串长度不对就会直接退出,可以通过调试发现寄存器rax为0x28,长度为40,然后输入之后下硬件断点
第一次调试直接按f9,到这里,这里就是一个比较长度的函数
这里两次调试是与一个随机数异或
将xor结束后的测试密文提取出来得到随机数xor的key
1 |
|
第四次调试,我没有去除花指令,但也不太影响看汇编,这里就是位运算,将高四位和低四位调换位置
第五次调试,这里就是按位取反
第六次到这里,cmp比较指令,可以得到密文
提取出的密文:
1 |
|
1 |
|
LILCTF{wH4T_is_d47a1I0W_CAN_l7_6e_eaTEN}
Oh_My_Uboot
看官方的wp利用qemu进行调试来着,这个方法我还没试,可能出题人忘记隐藏字符串了~
可以通过搜索字符串直接找到关键密文
然后交叉引用找到主函数
unk_6086D357数据会被sub_60813F74解密,这部分应该输出类似英文提示信息
核心校验函数 sub_60813E3C
,生成自定义的base58表
生成的表是
1 |
|
最后不要忘记xor 72!!
完整脚本:
1 |
|
LILCTF{Ub007_1s_v3ry_ez}