吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 791|回复: 0
收起左侧

[CTF] 【2026春节】解题领红包之九 {Web 中级题} - 新手入门

  [复制链接]
Co0l 发表于 2026-3-6 17:42
第一次参与吾爱的CTF。我其实擅长web类型的CTF,逆向基本不会呀。
当时给我看到有web题时高兴惨了,但并不是传统的web,规定时间并没有做出来。结合大佬们的分享,给出一个纯新手入门的解题思路,纯小白也能复现。
Web 中级题
1、下载题目源码,只有一个html和两个js文件。拜读题目提示,可知flag就是语音验证码,但是区分大小写,所以只能通过其他方式去获取。(通过爆破的字母大小写方式基本无解,毕竟50位的flag呢)
2、分析verify.js代码(使用AI分析时,记得删除Agent.md的部分),init一般为函数入口,分析得到,gen函数返回值中包含flag的hash,通过浏览器F12下断点的方式,发现也只有hash这一个有效的字符串。(本以为flag也会一起返回,看来没有那么简单)

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图1

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图1

3、那么就继续分析gen函数,js中的gen函数会调用wasm.gen函数(wasm不了解是什么),但是F9继续调试,就进入了wasm的伪代码里了,根本看不懂,只有求助AI了,但也没有下文了。到此我做题就结束了,主要是没啥时间,在上班了。
4、查看大佬的分享和进一步了解wasm,发现wasm可以反编译成伪代码,使用以下代码在浏览器控制台中将wasm转化为文件。
const base64 = "你的wasm完整base64字串";

const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) {
    bytes = binary.charCodeAt(i);
}

// 建立下載連結
const blob = new Blob([bytes], { type: 'appli未选择任何文件
cation/wasm' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'challenge.wasm';
a.click();
5、再使用wasm-decompile.exe编译成伪代码(https://github.com/WebAssembly/wabt)。
wasm-decompile challenge.wasm -o result.dcmp
6、查看result.dcmp伪代码(太长了,丢给AI分析不现实呀),大概看看每个函数,很明显的能发现有个大量循环的函数func9。前面的分析可知,wasm代码中是生成了flag并将flag加密成hash,然后返回值;从js代码中的验证函数checkCode可知,加密使用的是SHA-256,这个加密会进行大量循环,那么这个函数多半就是实现了SHA-256,那么它的入参或者过程中就一定会有flag。

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图2

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图2

7、但是伪代码不能在浏览器调试呀,只有在浏览器中找到伪代码对应的代码(直接搜索func9即可)。还是读不了一点,截取一部分给AI分析,直接问在什么地方下断点,可以看到入参的值。根据AI提示,在函数第一行local.get $var0后下断点,就可以看到参数值,但是该值表示的是存储变量的内存的地址,使用如下代码即可看到内存中保存的字符串(直接查看长度50的字符串)
Array.from(new Uint8Array(instance.exports.memory.buffer).slice($var1.value, $var1.value + 50))
  .map(b => (b >= 32 && b <= 126) ? String.fromCharCode(b) : '.')
  .join('')
8、发现其值并不是flag,是一串数字和什么东西都感觉没有关联。思考:入参不是flag,那么就是过程中有flag,那么flag就是在func9中生成的,但是有个函数叫gen,这个参数才应该是生成flag的函数。那么就还有一种情况,就是下断点的时机不对。查看汇编代码,发现有很多调用func9的地方,所以我们下断点的时机应该在flag生成后,再在func9中下断点。开始想的是,直接在gen完成后下断点,但是gen完成后就结束了。分析发现gen中有多个func9的调用代码(笨办法,在每个调用func9函数的地方下断点,然后再在func9中下断点。结果:在gen中第11个调用func9的地方下断点,即可获取到flag)

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图3

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图3

9、聪明点的办法就是用AI分析gen函数,分析得到i32.load8_u offset=1295903 是生成了flag后,转换为可见字符串,就是查表的地方。那么在最后一个查表的地方下断点,然后再在func9中下断点,也可获取到flag。

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图4

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图4

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图5

【2026春节】解题领红包之九 {Web 中级题} - 新手入门-图5

免费评分

参与人数 3威望 +1 吾爱币 +21 热心值 +3 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yeungh + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Coxxs + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-3-17 14:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表