ARM Bare metal try
Foreword
想给今年的 HGAME Mini 2025 出一道简单的 Pwn 题,突然想着之前的题目似乎没有涉及到 IoT Pwn 的(虽然可能是因为不太算 pwn 的入门内容?),打算来一道比较简单的,正好学习一下 IoT 的相关知识吧。
想给今年的 HGAME Mini 2025 出一道简单的 Pwn 题,突然想着之前的题目似乎没有涉及到 IoT Pwn 的(虽然可能是因为不太算 pwn 的入门内容?),打算来一道比较简单的,正好学习一下 IoT 的相关知识吧。
Do you know
本人代码水平拙劣🥲,实现部分仅供参考
程序设计课期末作业要求实现一个「基于可穿戴传感器数据的人体活动识别」,具体是实现一个分类任务。
数据采集设备以每秒 1 次的频率记录传感器信息,涵盖加速度(x、y、 z 轴)、陀螺仪角速度(x、y、z 轴)、温度、湿度、心率、皮肤电反应等共计 561 个数值型特征维度。每条数据均标注了活动类别标签,包括以下六类:
WALKING:行走,标记为 1
WALKING_UPSTAIRS:上楼梯,标记为 2
WALKING_DOWNSTAIRS:下楼梯,标记为 3
SITTING:坐着,标记为 4
STANDING:站着,标记为 5
LAYING:平躺,标记为 6
From: ACTF 2025
题目给出一个去符号的 qemu 二进制文件
qemu-system-x86_64
,启动参数如下
#!/bin/sh
timeout --foreground 300 ./qemu-system-x86_64 \
-L pc-bios \
-m 1024 \
-kernel bzImage \
-initrd rootfs.cpio \
-drive file=null-co://,if=none,id=mydisk \
-device virtio-blk-pci,drive=mydisk,ioeventfd=off \
-device readflag \
-append "priority=low console=ttyS0" \
-monitor /dev/null \
-nographic
FSOP 是 File Stream Oriented Programming 的缩写。
FSOP 的核心思想就是劫持
_IO_list_all
的值来伪造链表和其中的_IO_FILE
项,但是单纯的伪造只是构造了数据还需要某种方法进行触发。FSOP 选择的触发方法是调用_IO_flush_all_lockp
,这个函数会刷新_IO_list_all
链表中所有项的文件流,相当于对每个 FILE 调用 fflush,也对应着会调用_IO_FILE_plus.vtable
中的_IO_overflow
。
但你必须先向我们证明自己有回到 2016 的实力!
祝你玩的开心 o ( ̄▽ ̄) ブ
没有附件是正常的喵
这个分数或许也考虑了买 hint 这件事,别害怕嘻嘻
这道题是没有给出附件的,我们需要根据输入和程序的输出获取一切信息。
由于友链页面有使用图片的要求,同时为其他人的站点提供相关的图片资源(虽然使用现成的 GitHub Page 就可以基本实现,但是 Page 所在的仓库是公开的),尝试通过 GitHub 作为图床解决这个问题。然而,访问速度和稳定性都无法得到保证,为此通过网上搜索学习了一下反向代理 (Reverse Proxy) 的相关知识。
存在 off-by-null 漏洞,当 prev_size
域复用时,可置零相邻
chunk 的 prev_inuse
位。
存在越界写入漏洞。
本次 DASCTF 12 月赛尝试了 pwn 方向的两道题目,最终还是如愿以偿的爆零了。首先看到题目我就有种陌生的感觉,给定程序是去掉调试符号的,并且有多个函数,大大降低了可读性,和我先前遇见的题目有不小的区别。
一叶舟轻,双桨鸿惊。水天清、影湛波平。鱼翻藻鉴,鹭点烟汀。过沙溪急,霜溪冷,月溪明。
重重似画,曲曲如屏。算当年,虚老严陵。君臣一梦,今古空名。但远山长,云山乱,晓山青。
——《行香子・过七里濑》
shellcode 是一段用于利用软件漏洞而执行的代码,shellcode 为 16 进制之机械码,以其经常让攻击者获得 shell 而得名。shellcode 常常使用机器语言编写。
在程序的执行过程中,我们称由 malloc 申请的内存为
chunk
。这块内存在 ptmalloc 内部用 malloc_chunk 结构体来表示。
/*
This struct declaration is misleading (but accurate and necessary).
It declares a "view" into memory allowing access to necessary
fields at known offsets from a given base. See explanation below.
*/
struct malloc_chunk {
INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links -- used only if free. */
struct malloc_chunk* bk;
/* Only used for large blocks: pointer to next larger size. */
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
struct malloc_chunk* bk_nextsize;
};
关于堆的结构很重要的一点在于,其使用和 free 状态下的结构一致,只是相应功能有区别。例如使用时 fd 段用于存储数据,可以通过某些方法把不合法的数据写入一个 free chunk 的 fd 中。