简单分享一下解题过程。

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

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. re相关正则表达式(re.sub、re.I 、re.S、re.M)

    re.I 表示忽略大小写 re.S 表示全文匹配 re.M 表示全文拼配行尾段位的字符或者数字,影响^和$ re.sub 表示替换 使用方法: re.sub(pattern, repl, string ...

  2. 4vue 属性绑定

    属性绑定v-bind <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  3. 3html5

    <label>网址:</label><input type="url" name="" required><br> ...

  4. 【转载】MSVC中C++ UTF8中文编码处理探究

    字符集 先说一个名词:字符集,没听过的先百度一下,其实就是一种将字符编码的格式,像我们常说的ASCII,UTF8,GBK都是常用的字符集. 首先要清楚,从你在编辑器里输入一个UTF8汉字开始,到最终在 ...

  5. RabbitMQ问题汇总

    内网通过代理服务器访问MQ服务器,无法连接 使用的是socket连接,要设置socket代理,而不是http代理 Properties prop = System.getProperties(); / ...

  6. Assert的使用和简单解释

    Assert 的简单使用 Document d = Jsoup.connect("http://www.baidu.com").get(); Assert.notNull(d, & ...

  7. python 把mysql数据导入到execl中

    import pymysql import pandas as pd db = pymysql.connect( host='127.0.0.1', user='root', passwd='1234 ...

  8. mysql查询近N天的数据

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  9. SQL Injection(SQL注入)

    什么是SQL注入? SQL(结构化查询语言)注入,通常称为 SQLi,是对 Web 应用程序数据库服务器的攻击,会导致执行恶意查询.当 Web 应用程序使用未经正确验证的用户输入与数据库通信时,攻击者 ...

  10. DVWA-File Inclusion(文件包含)

    文件包含漏洞,当我们在一个代码文件想要引入.嵌套另一个代码文件的时候,就是文件包含. 常见的文件包含函数有include require等函数. 这两个函数的区别就是include在包含文件不存在时p ...