• 好早之前就想学学IOT了,但是一直太懒了,于是期末周摸摸鱼,研究研究IOT是个啥
  • 果然学习会降低兴奋阈值(

BugKu-easyIOT

  • 下载得到一个ino附件

    .ino 是 Arduino 的官方源代码文件格式(名字取自 Arduino 的后三个字母)
    Arduino 是一个基于单片机(Microcontroller)的开源电子原型平台,主要由标准化的硬件开发板和集成的软件开发环境组成。
    Arduino 并不是一种新的编程语言,而是一套基于 C/C++ 的库(核心层)和工具链。
    ·Bootloader(引导程序): 每块 Arduino 芯片出厂时都会预留一小段名为 Bootloader 的代码。它的作用是在单片机通电复位时,监听串口是否有新程序传来。这使得用户可以直接通过 USB 线烧录代码,而不需要购买昂贵的专用硬件编程器(如 JTAG 或 ISP 下载器)。
    ·硬件抽象层 (HAL): 在传统的单片机开发中,点亮一个引脚需要直接操作芯片的寄存器(例如写 PORTB |= (1 << 5);)。Arduino 提供了一套 C++ 函数库(如 digitalWrite()),将这些复杂的底层寄存器操作进行了封装。
    ·编译工具链: Arduino IDE 在后台调用 avr-gcc 编译器,将用户编写的 .ino 文件(本质是 C++ 代码)和 Arduino 核心库编译、链接成微控制器可以执行的机器码(.hex 文件),并通过 avrdude 工具写入芯片的闪存(Flash)中。

// Set A-G, DP as OUTPUT pins, COM is 5V
int data[] = {0, 0, 0,2,4,5,6,7,8,0,2,3,5,6,8,0,2,
    3,4,0,2,4,5,7,8,0,2,4,5,6,7,8,0,2,3,4,0,2,4,5,6,
    7,8,0,4,5,6,7,8,0,2,3,4,0,2,4,5,7,8,0,2,3,4,0,4,5,
    6,7,8,0,2,4,5,6,7,8,0,2,3,4,5,6,7,8,0,2,4,5,6,7,8,0,3,
    4,0,2,3,4,0,2,3,5,6,8,0,2,4,5,6,7,8,0,3,4,7,8,0,2,3,4,
    0,2,3,4,0,2,4,5,6,7,8,0,3,4,0,2,3,4,0,2,3,5,6,8,0,2,4,
    5,6,7,8,0,2,4,5,7,8,0,2,4,5,7,8,0,2,6,7,8,0,2,4,5,6,7,
    8,0,2,3,4,5,7,8,0,2,3,4,0,2,3,4,5,8,0,2,4,5,7,8,0,2,6,7,
    8,0,2,3,4,0,2,3,4,5,8,0,2,4,5,6,7,8,0,2,6,7,8,0,2,4,5,7,
    8,0,2,6,7,8,0,2,4,5,6,7,8,0,2,4,5,7,8,0,2,4,5,6,7,8,0,3,
    4,0,2,3,4,0,2,3,4,5,8,0,2,3,4,0,2,3,4,5,7,8,0,2,3,4,0,3,4,5,6,8};

void setup() { 
    for(int i=2; i<=9;i++) 
    pinMode(i, OUTPUT); 
}

void loop() { 
    for (int i=0; i<sizeof(data) / 2; i++) 
    data[i] == 0 ? clear() : digitalWrite(data[i], LOW); 
}

void clear() { 
    delay(1000); 
    for(int i=2; i<=9;i++) 
    digitalWrite(i, HIGH); 
delay(1000); 
}
  • 白盒审计喵
  • // Set A-G, DP as OUTPUT pins, COM is 5V说明这是一个共阳极数码管,数码管本质上就是 8 个发光二极管按特定形状封装在一起的元件。这 8 个 LED 分别命名为 A, B, C, D, E, F, G 和 DP(小数点)。
    -什么是共阳极?

    • 数码管里 8 个 LED 的正极(阳极)全部在内部连在了一起,引出一个公共引脚(COM)。题目要求把这个 COM 引脚接到 Arduino 的 5V 电源上。
  • 如何点亮?(电流原理)

    • 水往低处流,电流也是从高电压流向低电压。因为正极已经是 5V 了,如果你想让某一个段(比如 A 段)亮起来,你必须把对应的 Arduino 引脚拉低到 0V(也就是 LOW)。

    这样,电流路径就通了:5V (COM) -> LED -> Arduino 引脚 (0V),灯就亮了。

  • 反之亦然: 如果 Arduino 引脚输出 5V(也就是 HIGH),两端电压都是 5V,没有电压差,也就没有电流,灯就熄灭了。
  • data:数组就是需要拉低电平的引脚编号
  • setup:就是将 2 到 9 号引脚全部配置为 OUTPUT(输出模式),因为 Arduino 的引脚可以配置为输入(读传感器)或输出(供电/控制)。
  • loop:如果 data[i] 等于 0:执行 clear() 函数(清屏并延迟)。否则(遇到数字 2-8):执行 digitalWrite(data[i], LOW);,将对应引脚的电压设为 0V,点亮数码管的对应段。
  • clear()

    • delay(1000);:停顿 1000 毫秒,让之前点亮的字符在数码管上显示一秒钟。
    • for(...) digitalWrite(i, HIGH);:熄灭全屏。 将所有引脚设为 5V (HIGH)。正如第一部分所说,共阳极数码管两端都是 5V 时,所有灯都会熄灭。
    • delay(1000);:黑屏等待。 再次停顿 1秒,制造字符与字符之间的闪烁间隔。
  • 所有这大概是个点灯代码,可能显示出来的数字就是flag?
  • 于是,开始连线~
  • 这里贴个虚拟仿真平台:https://www.tinkercad.com/things/kIK0ZnLBxhP/editel
    2026-06-27T05:20:01.png
  • 记得连个电阻,不然会爆(
  • Arduino UnoPin 0Pin 1 默认是串口通信(RX/TX),如果占用了会影响程序下载和串口打印,所以一般都会避开,从 Pin 2 开始用。
  • A引脚:Analog In(模拟输入引脚)。它们通常用来读取传感器的连续电压值。
  • D引脚:数字引脚。输出非黑即白的信号(高电平 5V 亮,低电平 0V 灭)。
  • 然后跟着记下显示出来的字符,字符为:6275676b757b68617264776172655f69735f736f5f656173797d,有f有d,一眼hex
  • 拉去转码,爆flag了

BugKu-⼚区攻击分析

  • 好吧,这一题贼简单,但我没做出来,最后看了wp...
  • 下载附件得到pcap,拖去wireshark,可以看到全都是S7COMM的协议流量。
    2026-07-11T07:05:34.png
  • S7COMM是由西门子开发的运行于TCP 102端口的工业控制协议,其消息类型主要分为请求指令包 Job 和响应确认包 Ack_Data
  • S7COMM功能码分布:

    功能码 (Hex)功能名称 (Function)含义与常见应用场景
    0x04Read Var读变量:读取 PLC 内部状态或数据。
    0x05Write Var写变量:修改 PLC 内部数据。
    0x1ARequest download请求下载:向 PLC 发起下载逻辑代码块的请求。
    0x1BDownload block下载块:实际向 PLC 传输代码数据。
    0x1CDownload ended结束下载:代码块下载完成。
    0x1DStart upload开始上传:请求从 PLC 读取内部运行的代码逻辑。
    0x1EUpload上传:实际读取 PLC 代码数据块的过程。
    0x1FEnd upload结束上传:代码块读取完成。
    0x28PI-Service / Control程序调用 / PLC控制命令:用于高级系统控制,最典型的是用来强制 PLC 启停。
    0x63CPU Service / User DataCPU服务 / 用户数据:执行 CPU 级别的服务功能或传输用户自定义的数据结构。
    0xF0Setup communication建立通信:协商最大 PDU 大小、连接资源等。
  • 一般攻击发生于写入数据,所以过滤0x05
    2026-07-11T07:13:26.png
  • 可以看到出现了一个Malformed Packet,这是一个畸形包,于是好好查查这个包的成分(
  • 出现 [Malformed Packet] 的原因,是网络数据包的二进制字节流违反了该协议的结构规范,导致 Wireshark 的解析器在执行解析代码时抛出异常或返回错误,进而中止对该数据包的解析,比如长度字段声明与实际载荷不匹配也就是超长了等等
    2026-07-11T10:49:20.png
  • 点进这个包,可以看到末尾有一个异常数据,拖去hex解码,爆flag了

BugKu-beautiful-001

  • 下载得到一个epro文件,拉去嘉立创,发现是一个PCB板,然后ctrl+F搜索一下文本,直接爆flag了。
  • 其实把epro文件转为zip再解压后,在目录搜索字符一样也可以搜到。
    2026-07-12T13:48:01.png
  • 嘉立创官网:https://pro.lceda.cn/

NSSCTF-Pirated router

  • 下载得到一个bin固件,利用binwalk查看
    2026-07-31T02:12:23.png
  • 内含一个Squashfs文件系统,Squashfs文件系统主要用于嵌入式linux中,当 Linux 内核启动完毕后,就会挂载这个文件系统。
  • 同时是一个非标准签名non-standard signature,所以无法正常binwalk -e解包,要手动编译安装魔改版sasquatch才能解包。
  • 解包后在_AC10086W_FW_1.1.4.5.bin.extracted\squashfs-root\bin下发现secret_program文件,查查成分。
    2026-07-31T02:18:52.png
  • 发现是一个ELF文件,基于ARM aarch64,所以要安装一个qemu模拟器来运行,别急,先逆向一下
    2026-07-31T02:20:50.png
  • 发现是一个异或加密,但是被加密的字符串被硬编码了.
    2026-07-31T02:28:07.png
    2026-07-31T02:36:16.png
  • 转了几个,感觉不太像flag

小端序反转的作用范围,受限于程序每次读取的“数据类型大小”,即:只会对程序单次读取的那四个字节进行反转,而以四字节分组的所有组的总顺序是不变的。

  • 于是直接运行试试
    2026-07-31T02:43:03.png
  • 是一串异或之后的十进制数,说明unk_4543A8其实是%d,数字之间没有加上空格,ASCII粘一起了。
  • 解密脚本:
a=[104,103,97,109,101,123,117,110,112,52,99,107,49,110,103,95,102,105,114,109,119,97,114,101,95,49,115,95,51,65,115,121,125]
#32-126是ASCII码表的可见字符范围
flag=""
for i in a:
    flag+=(chr(i))
print(flag)
#hgame{unp4ck1ng_firmware_1s_3Asy}

NSSCTF-Pirated Keyboard

  • 一道键盘流量题,先打开keyboard.pcapng分析一下
    2026-07-31T03:59:46.png
  • 前面的RequestResponse报文主要是建立连接时发送和接受的报文我认为,所以从后面的URB_INTERRUPT inURB_ISOCHRONOUS out开始看。

URB_INTERRUPT in (中断传输 - 输入)
-> 代表数据从设备流向电脑(打字)
URB_ISOCHRONOUS out (等时传输 / 同步传输 - 输出)
-> 代表数据从电脑流向设备(音视频输出)

  • 于是猜测URB_INTERRUPT in就是从键盘输入的flag
    2026-07-31T04:06:31.png
  • 左下角有一个HID Data,HID是人机接口设备,它是 USB 协议标准中的一个特定设备类别(设备类代码为 0x03),专门用来定义人与计算机进行交互的外部设备HID Data即外设向电脑汇报的数据,猜测可能就是键盘字母。
  • 翻找HelloWord-Keyboard文件夹,发现一个HID用途表.pdf,估计记录着字母和Hex的映射关系,找找目录喵。
    2026-07-31T04:14:23.png
  • 这就是映射关系,于是要先把URB_INTERRUPT in过滤出来。
    2026-07-31T04:22:57.png
  • 右键底下的HID Date,选"过滤",就可以看见要过滤的对应字段名。
  • 于是过滤和导出。

在 Wireshark 中过滤出 usbhid.data 后,右键点击详情面板中的 HID Data 行选择“作为列应用”将其添加为数据列表的新列,接着通过 文件 -> 导出分组解析 -> 作为 CSV(范围选“已显示”)将数据导出,最后用记事本或表格软件打开导出的 CSV 文件,复制最后一列的十六进制数据,粘贴到一个新的纯文本文件即可。

  • 让AI写decode代码
# 定义普通按键字典(未按 Shift)
normal_keys = {
    "04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j",
    "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t",
    "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z", "1e":"1", "1f":"2", "20":"3", "21":"4",
    "22":"5", "23":"6", "24":"7", "25":"8", "26":"9", "27":"0", "28":"\n", "2a":"[DEL]", "2b":"\t",
    "2c":" ", "2d":"-", "2e":"=", "2f":"[", "30":"]", "31":"\\", "32":"#", "33":";", "34":"'", "35":"`",
    "36":",", "37":".", "38":"/"
}

# 定义按下了 Shift 键后的按键字典
shift_keys = {
    "04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J",
    "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T",
    "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z", "1e":"!", "1f":"@", "20":"#", "21":"$",
    "22":"%", "23":"^", "24":"&", "25":"*", "26":"(", "27":")", "28":"\n", "2a":"[DEL]", "2b":"\t",
    "2c":" ", "2d":"_", "2e":"+", "2f":"{", "30":"}", "31":"|", "32":"~", "33":":", "34":"\"", "35":"~",
    "36":"<", "37":">", "38":"?"
}

def decode_pcap():
    flag = ""
    with open('usbdata.txt', 'r') as f:
        lines = f.readlines()

    for line in lines:
        # 去除换行符,并兼容可能带有冒号的格式(例如 00:00:1d:00...)
        line = line.strip().replace(':', '')
        
        # 确保数据长度正确(8个字节 = 16个十六进制字符)
        if len(line) != 16:
            continue
            
        # 提取第 0 字节(修饰键状态)和第 2 字节(具体按键码)
        shift_state = int(line[0:2], 16)
        keycode = line[4:6]
        
        # 00 代表按键弹起或空包,忽略
        if keycode == "00":
            continue
            
        # 0x02 是左 Shift,0x20 是右 Shift
        if shift_state == 0x02 or shift_state == 0x20:
            flag += shift_keys.get(keycode, "")
        else:
            flag += normal_keys.get(keycode, "")
            
    print("[+] 提取出的原始字符串内容:")
    print(flag)

if __name__ == '__main__':
    decode_pcap()

2026-07-31T04:27:02.png

  • 爆了后半段flag,但前半段我怎么找都找不到,只能求助WP了。
  • 其他师父说“注意到HelloWord-Keyboard\1.Hardware\SCH_HelloWord-TouchBar_2022-07-31.pdf 的修改时间和其他文件都不一样,打开获得flag前半段”,但是在我这里看修改时间是一样的,可能是因为我刚才把整个文件从“下载”目录剪切到了其他目录导致修改时间变动...
  • 于是拼接出flag:hgame{peng_zihiui_NB_666},但交过去发现是错的,看WP发现是因为在HelloWord-Keyboard\\2.Firmware\\HelloWord-Keyboard-fw\\HelloWord\\hw_keyboard.h修改了映射,交换了H和I的位置。
    2026-07-31T04:35:15.png
  • 没有人类了,这真找不到喵,所以应该是hgame{peng_zhihuh_NB_666}