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}