Rating:
#### 1.stm32
stm32f103c8t6
flash 64k, 0x08000000起始, size为0x10000
ram 20k, 从0x20000000启始, size为0x5000
再了解一下stm32的运行方式, 在外设寄存器地址配置寄存器
题目是按键锁, 那么肯定是有gpio输入实现按键功能, 按键输入只能是两种方式:
1.读gpio状态
2.外部中断
#### 2.main函数
跟进main函数第一个0x2f0,


并查阅外设地址,

可以知道这个函数实在配置RCC, 时钟部分
可以用查表的方法, 也可以用Ghidra的插件SVD-Loader也可以实现, 原理都是一样的.
然后用这个方法给其他的未知函数快速命名
##### 串口发送

可以定位到一个关于串口发送的函数, 把hex转字符之后可以看到'stcf{'字样

#### 3.中断在flash里的映射


当成一样的去看就行, 所以我就没去添加
#### 4. EXTI, DMA1中断处理函数
通过中断向量表查找中断服务函数地址

着重去看这些地址
stm32使用thumb指令, 地址+1


新建一个函数

#### 5.分析外部中断
首先是EXTI1部分
1. 首先第一个参数, 外设地址为0x4001 0414,


地址为0x4001 0400 + 0x14的偏移, 然后赋值2, 也就是0b10, 可以看到相当于是外部中断线1挂起,
剩下的EXTI2, EXTI3, EXTI4也是相同操作
2. 标志位

下一部是开始读取ram, 需要有板子进行动态调试才行........标志位去读取按键顺序, 就会把标志位+1操作,否则如果如果是5, 就继续+1.....
通过观察其他的EXTI2, EXTI3, EXTI4, 可以观察到触发中断的顺序就是1442413,
再观察最后一个EXTI3函数在DMA1处偏移0x44

20 = 0x14
0x44 - 0x14 * (4-1) = 0x8


使能DMA1发送flag
题目要求拿到密码就行所以flag: SCTF{1442413}