crewCTF 2025 -- WASM Vault

news/2025/9/28 12:43:08/文章来源:https://www.cnblogs.com/mdkj/p/19116435

image

从 js 中看出,先把输入的 flag 存到 wasm 的内存为 0 的位置,然后调用 vault.wasm 导出的 unlock() 函数判断
这里用开源项目 wabt 把 wasm 转成 c 文件,再用 gcc 编译成二进制文件,这样就可以拖到 ida 里分析了

wasm2c vault.wasm -o vault.c
gcc -s vault.c -o vault.o

ida里看到,里面用了很多 w2c_env_x() 混淆,这个函数在 js 里。简单分析可知,对于一个常数,函数的返回结果是固定的
为了去除 w2c_env_x() 的混淆,可以用 mov eax,0/1 替换 call w2c_env_x,刚好都是5个字节

import idautils
import ida_idaapi
import ida_bytes
import idc
import idaapi
import ctypesdef x(n):r = 0while n!=0:r^=(n&1)n>>=1return rfunc_x_addr = 0x0000000000007988for addr in idautils.Functions():if 'w2c_vault' in idc.get_func_name(addr):for ea in idautils.FuncItems(addr):insn = idaapi.insn_t()if idaapi.decode_insn(insn, ea) == 0:continue# call w2c_env_xif insn.itype == idaapi.NN_call and insn.ops[0].addr == func_x_addr:result = 0# 找到传参指令 movmov_ea = eafor i in range(6): mov_ea = idc.prev_head(mov_ea)insn = idaapi.insn_t()idaapi.decode_insn(insn, mov_ea)if insn.itype == idaapi.NN_mov and insn.ops[0].type == idaapi.o_displ and insn.ops[1].type == idaapi.o_imm:result = x(insn.ops[1].value)else:raise Exception('error')ida_bytes.patch_byte(ea, 0xb8) # mov eaxida_bytes.patch_dword(ea+1, result) # 0/1

去混淆前
eea4e349-1635-4273-a2d9-9173868ab23c

去混淆后
5596fdec-1b42-4943-babe-bfe82d832a64

接下来花了亿点时间分析。它根据输入的 flag 构建了一个 Huffman 树,flag 每个字符用根到叶子节点的路径编码表示。
最后把序列化后的 Huffman 树和 flag 的编码和一个固定的字符串比较。

b31bacbe-b209-4439-8c17-e63f8f9febf1

