2021HWS硬件安全在线夏令营总结
Day1IOTIOT是一个完整的信息系统,它包括软件和硬件两个组成部分,也PC不同的是,他们主要的业务就是操控硬件设备,其实IOT在每个人眼中都有不同的看法,人云亦云,对于软件开发者来说,IOT是业务,是设备的的业务实现,对于网络安全从业者来说,就是硬件设备,它硬件上有我们可攻击的漏洞
那么一个完整的IOT设备它应该有云端,设备硬件端 ,APP端,三个切入点
通常我们都是从设备端或者是APP端来进行攻击,那么关注设备端就是关注这个设备从开始到启动的全过程,就是bios -> bootloader -> 操作系统 -> init.d -> 业务
固件简介所谓”固件”,顾名思义,就是”固化在设备中的软件”,通常而言指的是 Flash 中被固化、执行固定功能的软件,需要注意的是固件是软件,是嵌入式设备中会被CPU所执行的代码
固件的获取
固件的解包固件的解包一般有两种方法,binwalk和mount,binwalk在大多数情况下都管用,binwalk不管用的时候,mount可能会有奇效
binwalk
123binwalk -Me *.bin #递归提取binw ...
main真的是函数入口吗?
在我们开始学习C语言的时候,老师就跟我们讲”main函数就是程序开始执行的地方”,所有的代码都是从这里开始的,可事实真的是这样的吗?
“所有”?这个词似乎有点以偏概全,如果main函数就是一切的开始,那么程序的堆栈,main函数传递的参数,I/O操作是凭空出现的吗?显然不是,是操作系统在main函数之前,就已经帮我们初始化好了一切,所以我们的main函数才能顺利执行,那么入口点不是main,那会是谁呢?我们可以编译一个静态的demo并对main函数进行交叉引用一下,可以发现它的名字叫start,当我们跟进去的时候,就能发现另一个新的世界!
123456789 #include<stdio.h> int main(void){ printf("welcome to exit\n"); exit(0); return 1;}//gcc exit.c -o exit -no-pie -static
在IDA里面可以看到_start的汇编,_start可以分为两个部分上半部分
上面的_star ...
高级ROP链构造方法(一)-- SROP
在不同版本的 Unix 系统中被使用了 40 多年的 Signal 机制,存在一个很容易被攻击者利用的设计缺陷,针对这种攻击的手法叫做SROP,和传统的 ROP 攻击相比显得更加简单,可靠,可移植,虽然离提出的时间已经过去了许久,但在CTF的赛场上仍然存在着SROP的攻击手法,不过在CTF的SROP更多的是作为一种辅助ROP来使用,让exp的编写更加的简便,比如ORW+SROP。
此攻击手法首次提出是在安全顶会Oakland 2014,原文看的太难受了,看看会议PPT就好了,SROP也算作比较高级一点的ROP了,接下来慢慢看它是怎么攻击的
Signal 机制在开始介绍SROP之前,肯定要介绍Signal 机制,就拿出老生常谈的一张Signal 信号的调用流程图:
①内核向进程发送Signal 信号,此进程挂起并进入用户态程序,进行ucontext save,即往栈上压入ucontext和siginfo,主要是将所有寄存器压入栈中,以及压入 Signal 信息
最后压入指向 sigreturn 的系统调用地址,需要注意到的一点是,这一切的操作都是在栈上进行,也就是说这段区域在 ...
栈漏洞系列(一)-- 栈迁移
原理当溢出的长度太小时,可以通过leave_ret_gadget来将ebp和esp迁移到我们想要的位置,比如:一个咱已经布置好ROP链的地方
假设在栈上布置如下的ROP链,我将通过图片来展示攻击效果
布置好之后,每个程序就返回前都会恢复栈,就如下图的程序,所以我们就等待程序leave ret:
leave就是等价于上面说到的那段汇编代码,首先执行的是mov esp,ebp,这会让图中的0x108放入到esp中,我们的栈就会发生如下变化:
接着就是pop ebp,诶~,这时候我们的ebp就变成了我们想要迁移的位置了:
我们在回顾一下栈上的情况,因为刚刚pop ebp,所以我们的esp指向了leave_ret这个gadget:
所以程序又执行了一次leave,我们迁移后的栈就会变成这样:
非常的神奇吼!我们的esp指向了system函数!也就是说我们已经成功的获取了shell!!!
可能有读者要问了:啊?,你这ebp不是栈底寄存器吗?他怎么指向了一个奇怪的地方,你这不行啊?,对,此时的ebp已经指向了一个奇怪(后面的例题会展示奇怪的点)的地方,但是问题不大,我们只要 ...
linux运行机制(一)-- 延迟绑定
程序在动态载入内存的时候并不会将所有函数都加载进内存,而是采用延时绑定的机制,即当真正使用当该函数的时候才将GOT表中的地址转化成真实的地址,
写一个简单的demo进行测试:
1234567#include <stdio.h>int main(void) { puts("Hello world!"); return 0;}//gcc -m32 -no-pie -g -o got_plt got_plt.c
编译完成后,我们进入gdb进行调试,先将程序反汇编,我们来看看在那下断点合适,我们既然要研究PLT和GOT表,那肯定要断在call put这条汇编指令这吧,下断点我们来看看
下完断点,我们运行起来,单步步入就来到图中的地方,它先跳到_GLOBAL_OFFSET_TABLE_里面,也就是我们说的GOT表,那它会JMP到哪里去呢?等下揭晓….
我们用pwndbg查看一下这个位置存了什么,是不是有点眼熟,这不就是刚刚JMP的下一条指令的地方吗?没错它又跳回来了…紧接着它push了一个参数又往下跳转了,又push了一个参数就 ...
梦开始的地方
ZYen的小站自今天起就正式开张啦!之前买服务器搭博客不得劲,现在正式转为github辽,文章的日期可能有点问题,不过无伤大雅,愿自己热爱的事情最终都能有个好结果!(撒花✨)