[2020-工业信息安全技能大赛巡回赛-济南站]IoT

下载附件后看到是一个二进制文件,使用file查看

是一个RISC-V架构的64位ELF文件,使用qemu运行

配置qemu

执行以下命令配置qemu环境

1
2
3
4
5
6
7
sudo apt install gcc make libglib2.0-dev libpixman-1-dev ninja-build
wget https://download.qemu.org/qemu-8.1.3.tar.xz
tar xf qemu-8.1.3.tar.xz
cd qemu-8.1.3/
./configure --target-list=riscv64-softmmu,riscv64-linux-user
make
sudo make install</code></pre>

执行qemu-riscv64 main运行程序

注意:需要给main文件执行权限

逆向分析

考虑到RISC-V架构,使用Ghidra逆向分析

查看main函数,发现程序逻辑是将输入的20位字符与xor数组进行异或,然后判断结果和cyt数组是否相等,需要注意的是,xor和cyt数组每隔4个字节用一次,其余字节无用

双击xor,查看字节

将xor复制下来,同理将cyt数组复制下来

编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

int main(void)
{
int a&#91;] = {
0x9f, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x38, 0x00,
0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00,
0x41, 0x01, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x48, 0x00,
0x00, 0x00, 0xbc, 0x01, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00,
0xe7, 0x00, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00
};
int b&#91;] = {
0xf9, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x43, 0x00,
0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00,
0x08, 0x01, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x78, 0x00,
0x00, 0x00, 0xe3, 0x01, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0xfb, 0x01, 0x00, 0x00,
0x9e, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00
};
for (int i = 0; i &lt; 80; i = i + 4)
printf("%c", a&#91;i] ^ b&#91;i]);
}

获得flag