#include <stdio.h>
#include <stdint.h>uint8_t exported_data[] = {0xB5, 0x03, 0x00, 0x00, 0xE8, 0xC6, 0x66, 0x0C, 0xD7, 0xC1, 0xC7, 0x64, 0x9D, 0x11, 0x1C, 0xBE, 0x12, 0x75, 0x58, 0xCA, 0x6E, 0x00, 0x4E, 0x4C, 0x45, 0x2D, 0xA4, 0x46, 0x89, 0x8C, 0xD5, 0x65, 0x35, 0xBB, 0x9B, 0xC2, 0xCB, 0xEB, 0x36, 0x30, 0xB5, 0x90, 0x2A, 0xAA, 0x35, 0x44, 0xD1, 0xDC, 0xBA, 0xB8, 0x05, 0x61, 0x5A, 0xFD, 0xF9, 0x6B, 0x6F, 0xCB, 0x5B, 0x7E, 0x5A, 0xDA, 0xBE, 0xF4, 0xB6, 0x0F, 0xEB, 0x17, 0x05, 0x45, 0xB0, 0x47, 0xF3, 0x4A, 0x17, 0xF3, 0x71, 0x11, 0xDA, 0x5A, 0x2B, 0x86, 0xEA, 0x79, 0xEB, 0x1A, 0xA2, 0xEC, 0x17, 0xA1, 0x0B, 0x83, 0x79, 0x6D, 0xD4, 0xF3, 0xDF, 0x96, 0x5B, 0x57, 0x41, 0x7F, 0x4E, 0xE7, 0x68, 0xE9, 0x8F, 0x48, 0x41, 0x77, 0x0E, 0x1B, 0x9F, 0x1A, 0xAD, 0x3E, 0xF8, 0xA4, 0x89, 0xD3, 0x63, 0x52, 0x40, 0xB8, 0xAE, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};typedef struct _node {uint8_t value;uint8_t freq;struct _node* lchild;struct _node* rchild;
} node;node tree[256] = {0};
uint32_t node_cnt = 0;node* build_tree(uint8_t* ptr, uint32_t bit, uint32_t node_idx, uint32_t* next_bit) {uint32_t byte = bit / 8;uint32_t offset = 7 - bit % 8;if( (ptr[byte] >> offset) & 1){uint32_t next1, next2;tree[node_idx].lchild = build_tree(ptr, bit+1, ++node_cnt, &next1);tree[node_idx].rchild = build_tree(ptr, next1, ++node_cnt, &next2);*next_bit = next2;}else{uint8_t val = 0;for(int i=8;i>=1;i--){byte = (bit + i) / 8;offset = 7 - (bit + i) % 8;val = (val<<1) + ((ptr[byte] >> offset) & 1);}tree[node_idx].lchild = NULL;tree[node_idx].rchild = NULL;tree[node_idx].value = val;tree[node_idx].freq = 0;*next_bit = bit + 8 + 1;}return &tree[node_idx];
}char prefix[256];
uint32_t prefix_len=0;
void print_tree(node *nd, uint32_t depth, uint32_t is_right)
{if(depth>0){prefix[prefix_len] = 0;printf("%s|-", prefix);prefix[prefix_len++] = is_right ? ' ':'|';prefix[prefix_len++] = ' ';prefix[prefix_len] = 0;}if (nd->lchild || nd->rchild){printf("\\\n");print_tree(nd->lchild, depth+1, 0);print_tree(nd->rchild, depth+1, 1);}else{printf("'%c'\n",nd->value);}if(depth>0)prefix_len -= 2;}void get_flag(uint8_t* ptr, node* tree_root, uint16_t bit_start, uint16_t bit_limit)
{uint32_t byte;uint32_t offset;node *nd = tree_root;for (uint32_t bit = bit_start; bit <= bit_limit; bit++){byte = bit / 8;offset = 7 - bit % 8;if((ptr[byte] >> offset) & 1)nd = nd->rchild;elsend = nd->lchild;if(!nd->lchild && !nd->rchild){printf("%c",nd->value);nd = tree_root;}}
}int main()
{uint32_t bit_stream_len = *(uint32_t*)&exported_data[0];uint8_t* data_ptr = &exported_data[4];uint32_t start_bit;node* root = build_tree(data_ptr, 0, 0, &start_bit);
//    printf("tree built\n");//    print_tree(root, 0, 0);get_flag(data_ptr, root, start_bit, bit_stream_len);
}

flag: crew{7H15_15_4_V3rY_V3rY_V3rY_5UP3r_1NCr3D181Y_10N6_F146_600D_J08_1_C0MPr3553D_17_W17H_MY_C0MPU73r_5C13NC3_6C53_KN0W13D63_1_6U355_f4c91dbe}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东莞做网站的模块网站怎么做

1 非静态代码块非静态代码块特点①可以为实例变量(非静态的属性)初始化②每次创建对象的时候&#xff0c;都会执行一次&#xff0c;且先于构造器执行③若有多个非静态的代码块&#xff0c;那么按照定义的顺序从上到下依次执行④代码块中既可以调用非静态的变量和方法&#xff0…

神经网络常见的40多种激活函数(应用场景+数学公式+代码实现+函数图象)

长文预警:经典的、大模型用的、探索研究的,这里都有什么是激活函数 激活函数,属于神经网络中的概念。 激活函数,就像神经元的开关,决定了输入信号能否被传递,以及以什么形式传递。 为应对不同的场景,激活函数不…

oppo-r9m线刷刷机教程

前言全局说明oppo-r9m线刷刷机教程一、说明 1.1 环境: Windows 7 旗舰版二、刷机首次刷机,电脑需要安装驱动2.1 打开刷机工具 找到”刷机工具.exe”双击打开如下图 (如果工具打不开以管理员身份运行打开。)2.2 手机…

【DateTime】日期时间:时间处理的基础

