京麒ctf2024初赛-wasm

type
status
date
slug
tags
summary
category
icon
password

前戏

反调试

可以这样用条件断点直接绕
notion image

同源策略

需要关闭同源策略才能看到wasm附件

firefox:

在网址栏中输入”about:config“ 再搜索栏中输入"security.fileuri.strict_origin_policy",并设置为"false"

chrome

快捷方式写一个:
notion image
这里有两个问题:
  1. firefox用前面的条件断点策略没办法绕反调(未解决)
  1. chrome同源策略不能直接从文件夹里面打开
解决方法:
chrome里面打开python -m http.server,即可看到wasm文件

调试

正确绕过反调以及配好浏览器,这里就可以调试了(暂时没觉得浏览器调试很不妥,先用着~)

静态分析

ghidra插件选择好插件的压缩包即可
notion image
这里我们的index.html修改为了这样:

正餐

总体流程

静态看一下
输入一个fake flag才会触发逻辑:
审一下js
这里的Reflect.apply是调用wasm函数的核心语句,后续对于js就是hook这里来观察函数调用的逻辑:
这里hook观察函数调用以及传参
这样可以观察返回值:
notion image
 
以及gift函数,测试会发现它实际上就是一个rc4,算是暗示你加密只有rc4
notion image
notion image

加密

我们会看到这样的函数,rc4,做了ollvm,调试发现这里是核心的加密段
notion image
好在逻辑不是很复杂,可以很快定位到核心加密的xor:
notion image
key的话,makeslice的地方很可疑,以及下面的%
notion image
notion image
可以调试看看,发现不对:
notion image
这里才是真的秘钥(可以测试出来,ollvm跟起来还是有些难顶...)
notion image
打上条件断点:
notion image
但会发现这里触发次数太多,那我们换一个地方打:
notion image
这样就拿到了所有的key

密文

上面的测试过程都是复现时候捋出来的思路,并不是从零开始的调试
实际上直接调试过一遍会看到函数调用栈,一个一个func走,最后一个是main.remalloc.func1,里面调用了main.malloc
notion image
这里如果绕过弯来,会知道wasm是没有malloc这种底层操作的,包括前面会看到其他几乎所有函数的命名,都是混淆成经典的系统函数的命名了
malloc里面有我们非常想要看到的memequal了:
notion image
注意这里的条件:(即我们的输入长度需要控制,他给的输入是不行的,需要修改为自己的输入)
notion image
比较的位置,观察我们的输入长度是否满足要求:
notion image
这样的flag是可以的
notion image
点两次进里面,它就是我们想要的check结构:
notion image
前面的log中我们会发现几次加密最后返回的是一个base64,这里我们也可以调试找到base64:
notion image
这里的var1即为密文
解密脚本如下:
上一篇
高校运维赛2024
下一篇
上海市大学生
Loading...
文章列表
Hi~, I ‘m moyao
reverse
pwn
pentest
iot
android
others
ctf
iOS