京麒ctf2024初赛-wasm
type
status
date
slug
tags
summary
category
icon
password
前戏
反调试
可以这样用条件断点直接绕
同源策略
需要关闭同源策略才能看到wasm附件
firefox:
在网址栏中输入”about:config“ 再搜索栏中输入"security.fileuri.strict_origin_policy",并设置为"false"
chrome
快捷方式写一个:
这里有两个问题:
- firefox用前面的条件断点策略没办法绕反调(未解决)
- chrome同源策略不能直接从文件夹里面打开
解决方法:
chrome里面打开
python -m http.server
,即可看到wasm文件调试
正确绕过反调以及配好浏览器,这里就可以调试了(暂时没觉得浏览器调试很不妥,先用着~)
静态分析
ghidra插件选择好插件的压缩包即可
这里我们的index.html修改为了这样:
正餐
总体流程
静态看一下
输入一个fake flag才会触发逻辑:
审一下js
这里的
Reflect.apply
是调用wasm函数的核心语句,后续对于js就是hook这里来观察函数调用的逻辑:这里hook观察函数调用以及传参
这样可以观察返回值:
以及gift函数,测试会发现它实际上就是一个rc4,算是暗示你加密只有rc4
加密
我们会看到这样的函数,rc4,做了ollvm,调试发现这里是核心的加密段
好在逻辑不是很复杂,可以很快定位到核心加密的xor:
key的话,makeslice的地方很可疑,以及下面的%
可以调试看看,发现不对:
这里才是真的秘钥(可以测试出来,ollvm跟起来还是有些难顶...)
打上条件断点:
但会发现这里触发次数太多,那我们换一个地方打:
这样就拿到了所有的key
密文
上面的测试过程都是复现时候捋出来的思路,并不是从零开始的调试
实际上直接调试过一遍会看到函数调用栈,一个一个func走,最后一个是main.remalloc.func1,里面调用了main.malloc
这里如果绕过弯来,会知道wasm是没有malloc这种底层操作的,包括前面会看到其他几乎所有函数的命名,都是混淆成经典的系统函数的命名了
malloc里面有我们非常想要看到的memequal了:
注意这里的条件:(即我们的输入长度需要控制,他给的输入是不行的,需要修改为自己的输入)
比较的位置,观察我们的输入长度是否满足要求:
这样的flag是可以的
点两次进里面,它就是我们想要的check结构:
前面的log中我们会发现几次加密最后返回的是一个base64,这里我们也可以调试找到base64:
这里的var1即为密文
解密脚本如下:
上一篇
高校运维赛2024
下一篇
上海市大学生
Loading...