【DateTime】日期时间:时间处理的基础教学说明:本篇因 DateTime 数据类型需要,将提前使用 Get-Date 函数。该函数会在后续 “初级篇” 中详细讲解,此处仅用于演示 DateTime 类型的基本操作。 在编程中,日期时间(…

网站建设行业新闻南宁网站建设推广服务

(2011-10-08 17:08:43) 转载▼标签&#xff1a; 杂谈 分类&#xff1a; Javatry{//代码区}catch(Exception e){//异常处理}代码区如果有错误&#xff0c;就会返回所写异常的处理。 首先要清楚&#xff0c;如果没有try的话&#xff0c;出现异常会导致程序崩溃。而try则可以保证…

地图制作网站小程序定制开发和模板有什么区别

大家好&#xff0c;我是写代码的篮球。计算机专业的小伙伴&#xff0c;在学校期间一定学过 C 语言。它是众多高级语言的鼻祖&#xff0c;深入学习这门语言会对计算机原理、操作系统、内存管理等等底层相关的知识会有更深入的了解&#xff0c;所以我在直播的时候&#xff0c;多次…

完整教程:蒸汽机革命后工业生产方式的变革与AI智能名片S2B2C商城小程序的影响

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 PHP7/8 实战入门:15 天精通现代 Web 制作——第 15 课:项目实战与部署

2025 PHP7/8 实战入门:15 天精通现代 Web 制作——第 15 课:项目实战与部署pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

做网站怎么投放广告企业网站加快企业信息化建设

xcopy XCOPY是COPY的扩展&#xff0c;可以把指定的目录连文件和目录结构一并拷贝&#xff0c;但不能拷贝系统文件&#xff1b;使用时源盘符、源目标路径名、源文件名至少指定一个&#xff1b;选用/S时对源目录下及其子目录下的所有文件进行COPY。除非指定/E参数&#xff0c;否则…

AWS SageMaker SDK 完整教程:从零开始云端训练你的模型

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 PS:网页端用不明白...还是SDK方便...一、SageMaker介绍Amazon SageMaker 是 AWS 提供的全托管机器学习平台,它覆盖了从数据准备、模型训练、超参数调优到…

反转数字-处理溢出的条件-Java

反转数字-处理溢出的条件-Java题目:反转数字 描述 给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果。 1.只反转数字部分,符号位部分不反转。 2.反转后整数num超过 32 位的有符号整数的范围…

废品回收小程序:从 “扔垃圾“ 到 “变资源“ 的体验革命 - 详解

废品回收小程序:从 “扔垃圾“ 到 “变资源“ 的体验革命 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

做网站的会什么wordpress调用主站的文章

1、点击主页面右上角的三条横杠 腾讯视频如何设置关闭本地视频后自动打开主界面 2、点击【设置】 腾讯视频如何设置关闭本地视频后自动打开主界面 3、点击左侧的【高级设置】 腾讯视频如何设置关闭本地视频后自动打开主界面 4、勾选【关闭本地视频后自动打开主界面】 腾…

怎么做自己公司的网站如何用手机免费创建网站

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

网站开发可行性报告货运app开发公司

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 对比大多数开发者来说&#xff0c;杨飞的职业路线可以说是大相径庭。从大厂到创业公司&#xff0c;从一线城…

用flash做的网站网站开发相关技术

热门API接口大全分享&#xff0c;含天气、物流等。。。 天气预报查询&#xff1a;查询全国以及全球多个城市的天气&#xff0c;包含15天天气预报查询。天气预警&#xff1a;可以获取指定城市当前生效中的各类天气预警&#xff0c;如寒潮蓝色预警信号&#xff0c;或一次性拉取全…

详细介绍:C++基础(22)——模板的进阶

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

一个问题记录-服务器那边所以得请求进去,去操作数据库的时候,全部都拿不到数据库链接com.alibaba.druid.pool.GetConnectionTimeoutException

一个问题记录-服务器那边所以得请求进去,去操作数据库的时候,全部都拿不到数据库链接com.alibaba.druid.pool.GetConnectionTimeoutException1 问题愉快的星期六,需要接到电话,说系统崩了一看日志,发现所以请求全…

稍微人格解离一点也无所谓,别太过就行

正文今天聊个有点危险的话题:“人格解离”。先声明,我说的不是临床上那种需要看医生的病理性人格解离障碍(DID)。我说的是一种主动的、可控的、作为心理防御机制的 “轻度人格解离”。轻度的人格解离,是一种非常实…

快速构建高性能 web 应用!了解 Gin Web 框架 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …