搜索
bottom↓
回复: 49

stm32逆向与安全科普系列第一篇:bin文件逆向小试

  [复制链接]

出0入17汤圆

发表于 2020-9-7 20:19:02 | 显示全部楼层 |阅读模式
本帖最后由 ilovepp 于 2020-9-7 20:19 编辑

首先你要有一个bin文件(bin文件的获取方法不在此展开介绍,今后有机会可以专门开一个贴聊一聊)。本次实验用到的bin文件是用ST官方CMSIS和外设库编译的跑在stm32f103c8t6上的bin文件,比较具有代表性。

工具准备:安装开源跨平台逆向神器r2 https://github.com/radareorg/radare2 ,r2可运行在Windows、Linux、Mac等所有主流操作系统上(r2有多牛逼不在此展开介绍,今后有机会可以专门开一个贴聊一聊)。

实验步骤:
1)输入r2 -a arm -b 16 -m 0x08000000 stm32_xwrtos.bin 进入r2的控制台后,输入e asm.cpu=cortex。这一步是告诉r2以0x08000000为基址加载stm32_xwrtos.bin文件,并设置指令集为cortex系列的thumb。


2)输入aaaa,运行自动化分析。


3)输入pxw 268 @0x08000000 以小端四字节形式打印从0x08000000开始的268(268对应中断向量表大小)个字节,同时打开ST官方的启动文件startup_stm32f10x_md.s并找到.isr_vector段进行对照。


4)接着上一步,输入fs notes,创建并切换到一个名为notes(可以是任意其他名字)的符号记事本;按照f flag=address的形式,对照.isr_vector段,向符号记事本中录入感兴趣的符号地址对应关系。注意如果address是函数地址则需要减1(因为thumb指令的要求,具体原因此处不展开);最后输入af @flag形式的命令强制进行函数分析。


5) 输入pdf @Reset_Handler,对Reset_Handler函数进行反汇编

输入 VV 切换到流程图视图

通过阅读汇编代码,可以得到以下信息:
        1.  data段的地址区间为0x20000000-0x20000028 bss段的地址区间为0x20000028-0x2000043C
        2.  Reset_Handler用0x08002cbc开始的0x28字节初始化data段,用0填充bss段
        3. 调用fcn.08001cc8函数
        3. 调用fcn.08001734函数

6)输入pdf @fcn.08001cc8进行反汇编

发现对外设寄存器地址0x40021000的引用

通过查询数据手册,可判断fcn.08001cc8函数应为系统初始化化函数SystemInit(),它初始化了时钟

7)根据经验判断fcn.0800173函数即为main函数

我是分割线

本篇作为系列第一篇文章,主要作用是带大家熟悉和习惯r2的基本使用,以及对逆向有个感性认识。下一篇计划在逆向的基础上介绍stm32上的栈溢出漏洞的挖掘与利用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入42汤圆

发表于 2020-9-7 20:25:49 来自手机 | 显示全部楼层
这个牛逼,那可以通过这个学到怎么防止或者增加反向难度吗?

出0入0汤圆

发表于 2020-9-7 20:28:52 | 显示全部楼层
用C++,继承层数多些,搞几个虚函数,再试试

出0入17汤圆

 楼主| 发表于 2020-9-7 20:32:22 | 显示全部楼层
我是一个大白菜 发表于 2020-9-7 20:25
这个牛逼,那可以通过这个学到怎么防止或者增加反向难度吗?

当然,这也是我写这个系列的初衷

出0入0汤圆

发表于 2020-9-7 20:34:47 | 显示全部楼层
这个不错,学习一下,防止破解

出0入17汤圆

 楼主| 发表于 2020-9-7 20:36:37 | 显示全部楼层
armku 发表于 2020-9-7 20:28
用C++,继承层数多些,搞几个虚函数,再试试

C++的逆向不算啥,只要不是高阶vmp虚拟机这种都可逆

出0入147汤圆

