简单分享一下解题过程。

下载题目,里面有三个文件,如图:

DockerFIle文件:

net.sh文件:

shell文件是一个elf,文件情况:

64位,Full RELO,NX,PIE

丢进IDA看一下,只有一个main和一个sub:

           

函数功能是:

(1)main  循环  50  次接收输入的命令,并交给  sub  处理;

(2)命令  ‘exit’  退出程序;

(3)命令 ’ls‘  ,调用 puts  输出一个  “file.txt”  字符串

(4)命令  ‘cat’  ,从 open 的 file.txt 中读 100 个字节

(5)命令 ‘echo ’ ,将字符串 ‘echo ’ 后面的字符串写入 stream 。

分析函数的问题,很明显,在子函数里,一个字符串溢出漏洞:

打开Linux,根据DockerFile搭好环境............................

连接IDA开始调试,在 printf 处下断点观察栈的情况,蓝色位置是此时的 rsp 位置,观察栈上的数据,有 libc、main、和栈指针可以利用,

考虑到是 x64 程序 + Full Relro保护,漏洞思路就是构建栈指针链,实现任意地址读写。

接下来就是找指针链,发现参数 17 的 指向 参数 45 ,而参数 45 也是一个在栈上的地址

参数 17:

参数 45:

这样一来,通过参数 17 修改  参数45 的最低位,就可以改写参数 45 指向的一个完整的 QWORD 数据,实现任意地址读写

接下来就是找 get shell 的办法,观察程序内可利用的函数或者代码段,,,,,

------------------没有-----------------------

除了几个初始化的函数,就是 main、sub、跳转用的 bnd jmp 和 extern,,,,那只能自己构建ret2system了。

程序是 x64 ,所以我们在选择 ret2 的方法时,还要考虑 system 参数的构造问题,这里通过动态调试,发现 fclose 函数在结束之后,rdi 会指向一个不变的堆地址:

 

并且这个堆地址和 main 函数下变量 s 的偏移是 0x258

为了保证在调用 system 时,rdi 的值不被覆盖,这里要求控制 main 的循环次数,使 sub 返回到 main 时,循环正好结束并执行 leave    retn,执行流程如图所示(丑不拉几的线条):

所以接下来就是枯燥无聊的写 python 脚本,

要完成的任务有:

(1)在栈的高处构建 system 的栈空间(我选了 main 栈上方 0x3000处,为了防止栈数据被其他函数覆盖),并保证 ret2system 时,rsp 对齐到 0x10;

(2)main 的返回地址定向到 main 的 leave,这样进行 两轮 mov rsp , rbp    pop rbp 之后,就可以开辟出 system 调用需要的栈空间;

(3)在 fclose 返回时 rdi 的地址处写入字符串 ‘/bin/sh\n’ ,这里要注意从高地址向地址写,因为这里的 rdi 低位数据里存放了堆的数据,修改掉之后会导致 fopen 异常;

(4)修改 main 函数存放 for 循环次数的变量 i ,并且要求 i 的值满足:最后一轮向 fclose 返回的 rdi 地址写入数据后,main 函数的 for 循环结束(如果不结束循环,rdi的值会被覆盖)

