CTF|第12届全国大学生信息安全竞赛线上初赛Misc杂项 Write Up


Misc杂项

  • 题目
    • 签到
    • saleae
    • 24c
    • usbasp
    • DaysBank

题目 赛题类型主要包括:逆向、漏洞挖掘与利用、Web 渗透、密码、隐写、安全编程等类别,考察参赛者不同维度的网络安全理论、技术水平。
CTF|第12届全国大学生信息安全竞赛线上初赛Misc杂项 Write Up
文章图片

签到 下载附件后,看到readme.txt打开后提示会有摄像头,打开qiandao.exe,解压并运行软件,对准两个聚焦圆圈,回车输出 flag。
saleae 题目名saleae,是一个逻辑分析工具,不仅可以记录数字和模拟两种信号,还可以解码 SPI、I2C、串行、1-Wire、CAN、Manchester、I2S 等协议。
下载安装软件,然后下载logicdata文件,用saleae打开,发现有4个频道。观察波形,发现channel0是具有周期性的方波,应为时钟信号。
【CTF|第12届全国大学生信息安全竞赛线上初赛Misc杂项 Write Up】根据时钟频率以及通讯方式猜测是属于 SPI 通讯,并且SPI协议正好使用了芯片上的4个引脚,猜测logicdata文件应该用SPI协议进行分析。
分析数据处出现flag,导出数据并用文本编辑器处理,得到flag。
CTF|第12届全国大学生信息安全竞赛线上初赛Misc杂项 Write Up
文章图片

SPI、I2C、USART是三种不同的通讯方式:
  1. SPI英文全称是Serial Peripheral Interface,是串行外接口的缩写,它的通讯方式特点是全双工工作、同步且高速传输,用这种通讯的话一般有一个主机和多个从机一起工作,如果是双向传输的话需要四根线,分别是:SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)四根。因此用这种方式通讯的话一般都是有多个从机设备,像人机交互界面之类。
  2. I2C英文全称是Inter-Integrated Circuit,它是一种串行总线方式。它通讯只需要两根线,一根是数据线(SDA),一根时钟线(SCL),这种通讯方式是主机和从机没有明确区分出来,但是工作时候只能有一个主机,看电路实际工作需要的方式。因为这种方式只需要两根线,因此这种连接方式应用的比较广泛,特别是一些小型产品上面,像家电类、医疗等方面。
  3. USART英文全称是Universal Synchronous/Asynchronous Receiver/Transmitter,它是一种全双工的串行接收和发送模块,它需要数据发送器、接收器以及时钟发生器三部分才能工作,而且这种工作方式很灵活,这种方式在STM系列芯片经常用到,我们日常生活当中计算机与电视连接等。
24c 同样使用saleae进行分析,将结果导出为文本格式,读取文本,发现有’ 'f163bdf4e}flag{c46d9e10-e9b5-4d90-a883-41c\tac
由题名24c得知是基于IIC协议(I2C)的EEPROM存储芯片 24c02,IIC 操作 24c02 的时候要先发送开始操作的地址,以及 NAK 停止符。
空格字符转为十进制的ASCII码为32,读取到c后为NAK且这部分正好有32个字符,因此第一部分接在读到这部分的后面。
\t 不是字符,其对应的 ASCII 是 9,也就是从第 9 号位‘9’开始将”9e”替换为 ac,得到flag。
usbasp 一样使用saleae软件进行分析,且仍然是SPI协议。打开logicdata文件,由于题干中有“一键暴打出题人”,MOSI、MISO、时钟3条线直接按0、1、2顺序默认设置,题干中有“升级固件”,修改使能(Enable)设置。
CTF|第12届全国大学生信息安全竞赛线上初赛Misc杂项 Write Up
文章图片

DaysBank 知识点:区块链
题干给出的合约是测试网Rospten上的DaysBank, 合约地址为 0x455541c3e9179a6cd8C418142855d894e11A288c, 此外还给出了合约的部分源码 broken.so:
contract DaysBank { mapping (address => uint) public balanceOf; mapping (address => uint) public gift; constructor() public { owner = msg.sender; }event SendFlag(uint256 flagnum, string b64mail); function payforflag(string b64email) public {require (balanceOf[msg.sender] >= 10000); emit SendFlag(1, b64mail); }

根据题目给出的部分源码,我们获取的信息有:
  1. 合约定义了两个mapping变量(address => uint), balanceOf 和 gift,还有为构造函数,以及发送flag的事件。
  2. 我们需要利用合约其他未开源的部分将修改balanceOf[msg…sender]以绕过payforflag函数中的检测:
    require (balanceOf[msg.sender] >= 10000)
    从而触发事件SendFlag。
  3. 修改完balanceOf[msg.sender]之后,调用payforflag函数时需要将自己的邮箱经过base64转码作为参数传递进去,若能触发事件SendFlag,很快就能收到包含flag的邮件了。

    推荐阅读