发表于 2020-9-7 20:43:25 | 显示全部楼层
像这样直接出伪代码的,才算神器
复位函数:
  1. void UndefinedFunction_0800168c(void)

  2. {
  3.   int iVar1;
  4.   undefined4 *puVar2;
  5.   
  6.   iVar1 = 0;
  7.   while (puVar2 = DAT_080016c8, (uint)(DAT_080016c0 + iVar1) < DAT_080016c4) {
  8.     *(undefined4 *)(DAT_080016c0 + iVar1) = *(undefined4 *)(PTR_DAT_080016bc + iVar1);
  9.     iVar1 = iVar1 + 4;
  10.   }
  11.   while (puVar2 < DAT_080016cc) {
  12.     *puVar2 = 0;
  13.     puVar2 = puVar2 + 1;
  14.   }
  15.   FUN_08001cc8();
  16.   FUN_08001734();
  17.   return;
  18. }
复制代码


SystemInit
  1. void FUN_08001cc8(void)

  2. {
  3.   uint *puVar1;
  4.   uint *puVar2;
  5.   uint *puVar3;
  6.   uint uVar4;
  7.   int local_10;
  8.   
  9.   uVar4 = DAT_08001dc0;
  10.   puVar1 = DAT_08001dbc;
  11.   *DAT_08001dbc = *DAT_08001dbc | 1;
  12.   puVar1[1] = uVar4 & puVar1[1];
  13.   *puVar1 = *puVar1 & 0xfef6ffff;
  14.   *puVar1 = *puVar1 & 0xfffbffff;
  15.   puVar1[1] = puVar1[1] & 0xff80ffff;
  16.   puVar1[2] = 0x9f0000;
  17.   local_10 = 0;
  18.   *puVar1 = *puVar1 | 0x10000;
  19.   puVar3 = DAT_08001dc8;
  20.   puVar2 = DAT_08001dbc;
  21.   do {
  22.     local_10 = local_10 + 1;
  23.     if ((*puVar1 & 0x20000) != 0) break;
  24.   } while (local_10 != 0x500);
  25.   uVar4 = *DAT_08001dbc & 0x20000;
  26.   if (uVar4 != 0) {
  27.     uVar4 = 1;
  28.   }
  29.   if (uVar4 == 1) {
  30.     *DAT_08001dc8 = *DAT_08001dc8 | 0x10;
  31.     *puVar3 = *puVar3 & 0xfffffffc;
  32.     *puVar3 = *puVar3 | 2;
  33.     puVar2[1] = puVar2[1];
  34.     puVar2[1] = puVar2[1];
  35.     puVar2[1] = puVar2[1] | 0x400;
  36.     puVar2[1] = puVar2[1] & 0xffc0ffff;
  37.     puVar2[1] = puVar2[1] | 0x1d0000;
  38.     *puVar2 = *puVar2 | 0x1000000;
  39.     puVar1 = DAT_08001dbc;
  40.     do {
  41.     } while (-1 < (int)(*puVar2 << 6));
  42.     puVar2[1] = puVar2[1] & 0xfffffffc;
  43.     puVar2[1] = puVar2[1] | 2;
  44.     do {
  45.     } while ((puVar1[1] & 0xc) != 8);
  46.   }
  47.   *(undefined4 *)(DAT_08001dc4 + 8) = 0x8000000;
  48.   return;
  49. }
复制代码


Main函数
  1. void FUN_08001734(void)

  2. {
  3.   FUN_08000840();
  4.   FUN_080017c0();
  5.   FUN_0800131c(DAT_08001798,8,DAT_08001794);
  6.   FUN_0800074c(PTR_DAT_080017a4,0,DAT_080017a0,0x100,PTR_s_IdleTask_0800179c,0);
  7.   FUN_0800074c(PTR_LAB_080016de+1_080017b0,0,DAT_080017ac,0x100,PTR_s_Task1_080017a8,1);
  8.   FUN_0800074c(PTR_FUN_08001708+1_080017bc,0,DAT_080017b8,0x100,PTR_s_Task2_080017b4,2);
  9.   FUN_08000850();
  10.   do {
  11.                     /* WARNING: Do nothing block with infinite loop */
  12.   } while( true );
  13. }
