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噜,我的电脑和大家的不一样妈?!!!)。
最后将编译器重新装了一遍就好了......哭辽。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)