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

41

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

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

配置qemu

执行以下命令配置qemu环境

```shell 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 ```

执行qemu-riscv64 main运行程序

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

逆向分析

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

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

双击xor,查看字节

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

编写脚本

```C int main(void) { int a[] = { 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[] = { 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 < 80; i = i + 4) printf("%c", a[i] ^ b[i]); } ```

获得flag