复制代码

出0入0汤圆

发表于 2020-9-7 20:44:42 | 显示全部楼层
C编程的程序,IDA-F5可以导出C代码,C++的代码难度高很多

出0入17汤圆

 楼主| 发表于 2020-9-7 20:47:09 | 显示全部楼层
dreampet 发表于 2020-9-7 20:43
像这样直接出伪代码的,才算神器
复位函数:

你用你的ida F5,我玩我的radare2

出0入147汤圆

发表于 2020-9-7 20:49:06 | 显示全部楼层
ilovepp 发表于 2020-9-7 20:47
你用你的ida F5,我玩我的radare2

并不是IDA

出0入0汤圆

发表于 2020-9-7 20:49:14 | 显示全部楼层
dreampet 发表于 2020-9-7 20:43
像这样直接出伪代码的,才算神器
复位函数:

这个牛b了,,,哈哈哈

出0入17汤圆

 楼主| 发表于 2020-9-7 20:53:49 | 显示全部楼层
本帖最后由 ilovepp 于 2020-9-7 20:56 编辑


radare2用插件也可以反编译,只不过反编译精度比ida稍差,radare2还可以做到全架构模拟执行。我选择radare2的原因在于它可以pipeline到unix的命令行工具,还有更重要的是可以做为frida动态插桩工具的前端进行交互式动态调试,例如r2frida。

出0入984汤圆

发表于 2020-9-7 21:01:37 | 显示全部楼层

snowman ?

出0入147汤圆

发表于 2020-9-7 21:06:05 | 显示全部楼层
ilovepp 发表于 2020-9-7 20:53
radare2用插件也可以反编译,只不过反编译精度比ida稍差,radare2还可以做到全架构模拟执行。我选择radar ...

嗯 这些软件各有所长, 我的主要需求是冷门平台的算法逆向, 目前以ghidra为主,r2为辅。

出0入147汤圆

发表于 2020-9-7 21:06:25 | 显示全部楼层

美国国土安全局开源的 ghidra

出0入12汤圆

发表于 2020-9-8 09:22:41 | 显示全部楼层
这个牛X了

出190入0汤圆

发表于 2020-9-8 09:57:40 | 显示全部楼层
这个主题不错,搬凳子学习

出0入0汤圆

发表于 2020-9-8 10:11:19 | 显示全部楼层
现在STM32程序  ,防止复制都用ID加密,并且会将ID 影藏的很深。
不到 有守就有攻

出0入0汤圆

发表于 2020-9-8 10:11:49 | 显示全部楼层
这个比较厉害了,跟进学习

出0入45汤圆

发表于 2020-9-8 10:40:32 | 显示全部楼层
这个牛逼!学习下

出0入79汤圆

发表于 2020-9-8 11:15:29 来自手机 | 显示全部楼层
dreampet 发表于 2020-9-7 20:43
像这样直接出伪代码的,才算神器
复位函数:


你这个确实好。

请问是怎么搞的?谢谢!

出0入0汤圆

发表于 2020-9-8 11:17:27 | 显示全部楼层
这个厉害了,学习学习

出0入8汤圆

发表于 2020-9-8 11:50:09 来自手机 | 显示全部楼层
反编译工具要用好需要写一些有针对性的插件
之前为了研究STM32的代码,就做了个从HAL库头文件中提取常量定义的玩意,地址变名称会方便很多
楼主这个工具能不能模拟外设的执行,或者有没有提供模拟外设的接口

出0入0汤圆

发表于 2020-9-8 12:05:18 来自手机 | 显示全部楼层
这个有点牛逼

出0入0汤圆

发表于 2020-9-8 14:41:35 | 显示全部楼层
这个比IDA好吗

出0入0汤圆

发表于 2020-9-8 16:18:30 | 显示全部楼层
这个牛逼,标记一下.

出0入42汤圆

发表于 2020-9-9 06:35:23 来自手机 | 显示全部楼层
逆向为什么不发看雪?

出0入0汤圆

发表于 2020-9-9 10:20:41 | 显示全部楼层
感谢楼主分享,期待第二篇

出90入0汤圆

发表于 2020-9-9 11:07:56 | 显示全部楼层
只能 反汇编 得到 汇编语言,
可以破解用,
但修改什么,就傻眼了。

出0入0汤圆

发表于 2020-9-9 13:47:54 | 显示全部楼层
ghidra这个牛逼,比ida还好的样子

出0入17汤圆

 楼主| 发表于 2020-9-9 14:03:59 | 显示全部楼层
farmerzhangdl 发表于 2020-9-9 13:47
ghidra这个牛逼,比ida还好的样子

ghidra俗称鸡爪

出0入8汤圆

发表于 2020-9-9 14:20:10 | 显示全部楼层
dreampet 发表于 2020-9-7 20:43
像这样直接出伪代码的,才算神器
复位函数:

你搞的那个mcal,让我太受用啦。可惜没有eb的河蟹,eb用的是flexnet

出0入8汤圆

发表于 2020-9-9 14:21:36 | 显示全部楼层
这个字体叫什么名字,挺好看的。我换到我的开发环境上试试

出95入100汤圆

发表于 2020-9-9 14:57:14 | 显示全部楼层
dreampet 发表于 2020-9-7 20:43
像这样直接出伪代码的,才算神器
复位函数:

大神,这个是哪个工具?

出0入24汤圆

发表于 2020-9-9 16:33:41 | 显示全部楼层
这个牛逼,学习一下!
感谢楼主分享!

出0入0汤圆

发表于 2020-9-9 23:55:32 来自手机 | 显示全部楼层
mark标记一下,不错

出0入0汤圆

发表于 2020-9-10 08:55:31 | 显示全部楼层
能逆向出c代码确实牛。

出0入0汤圆

发表于 2020-9-10 09:33:19 | 显示全部楼层
厉害了  学习下

出0入0汤圆

发表于 2020-10-6 10:48:27 | 显示全部楼层
good!                       

出0入54汤圆

发表于 2020-10-12 16:31:02 | 显示全部楼层
啥字体这是 很好看

出0入0汤圆

发表于 2020-10-12 16:46:14 | 显示全部楼层
我有一个DOS程序,想反编译,有什么工具推荐一下

出420入0汤圆

发表于 2020-10-24 20:10:04 | 显示全部楼层
得学学实践经验的

出0入0汤圆

发表于 2020-10-25 10:25:27 | 显示全部楼层
值得学习

出0入0汤圆

发表于 2020-10-25 14:51:32 | 显示全部楼层
逆向比正向费劲,反汇编也不是啥高科技,犯不着这么起劲吧

出0入0汤圆

发表于 2020-12-31 22:09:30 | 显示全部楼层
没有下文了么?

出0入0汤圆

发表于 2020-12-31 22:23:21 来自手机 | 显示全部楼层
太高科技了

出0入0汤圆

发表于 2020-12-31 23:45:55 | 显示全部楼层
非常牛掰,保持关注。

出0入0汤圆

发表于 2021-1-1 12:50:12 | 显示全部楼层
本帖最后由 pengshicao 于 2021-1-1 12:51 编辑

固件除了采用ID防反复制外,还应根据自己产品的特点添加产品自己特有的反复制方法.即便破了ID这一关,还有别人不知道的另一关,这一关才是关键.比如有的产品需要校准,只有校准才能使用,而如何校准只有制造商知道,用户并不知道,假如这个校准挺麻烦需要制造商辅助特殊工具和方法才能完成,就更增加破解难度,除非破解者能看懂反汇编代码,这样花费的精力和时间还不如自己重做来的快.

出0入79汤圆

发表于 2021-1-1 14:50:15 来自手机 | 显示全部楼层
搞逆向的很大部分原因就是因为自己写不出同样功能或性能的程序,不是学了单片机就能搞定所有开发的。

出0入0汤圆

发表于 2021-1-9 01:06:52 | 显示全部楼层
没玩过,保持关注。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 23:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表