PWN_ret2text,ret2syscall,ret2shellcode
首先了解下Linux中的保护机制(具体的绕过等后续再说)
1.canary(栈保护)
在函数开始时就随机产生一个值,将这个值CANARY放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲区溢出覆盖ebp或者ebp下方的返回地址时,一定会覆盖掉CANARY的值;当程序结束时,程序会检查CANARY这个值和之前的是否一致,如果不一致,则不会往下运行,从而避免了缓冲区溢出攻击。
2.NX(no execute)
数据不可执行。原理是将数据所在内存页标识为不可执行,防止因为程序运行出现溢出而使得攻击者的shellcode可能会在数据区尝试执行的情况。NX是对栈和堆的一种保护机制。实验需要关闭NX和地址随机化,否则执行shellcode时,CPU就会抛出异常,而不是去执行恶意指令。
Linux系统叫做NX,Windows系统中类似的机制叫DEP(Data Execute Prevention)。
3.PIE(position-independent executables)
地址随机化。
4.ASLR
代码部分地址无关
Ret2text
首先file和checksec一下:

ida打开:

观察到有个vulnerable()函数:

还有个后门函数:get_shell()

gdb打开,main处下断点后跟进,输入12345678后查看stack:

此时ebp= 0xffffd108,

将黄色与红色全部覆盖后填入get_shell()的地址。
exp如下:

getshell:

ret2shellcode
首先file和checksec一下:

发现rwx并且没有开NX保护,所以代码在堆,栈上可以执行
进入IDA查看,发现这题并没有后门函数,将gets到的s拷贝到buf2.

查看buf2所在的bss段是否可执行

main处下断点后run起来,此时ebp=0xffffd118!

exp如下:

shellcraft.sh()是一段shellcode,ljust()是左对齐,不足处用a填充,画图来说就是这样:

ret2syscall
首先file和checksec一下:

这题是静态链接的,所以比较大,
ida查看,有/bin/sh,但是没有system函数,
Linux的系统调用通过int 80h和寄存器来实现,其中eax存放系统调用号,过程如下:
1.先将系统调用号放入eax
2.将该函数需要的其他参数存入其他寄存器
3.出发0x80中断(int 0x80h)
所以我们需要一些pop和ret指令,这些小片段叫gadget,可以使用ROPgadget这个工具,
本次要用到的:execve("/bin/sh",0,0)
eax = 0xb --->系统调用号
ebx = address of "/bin/sh"
ecx = 0
edx = 0

可以看到有许多gadget,选一些有用的就OK。
gdb调试,ebp:0xffffd128

exp如下:

画图来说就是:(下图并不是上面exp的图)

PWN_ret2text,ret2syscall,ret2shellcode的更多相关文章
- Ret2shellcode
利用原理 ret2shellcode,即控制程序执行 shellcode 代码.一般来说,shellcode 需要我们自己填充.这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码 ...
- stackoverflow的ret2syscall利用
ret2syscall 系统调用 ret2syscall,即控制程序执行系统调用,获取shell.Linux将内核功能接口制作为系统调用(system call),可在程序中直接调用.程序中存在int ...
- 再识ret2syscall
当初学rop学到的ret2syscall,对int 0x80中断了解还不是很深,这次又复习了一遍.虽然很简单,但是还是学到了新东西.那么我们就从ret2syscall开始吧. IDA一打开的时候,就看 ...
- PWN菜鸡入门之栈溢出(1)
栈溢出 一.基本概念: 函数调用栈情况见链接 基本准备: bss段可执行检测: gef➤ b main Breakpoint at . gef➤ r Starting program: /mnt/ ...
- pwnable.kr-echo1-Writeup
pwnable.kr - echo1 - writeup 原文链接:https://www.cnblogs.com/WangAoBo/p/pwnable_kr_echo1.html 旧题新做,发现这道 ...
- pwn之ret2libc
0×01 利用思路 ret2libc 这种攻击方式主要是针对 动态链接(Dynamic linking) 编译的程序,因为正常情况下是无法在程序中找到像 system() .execve() 这种系统 ...
- 渗透入门rop
原文链接:https://blog.csdn.net/guiguzi1110/article/details/77663430?locationNum=1&fps=1 基本ROP 随着NX保护 ...
- 【pwn】学pwn日记——栈学习(持续更新)
[pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...
- Pwn学习随笔
Pwn题做题流程 使用checksec检查ELF文件保护开启的状态 IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试) 编写python的exp脚本进行攻击 (若攻击不成功)进行GDB动态调试 ...
随机推荐
- 主数据管理(MDM)的6大层级简述,你不可不知的数据治理参考!
前面我写了一篇关于对元数据和元数据管理的认知和理解的文章,有兴趣的朋友可以去看看.接下来我们讲一讲主数据管理(MDM). 主数据管理(MDM) 主数据是系统间共享数据,它是系统间信息交换的基准.主数据 ...
- python线性回归
一.理论基础 1.回归公式 对于单元的线性回归,我们有:f(x) = kx + b 的方程(k代表权重,b代表截距). 对于多元线性回归,我们有: 或者为了简化,干脆将b视为k0·x0,,其中k0为1 ...
- 小白都能理解的Python多继承
本文主要做科普用,在真实编程中不建议使用多重继承,或者少用多重继承,避免使代码难以理解. 方法解析顺序(MRO) 关于多重继承,比较重要的是它的方法解析顺序(可以理解为类的搜索顺序),即MRO.这个跟 ...
- [EF] - 全连接
在EntityFramework里有个DeflautIfEmpty方法可以用来表示数据库里的左联接或者右连接: http://msdn.microsoft.com/en-us/library/bb39 ...
- .NET Core AWS S3云存储
前言 最近有需要用到AWS S3云存储上传附件,这里对利用.NET或.NET Core在调用SDK APi需要注意的一点小问题做个记录,或许能对后续有用到的童鞋提供一点帮助 AWS S3云存储 官方已 ...
- hibernate连接数据库中文乱码
4.做完这两步还是不行,需要修改hibernate的配置文件hibernate.cfg.xml,在配置文件配置hibernate.connection.url属性.示例: <property n ...
- CentOS Linux SVN服务器 配置用户目录访问 权限 Authorization failed
SVN 修改 aurhz 文件设置用户目录访问权限格式: [/code] user=rw user 用户对code目录拥有读和写的权限. 但是访问 svn://192.168.1.59 的时候却提示A ...
- JAVA基础--数据类型和运算符总结
一,JAVA的数据类型 逻辑型----boolean 只允许取值true和false 字符型----char java采用unicode编码(utf16),每个字符占用两个字节 整数型----byte ...
- 重温Java JDK安装,希望帮助更多的学习在路上的小白
JDK卸载和安装 现在JDK已经升级到JDK11版本了,但是JDK1.8(JDK8)仍然有很多小伙伴在使用,这里也记录一下jdk1.8的下载及安装过程,对于刚学习java的小伙伴可以参考,熟手可忽略, ...
- 如何组织一场JAVA技能大练兵
近期,公司为了锻炼开发人员技能,举办了一场涵盖多个技术线的技能大练兵,我有幸受邀负责java技术方向的出题和评审工作.下面从以下几个方面回顾下整个过程: 题目设计 程序要求 测试方法 题目设计 题目设 ...