main 函数的栈空间修改效果(修改了 rbp,这里本来是 0 ,修改了 ret 的返回栈,这里原本是 libc_start_main + 0xXX

main + 0xA4:

为调用 system 构造的高位栈空间:

然后大功告成:

写在最后,本人是个纯纯 0 基础菜鸟,以前只学过一丢 win 逆向,从这道题目我才开始接触 linux 和格式化字符串的漏洞,,,,,,

文章是赶时间写的,如果有什么不正确的地方或者疑惑的地方,欢迎留言交流讨论~~~

linux下的一道堆上的格式化字符串漏洞题分析分享的更多相关文章

  1. CVE-2012-3569:VMware OVF Tool 格式化字符串漏洞调试分析

    0x01 简介 VMware OVF Tool 是一个命令行实用程序,允许您从许多 VMware 产品导入和导出 OVF 包.在 2.1.0 - 2.1.3 之间的版本中存在格式化字符串漏洞,通过修改 ...

  2. Linux下的格式化字符串漏洞利用姿势

    linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法.那就是只有栈是不可执行,而除了栈以外的其他地方还是可以执行的,只要把返回地址执行别的地方就可以. 一.格式化字符串漏洞 格式 ...

  3. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  4. Linux下远程备份、上传工程,重启服务器

    Linux下远程备份.上传工程,重启服务器 Linux服务器实现远程,原项目的备份.删除,新项目上传,以及远程重启服务器!分成一个主shell调用三个shell文件步骤完成.mainsh.sh一次按顺 ...

  5. [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇

    目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...

  6. CTF必备技能丨Linux Pwn入门教程——格式化字符串漏洞

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  7. Linux pwn入门教程(6)——格式化字符串漏洞

    作者:Tangerine@SAINTSEC 0x00 printf函数中的漏洞 printf函数族是一个在C编程中比较常用的函数族.通常来说,我们会使用printf([格式化字符串],参数)的形式来进 ...

  8. Linux pwn入门教程——格式化字符串漏洞

    本文作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函数中的漏洞printf函 ...

  9. 在Linux下查找文件内容包含某个特定字符串的文件

    如何在Linux下查找文件内容包含某个特定字符串的文件? 我的目录下面有test1和test2两个文件夹,里面都含有很多文件,其中test2里面还包含一个test文件夹 我想请问的是,如何通过查找关键 ...

  10. 通过格式化字符串漏洞绕过canary

    1.1    canary内存保护机制 1.1.1    canary工作原理 canary保护机制类似于/GS保护机制,是Linux下gcc编译器的安全保护机制之一,在栈中的结构如下图所示: 在函数 ...

随机推荐

  1. hdu:最大点权(强连通分量kosaraju)

    Problem Description给定一个有向图,每个点ii有点权a_ia​i​​,请对于每个点ii,找到ii能到达的点中点权的最大值(包括ii点). Input第一行包含一个正整数T(1\leq ...

  2. Spring 笔记三 AOP

    1.AOP 概述 AOP (Aspect-Oriented  Programming,面向切面编程):是一种新的方法论,是对传统 OOP (Object-Oriented  Programming,面 ...

  3. webpack逆向之报错Cannot read properties of undefined (reading 'call')

    经典报错 记录一下: 1: 缺少模块    补上 2.主模块无法调用子模块   有可能网站用的数组形式的模块包,你用的是对象,调用方法就要改变. 改写过程中 用的是对象方式: 那么3号包调用的4号包 ...

  4. Class 'dmstr\web\AdminLteAsset' not found

    Yii2出现  Class 'dmstr\web\AdminLteAsset' not found 报错 1.检查下是不是vendor从其他地方复制过来的 2.检查根目录composer.json 中 ...

  5. String当中的intern()

    public class String001 { public static void main(String[] args) { String s1 = "hello"; Str ...

  6. Boost.Asio C++ 网络编程

    在线电子书:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html

  7. DB2通过java代码生成自定义uuid()函数

    一.简单的方法 此种方法在快速大量生成时,会有重复 SELECT concat (hex (RAND ()), hex (RAND ())) as uuid FROM SYSIBM.SYSDUMMY1 ...

  8. Spring boot 入门-从idea 创建一个Spring boot应用!

    1.File->New Project. http://start.springboot.io 2.下一步. 3.选择依赖. 4.生成项目. 5.运行. 6.设置Tomcat端口 src\mai ...

  9. JDK8:Lambda表达式操作List集合

    JDK8的流对list的处理提供了很大的方便,特别是做报表的时候才能真正体现出来这个功能的强大:结合日常使用过程,有两个体会:一个是减少了数据库连接,最忌讳在循环中进行数据查询,特别是嵌套多层循环的时 ...

  10. baodoumi yml配置

    上次因为自增,发现配置没生效, 修改后如下 # 配置mybatis-plus, 参考:com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropert ...