工业信息安全技能大赛2020-济南站-IoT题目解题思路
IoT题目,原题描述
一台奇怪的单片机上运行着奇怪的程序,请您帮助调试相关程序。Flag格式为:flag{} |
分析环境
Ubuntu 20.04 qemu 6.2.0 Ghidra 10.1 |
首先拿到题目,解压后是一个名叫main的文件,使用file命令识别其类型为ELF程序,CPU架构是RISC-V的。

RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。 与大多数指令集相比,RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件,该项目2010年始于加州大学伯克利分校。 |
既然知道了其CPU架构,可以试着使用qemu模拟运行ELF文件,首先安装qemu环境
sudo apt install gcc make libglib2.0-dev libpixman-1-dev ninja-build wget https://download.qemu.org/qemu-6.2.0.tar.xz cd qemu-6.2.0 ./configure --target-list=riscv64-softmmu,riscv64-linux-user make sudo make install |
安装好qemu环境后,直接使用qemu-riscv64命令运行main程序,启动程序后可以进行输入,经过测试当输入的字符串长度不为20个字节将直接退出,当字符串长度等于20个字节时,如果不匹配正确的答案会提示“You Lose!”。

那么这时候就得逆向分析了,可以使用反汇编工具,由于RISC-V这种CPU架构比较新,经过测试需要使用新版的反编工具,旧版的工具很多都无法支持,这里使用了Ghidra 10.1 这个版本的工具。
Ghidra 是由美国国家安全局(NSA,National Security Agency)的研究理事会为 NSA 的网络安全任务开发的软件逆向工程(SRE)框架,它有助于分析恶意代码和病毒等恶意软件,并可以让网络安全专业人员更好地了解其网络和系统中的潜在漏洞。 使用的时候需要提前安装JAVA环境,关于如何配置JAVA环境可以自行搜索。 |
使用工具分析main文件,能够正确识别其CPU架构

点击OK后,弹出一个自动分析对话框,点击Yes开始分析

选择默认的分析项,点击Analysze

经过一会就能分析完毕,这时候看到左边有一个Symbol Tree的窗口,这里显示了函数、变量等等标识符。

一般来说分析一个ELF程序,可以从main函数入手,那么,在Symbol Tree的窗口下面的Filter查询框查找是否有main函数

选择Exports导出表的main函数,Listing窗口是显示反汇编代码,Decompile窗口是反汇编的伪C代码

伪代码如下所示

经过静态分析可以知道其基本逻辑
1、长度要求20字节 2、输入的内容经过“异或”与正确答案各个字符匹配 |
现在需要处理一下异或的数组xor、cyt,双击伪代码的xor进入汇编代码,可以知道数组是4个字节为1组的

右键选择最开始undefined字符,选择Data -> dword使其定义为4个字节变量

目前变成ddw形式(dword)

同样右键选择ddw字符串,选择Data -> Create Array使其定义为一个数组

因为对比的字符串长度为20,那么在这里可以设定其值为20

设定后,xor数组如下

cyt数组同理可以设定为数组

根据异或的规则
A ^ B = C 可以得到 A ^ C = B |
那么编写代码进行验证,这里使用python进行快速编码
#/usr/bin/python cyt = [ 0xF9, 0x95, 0x11E, 0x84, 0x43, 0x11E, 0x148, 0x186, 0x164, 0x108, 0x159, 0xDE, 0xBF, 0x78, 0x1E3, 0xC8, 0x154, 0x1FB, 0x9E, 0x104 ] xor = [ 0x9F, 0xF9, 0x17F, 0xE3, 0x38, 0x146, 0x127, 0x1D4, 0x13B, 0x141, 0x16C, 0x81, 0xEC, 0x48, 0x1BC, 0x8D, 0x135, 0x188, 0xE7, 0x179 ] inputstr = "" for i in range(20): inputstr += chr(cyt[i] ^ xor[i]) print(inputstr) |
打印出结果为

运行main程序,输入“flag{XoR_I5_S0_Easy}”,提示正确!

参考链接: