怎样编程 *** 作stm8的option byte

怎样编程 *** 作stm8的option byte,第1张

1.选项字节的概念(参考stm8s中文数据手册):

         选项字节包括芯片耐乱吵硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的

块内。除了ROP(读出保护)字节,每个选项字节陪余必须被保存两次,一个是通常的格式(OPTx)和

一个用来备份的互补格式(NOPTx)。可以在ICP模式(通过SWIM)下访问下表中EEPROM的地址来修改选项字节。

选项字节也可以通过应用程序在IAP模式下修改,但是ROP选项只能在ICP模式(通过SWIM)下被

修改。

2.ISP IAP ICP的概念(有待学习):

ISP:In System Programing,      在系统编程   程序完全下载

IAP:In applicating Programing,在应用编程   我的理解是用应用程序去修改芯片里边固定的一些数据(与应用编程无关的数据)

ICP:In Circuit Programing,        在电路编程

3.stm8s芯片的备用功能重映射:

     stm8s芯片上带有很多备用的功能,这些功能必须使用重映射功能才能实现,

     重映射其实就是配置某个flash地址的某一位,使某个引脚具备备用功能或者默认功能的其中一个

     而且一旦功能改,想恢复原来的功能必须重新写入。

   

     比如stm8s的PD4端口具有TIM2_CH1 功能和BEEP功能,默认的情况下是TIM2_CH1功能,

     当我们要用到BEEP功能时必须写选项字,将这个引脚重映射为BEEP功能。

4.库函数实现重映射

//对于stm8s的选项字昌侍地址为0x4803

#define Beep_OptionAdd  0x4803

   void Set_Beep_OptionByte(void)

   {

    uint16_t Beep_Option_status/*记录激活备选功能Beep/TIM2_CH1的状态*/

    Beep_Option_status=FLASH_ReadOptionByte(Beep_OptionAdd)

    /*Beep_Option_status的最高位为1激活了Beep,否则不激活,为TIM2_CH1*/

     if((Beep_Option_status&0x8000))

     {

      FLASH_ProgramOptionByte(Beep_OptionAdd, (uint8_t)(Beep_Option_status&0x7fff))

    /*向Beep_OptionAdd  0x4803 置0,不激活激活了Beep,恢复TIM2_CH1通道*/

     }

  }

利用ret2libc3实验原理,用pwn的文件来尝试一下。

首先,拿到了一个pwn文件,用IDA女神看看源程序是什么样子的。

这里有read函数,看困盯来可以靠栈的溢出来实现getshell。

这次相比实验二的难点在于不允许使用system函数,然后都需要自己找到。

system 函数属于 libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的。

也就是说可以通过泄露出某个函数的地址,减去在libc中的相对偏移,就能得到libc的基址,利用system的相对偏移就可以找到system函数。这里利用了puts函数。

为了得到libc中函数的地址,我们用的是got表泄露。涉及到got表与plt表的关系,大家可以去这里看一下。

GOT表和PLT表知识详解 - qq_18661257的专栏 - CSDN博客

国际惯例,看一哈文件保护,果然没什么有效的保护。

接下来就是找system函数的地址,写个脚本,主要是为了实现与pwn文件交互。

这两句可以理解为搭调试的环境,方便动态调试。

下面进行puts地址的泄露。

我们是在文漏消件第一次执行的返尺知时候泄露puts。payload的作用如下图所示,将read函数的返回值赋为puts.plt,main函数的地址又为puts函数的返回值,puts.got作为puts函数的参数,泄露puts函数的地址。

主函数的地址在IDA里可以看到,至于填充多少个字符,方法在实验二讲述过。

main = 0x080484FD

接下来就是利用泄露出来的地址找到system和字符串_bin_sh。

LIbcSearcher利用泄露的puts函数的地址找到libc的版本,libc.dump可以查出偏移量,进而找出libcbase,也就是库函数的基址,再加上system的偏移就可以得到它的地址。

在脚本终端可以看到打印的地址。

puts:0xf7df9140

system:   0xf7dd4940

binsh:  0xf7ef302b

输入ls,可以看到电脑中的文件,getshell,也可以看看我是谁,hh。

唉,实验做出来不容易,环境崩了以后调了好久,网上的方法都试过了,没有用(Tina噜,我的电脑和大家的不一样妈?!!!)。

最后将编译器重新装了一遍就好了......哭辽。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12348819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存