PWN知识只有不断的重复,实践才能熟悉掌握。以下知识点以LINUX系统环境下为主要说明(Windows的会有点区别)。
关于LINUX(Linux Foundation Referenced Specifications)
这里有两条命令和分别查看磁盘和内存中的ELF节和段的分布。
- 磁盘上查看节分布:
- 内存进程上查看段分布:
方法一:
可先 , //&后台进程挂起,显示pid
然后, //查看段分布方法二:
//先gdb调试
//查看段分布
以上例子仅供参照。可以自己写一个demo然后调试一步一步查看相应信息。
右图是CSAPP里面的,看不清没关系(网上一大堆),
关键了解最重要的三个寄存器作用:
- RIP控制CPU执行指令
- RSP,RBP控制函数栈帧区域(这里分享两篇硬核文章,就不重复造轮子了,好的资源就得充分利用。)
C语言函数调用栈(一)
C语言函数调用栈(二)
这两篇能帮你熟悉详细过程,同时了解PWN中栈利用最重要的一环知识—栈帧。
这两篇内容量对于初学者来说有点大,不过别灰心,只要肯多花时间一定能了解的大概(本人当初也是这么过来的,当你想放弃的时候就就参照笨笨的博主,当初我可是看了好多遍的。这样你总会信心倍增了吧,哈哈哈。)最后一点就是学习一起的最好动力就是兴趣(跟你智商高低没多大关系),如果你没兴趣,友情劝退还是别浪费时间了,这世界这么多选择,赶紧找个自己喜欢的方向发展才是对自己最好的。(哈哈哈,太哲学了,赶紧继续正题了)
- 静态链接
简单举例来说,就是你用的东西都是你自己买好的,专属于你。
- 动态链接
我用的东西都是借别人的,在需要的时候从有的地方借来用用就好了,跟别人共享着使用。
- leave等价
mov esp, ebp;
pop ebp - RETN 等价 POP EIP; sub sp, n //还起到平衡堆栈的作用
改变ESP 和 EIP(near) - RETF等价pop eip;pop cs
改变EIP和CS(far) - CALL 等价 PUSH [EIP+硬编码数]
改变ESP 和 EIP - JMP 本质只改变eip
这在我别的文章也有专门的讲解,这里简单对照即可。
- intel
opcode dst, src //源和目的操作位与AT&T正相反 - AT&T
opcodel src, dst //同时寄存器前多个%,l是代表long长整型
全面了解保护机制
1. LINUX漏洞缓解机制介绍
2.推荐作者,分析的都很详细,文章例子在他文章里附的github链接里
- 每次加载时,和都发生变化。
位置无关的代码必须使用相对寻址。
- 每次加载时,发生变化。
地址空间布局随机化(ASLR)是一种计算机安全技术,可防止利用内存损坏漏洞。 为了防止攻击者可靠地跳转到内存中的某个特定漏洞利用功能,ASLR随机排列进程的关键数据区域的地址空间位置,包括可执行文件的基础以及堆栈,堆的位置 和共享库。
NX位(不执行)是一项用于CPU的技术,用于分隔内存区域,供处理器指令(代码)存储或数据存储使用,该功能通常仅在哈佛体系结构处理器中才能使用。 但是,出于安全原因,NX位越来越多地用于常规的von Neumann体系结构处理器中。
操作系统的系统级内存保护功能。标记内存页为不可执行。
这个机制启动等级有部分开启和完全开启。
对抗canary策略
1,泄露canary值
2,泄露fs:28H内的值
3,覆写fs:28H副本值
4,劫持stack_chk_fail
5,stack smashing
6,逐字节爆破(BROP gadget,相对限制多)
GOT和PLT的理解对漏洞成因分析是很重要的,同时理解也是很绕的,分享一下各位大神的分析(望大家多多支持各位作者的分享精神)
1.GOT表 和 PLT表[这篇看完基本做PWN题就能搞懂了]
2.这里附个视频讲解的,给看文字比较难懂的同学
3.二进制漏洞挖掘之栈溢出-开启RELRO[这篇分析的很详细,加深对LINUX保护机制的理解,后半部分理解需要一定的知识积累]
4.Linux二进制ELF程序查找symbol过程分析[这篇跟3类似,从保护机制上分析PLT和GOT的内容]
为了加深理解印象,最好自己一步一步调试跟进去看看。
1,gdb调试看看got表,查看哪些函数还未被加载。
2,这里看个PUTS函数,下断
3,断下si跟进
4,来到plt表
5,重新运行,直接n步过
6,继续看看got表
已被填入puts真正地址
7,查看上面plt表中第一个jmp [got表里面的地址](0x804a014)
plt 表中,jmp [地址]。
第一次还未装载函数时,地址=got表地址(去找到函数真正地址);
第二次执行,地址=函数真正地址。
原理:动态连接程序中,本程序中含有的函数达不到需要实现的目的,需要借助中的函数实现其目的。
原理:由于在,在LINUX系统下是以为单位,即12位(2^12=4k),所以利用此规则,即便开启了地址随机化保护机制,地址的也是不变的。
下图举例说明:
然后在在线libc库查就好了
这里的offset都是。还需要得出
当然方法还有别的,只要达到目的都可行。
1.概述>
ldd命令 用于打印程序或者库文件所依赖的共享库列表。
2.语法>
ldd(选项)(参数)
3.实例>
红色标记处是一个软链接(相当于win下的快捷键)
可到目录下
查看链接属性
4.原理补充说明
首先ldd不是一个可执行程序,而只是一个shell脚本。
ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量。
ldd显示可执行模块的dependency的工作原理,其是通过ld-linux.so(elf动态库的)来实现的。我们知道,ld- linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。
实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program)
objdump 有点像那个快速查看之类的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。对于一般只想让自己程序跑起来的程序员,这个命令没有更多意义,对于想进一步了解系统的程序员,应该掌握这种工具,至少你可以自己写写shellcode了,或者看看人家给的 exploit 中的 shellcode 是什么东西。
-D表示对全部文件进行反汇编;
-b表示二进制;
-m表示指令集架构;
file就是我们要反汇编的二进制文件;
同时我们也可以指定big-endian或little-endian(-EB或-EL);
*显示file的文件头信息;
*输出目标文件的;
*显示file的Section Header信息;
显示file的全部Header信息;
输出到txt文件
- 查看PLT表
- 查看GOT表
*号的一帮经常用。
1.概述>
readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。
2.常用参数>
readelf (选项)(file)
(elf header),显示elf文件开始的文件头信息。
(program headers),segments 显示程序头(段头)信息(如果有数据的话)。
(section headers),sections 显示节头信息(如果有数据的话)。
(section groups),显示节组信息(如果有数据的话)。
(symbols) 显示符号表段中的项(如果有数据的话)。
headers 显示全部头信息,等价于: -h -l -S 。
relocs 显示可重定位段的信息。
dynamic 显示动态段的信息。
version-info 显示版本段的信息。
命令参数参考:GNU Binary Utilities(英文版)
概述>
查找文件中一些需要的和等。
工具篇_GCC
工具篇_GDB
转换成16进制模式看 //[ ]内可选
还原
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/11593.html