- 好早之前就想学学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 电源上。
- 数码管里 8 个 LED 的正极(阳极)全部在内部连在了一起,引出一个公共引脚
如何点亮?(电流原理)
- 水往低处流,电流也是从高电压流向低电压。因为正极已经是 5V 了,如果你想让某一个段(比如 A 段)亮起来,你必须把对应的
Arduino引脚拉低到 0V(也就是 LOW)。
这样,电流路径就通了:
5V (COM) -> LED -> Arduino引脚 (0V),灯就亮了。- 水往低处流,电流也是从高电压流向低电压。因为正极已经是 5V 了,如果你想让某一个段(比如 A 段)亮起来,你必须把对应的
- 反之亦然: 如果
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

- 记得连个电阻,不然会爆(
Arduino Uno的Pin 0和Pin 1默认是串口通信(RX/TX),如果占用了会影响程序下载和串口打印,所以一般都会避开,从Pin 2开始用。A引脚:Analog In(模拟输入引脚)。它们通常用来读取传感器的连续电压值。D引脚:数字引脚。输出非黑即白的信号(高电平 5V 亮,低电平 0V 灭)。- 然后跟着记下显示出来的字符,字符为:
6275676b757b68617264776172655f69735f736f5f656173797d,有f有d,一眼hex - 拉去转码,爆flag了
BugKu-⼚区攻击分析
- 好吧,这一题贼简单,但我没做出来,最后看了wp...
- 下载附件得到
pcap,拖去wireshark,可以看到全都是S7COMM的协议流量。
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 Data CPU服务 / 用户数据:执行 CPU 级别的服务功能或传输用户自定义的数据结构。 0xF0Setup communication 建立通信:协商最大 PDU 大小、连接资源等。 - 一般攻击发生于写入数据,所以过滤
0x05。
- 可以看到出现了一个
Malformed Packet,这是一个畸形包,于是好好查查这个包的成分( - 出现
[Malformed Packet]的原因,是网络数据包的二进制字节流违反了该协议的结构规范,导致Wireshark的解析器在执行解析代码时抛出异常或返回错误,进而中止对该数据包的解析,比如长度字段声明与实际载荷不匹配也就是超长了等等
- 点进这个包,可以看到末尾有一个异常数据,拖去
hex解码,爆flag了
BugKu-beautiful-001
- 下载得到一个
epro文件,拉去嘉立创,发现是一个PCB板,然后ctrl+F搜索一下文本,直接爆flag了。 - 其实把
epro文件转为zip再解压后,在目录搜索字符一样也可以搜到。
- 嘉立创官网:https://pro.lceda.cn/
NSSCTF-Pirated router
- 下载得到一个
bin固件,利用binwalk查看
- 内含一个
Squashfs文件系统,Squashfs文件系统主要用于嵌入式linux中,当 Linux 内核启动完毕后,就会挂载这个文件系统。 - 同时是一个非标准签名
non-standard signature,所以无法正常binwalk -e解包,要手动编译安装魔改版sasquatch才能解包。 - 解包后在
_AC10086W_FW_1.1.4.5.bin.extracted\squashfs-root\bin下发现secret_program文件,查查成分。
- 发现是一个
ELF文件,基于ARM aarch64,所以要安装一个qemu模拟器来运行,别急,先逆向一下
- 发现是一个异或加密,但是被加密的字符串被硬编码了.


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

- 是一串异或之后的十进制数,说明
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分析一下
- 前面的
Request和Response报文主要是建立连接时发送和接受的报文我认为,所以从后面的URB_INTERRUPT in和URB_ISOCHRONOUS out开始看。
URB_INTERRUPT in (中断传输 - 输入)
-> 代表数据从设备流向电脑(打字)
URB_ISOCHRONOUS out (等时传输 / 同步传输 - 输出)
-> 代表数据从电脑流向设备(音视频输出)
- 于是猜测
URB_INTERRUPT in就是从键盘输入的flag
- 左下角有一个
HID Data,HID是人机接口设备,它是 USB 协议标准中的一个特定设备类别(设备类代码为 0x03),专门用来定义人与计算机进行交互的外部设备,HID Data即外设向电脑汇报的数据,猜测可能就是键盘字母。 - 翻找
HelloWord-Keyboard文件夹,发现一个HID用途表.pdf,估计记录着字母和Hex的映射关系,找找目录喵。
- 这就是映射关系,于是要先把
URB_INTERRUPT in过滤出来。
- 右键底下的
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()
- 爆了后半段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的位置。
- 没有人类了,这真找不到喵,所以应该是
hgame{peng_zhihuh_NB_666}
评论已关闭