简单分享一下解题过程。

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

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. 怎样修改linux内核

    1.先查看linux内核 uname -a 2.打开内核配置文件 sudo vi /etc/default/grub 3.跟新grub文件 sudo update-grub 4.最后重启电脑 sudo ...

  2. CSS 常用样式-文字三属性

    颜色 color: 作用:给文字设置颜色. 属性名 k :color 属性值 v :颜色名.颜色值. 颜色名: 颜色名就是使用颜色的英文单词进行表示. 需要记忆一些最常用的颜色名: 更多的颜色名可以通 ...

  3. doy 20 系统优化

    系统优化 1.yum源的优化 CentOS   base   epel ​自建yum仓库​使用一个较为稳定的仓库​wget -O /etc/yum.repos.d/CentOS-Base.repo h ...

  4. Jmeter----Badboy录制

    Badboy Badboy安装后出现错误,需要设置 Preferences-->General-->Enable Recording on Startup?的√去掉,play-->S ...

  5. Android Native Code 手动调试

    调试启动过程中的 Android Native Code Crash 记录一下,最后成功使用的工具是 lldb + lldb-server,不需要 root 权限.我最先尝试使用的是,gdb + gd ...

  6. virtualvm2 观察者模式

    <template> <div id="app"> <input type="text" v-model='msg'> &l ...

  7. FCC 高级算法题 验证电话号码

    Validate US Telephone Numbers 如果传入字符串是一个有效的美国电话号码,则返回 true. 用户可以在表单中填入一个任意有效美国电话号码. 下面是一些有效号码的例子(还有下 ...

  8. HarmonyOS_Text_Image

    Text组件 ohos:属性 id="$+id:text_helloworld" #在程序中控制,需要id="$+id:name",转回MainAbilityS ...

  9. vlan概述

    一.vlan是什么? vlan顾名思义就是虚拟局域网Virtual Local Area Network,为什么要划分vlan?划分vlan可以控制广播,增强网络安全性,简化网络管理. 二.vlan的 ...

  10. Python库之os库和logging库的基本使用说明

    使用os库操作目录及文件 使用os.sep() 方法获取系统分隔符 print(os.sep) 使用os.name()方法获取操作系统的平台类型 print(os.name) 使用os.getcwd( ...