[PWN][基础篇]保护函数和溢出实例

简介: [PWN][基础篇]保护函数和溢出实例

[PWN][基础篇]保护函数和溢出实例

一、常见的保护

1、CANARY(栈保护)

2、NX(DEP)

3、PIE(ASLR)

二、神奇的小知识

1、如何检查文件的保护情况

2、编译时如何关闭这些保护呢

3、查看程序使用了哪些函数

三、实例教学


一、常见的保护

1、CANARY(栈保护)

栈溢出保护是一种缓冲区溢攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行,当启动栈保护后,函数开始执行的时候会显往栈里插入cookie的信息,当函数真正返回的时候会验证cookie信息是否合法,如何不合法就停止程序运行。攻击者在覆盖返回地址的时候往往会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中的cookie信息成为canary。

2、NX(DEP)

NX是不可执行的意思,nx(dep)的原理就是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意代码

3、PIE(ASLR)

一般情况下NX和地址空间分布随机化(aslr)是会同时工作

内存地址随机化机制,有三种情况

0-表示关闭进程地址空间随机化

1-表示将mmap的机制,stack和vdso页面随机化

2-表示在1的基础上增加栈(heap)的随机化

可以防范基于Ret21bc方式的针对dep的攻击。aslr和dep配合使用,可以有效阻止攻击者在堆栈上运行恶意代码

二、神奇的小知识

1、如何检查文件的保护情况

checksec 文件名(要以root权限执行)

image.png

2、编译时如何关闭这些保护呢

gcc -no-pie -fno-stack-protector -Z execstack -m32 -o read read.c

3、查看程序使用了哪些函数

objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具

-j hello

仅仅显示指定名称为hello的section的信息

-t 显示文件的符号表入口

objdump -t -j .text hello

查看hello程序的.text段有哪些函数

image.png

三、实例教学

image.png

编译指令等请参照上一篇博客

我的上一篇文章


后续的操作如下:

image.png

这里我们分析一下,首先是sub esp,0x24,然后sub eso,0x4,所以在esp上方有0x28的空间,我们的目的是执行exploit的函数,所以我们就要覆盖到ret指令。


下面是我们的exp,我是用的是python来写

image.png

首先要导入pwn包,第二步我们要获得进程,也就是read程序了,再写偏移offset,也就是0x28+0x4,,然后写payload,我们要覆盖,这里我用a来覆盖,offset次,再加上我们的返回地址,也就是在disass exploit中我们push ebp的地址,p32()是告诉电脑,这是个32位地址如下图:

image.png

字符a将0x28覆盖了,同时也覆盖了0x4(ebp),多出来的就将覆盖ret了,也就是上图中红框的地址。


然后我们写payload,使用sendline函数,发送内容是我们的payload。


最后我们获取一下运行环境,也就是p.interactive()


写好exp之后,可能没有权限,这个时候要提权,也就是chmod 777 exp.py,然后执行即可,结果如下图:

image.png

出现了$符号,说明我们已经获得了root权限了!


希望大家可以有所收获!!!

相关文章
|
8月前
|
存储 C语言
学习总结(位操作符;循环输入的三种方式;交换两个变量值的三种方法;打印数字对应的二进制;unsigned int 与int 的区别;改变特定位数0/1;&&和||的连续操作(与前置,后置结合))
学习总结(位操作符;循环输入的三种方式;交换两个变量值的三种方法;打印数字对应的二进制;unsigned int 与int 的区别;改变特定位数0/1;&&和||的连续操作(与前置,后置结合))
83 0
|
8月前
|
Linux 编译器 C语言
start.S详解学习(四):设置堆栈 sp 指针
start.S详解学习(四):设置堆栈 sp 指针
334 0
|
前端开发 rax Shell
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)(上)
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)
835 0
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)(上)
|
编译器 C语言 C++
scanf函数不能运行(VS2019)(解决方案)
直接放在拷贝文档里,以后每次建立新项目时就会自动添加这行代码(详情请看本人空间的:VS文件初始化教程)
220 0
scanf函数不能运行(VS2019)(解决方案)
|
C语言
复习C部分:1.设置关机程序 2.函数(strcpy,memset----替换函数;库函数;写一个函数,用该函数实现比较两个数的最大值;写一个数,交换两个整数类型的值)
复习C部分:1.设置关机程序 2.函数(strcpy,memset----替换函数;库函数;写一个函数,用该函数实现比较两个数的最大值;写一个数,交换两个整数类型的值)
103 0
微机原理:当前CS=1000H,IP=0280H,SP=1800H,PS=W0241H,执行INT 7后,寄存器和栈顶相关单元的内容
微机原理:当前CS=1000H,IP=0280H,SP=1800H,PS=W0241H,执行INT 7后,寄存器和栈顶相关单元的内容是什么?
229 0
微机原理:当前CS=1000H,IP=0280H,SP=1800H,PS=W0241H,执行INT 7后,寄存器和栈顶相关单元的内容
|
NoSQL Shell
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)(下)
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)
295 0
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)(下)
|
Shell Linux
[PWN][进阶篇]ROP_Ret2Shellcode-32实例(下)
[PWN][进阶篇]ROP_Ret2Shellcode-32实例
185 0
[PWN][进阶篇]ROP_Ret2Shellcode-32实例(下)
|
安全 Shell Linux
[PWN][进阶篇]ROP_Ret2Shellcode-32实例(上)
[PWN][进阶篇]ROP_Ret2Shellcode-32实例
210 0
[PWN][进阶篇]ROP_Ret2Shellcode-32实例(上)