2017-NSCTF-PWN

写在最前

这次比赛值得吐槽的地方很多,但是我要忍住,先讲正经的。 这次总结比赛的两道pwn,都是栈溢出类型的,比较简单。先放上题目链接:http://pan.baidu.com/s/1miT1kPM 密码:hwt3

正式写wp之前我需要默认你们都会IDA和gdb+peda的一些调试技巧以及脚本的编写,我主要讲题目思路,不然这篇文章就变成了工具教学。

PWN1

查看程序信息,32位,动态链接,只开了NX保护,RELORO是Partial。

那么做法就很多了。思路后面讲,继续看程序。

程序接受一次输入,然后不管你输入是什么,都给你输出一大串东西,至于这是为什么,看下面代码就知道了。

程序的main,非常简单,只是有个定时一秒的时钟比较坑,可以选择性地nop掉。

这就是程序的主要函数了,实在是非常简单。

看了这里的代码也可以解释为什么会数出一大串字符了。

再结合汇编页面查看,溢出非常明显。

程序漏洞分析完毕,我们来讲讲思路。

思路:

  1. 由于程序只有一次输入的机会,所以我们必须在第一次输入劫持程序流程。
  2. 由于栈上保留了函数got表的首地址(不同的机器上可能相差一个栈单元的位置),所以可以在第一步劫持控制流的同时进行libc地址的泄露。(至于这个地址保存在何处,需要你们自己去查看。)
  3. 这时候我们劫持了控制流,也有了libc地址。那么我们就再进行一次输入,ret2libc完成攻击。

EXP:

exp我准备用图片展示出来,原因不需要多说,我希望我的exp主要起个参考作用。

题目做法很多,比如你也可以不泄露栈上的libc,去泄漏got表,或者ret2resolve,有不同的想法欢迎在评论区留言。

PWN2

和上一题不一样,这里多了canary,但我们总会有办法绕过的。

这就是程序的功能展示了,只要我们每次都输入'Y',那我们就有无数次的输入机会。

程序main函数,程序有fork,看到这里,那么程序的canary就已经问题不大了。 我们主要分析的函数在下面的input_name() 中。

可以看到这里还是有个明显的格式化字符串。 我们进行的输入是在 input() 函数中。

由于没有验证字符串长度,我们可以在这里进行溢出。

思路:

  1. 由于canary的存在我们需要首先通过格式化字符串泄露canary的值。因为这个程序的栈上依然存在函数got表首地址,我们可以同时泄露libc地址。 (那么有了canary和libc地址,我们就可以在第二次输入轻轻松松拿shell了吗?nonono...,这是这道题我没搞懂的地方,我在第二次输入的时候死活写不进'/bin/sh'的地址,但是system却能正常写入。而我经过调试发现system函数参数的位置正好是函数got表首地址,也就是我们第一步泄露出的地址,所以我们第二步的思路如下)
  2. 往我们泄露出的got表地址写入'/bin/sh\x00'
  3. 写好了'/bin/sh\x00',那么我们直接写入system地址就大功告成了,但是事情还是没这么简单。 由于函数中memcpy()函数的存在,在我们劫持控制流之后它可能会将got表地址作为dest参数(具体原因我没去深究),然后把我们的输入复制过去,所以我们在这次输入开头也必须带上'/bin/sh\x00'

EXP:

总结:

这两道pwn题用来练习栈溢出漏洞还是不错的,我主要是利用ret2libc进行的攻击,你们也可以尝试其他方式,比如ret2resolve,虽然比较麻烦。

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2017-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习_散列函数与散列表

1825
来自专栏Golang语言社区

Golang使用pprof监控性能及GC调优

作者:峰云就她了 链接:http://xiaorui.cc/?p=3000 來源:个人博客

3193
来自专栏小灰灰

SPI框架实现之旅一:背景介绍

SPI框架实现之旅一:背景介绍 SPI的全名为Service Provider Interface,简单的总结下java spi机制的思想。我们系统里抽象的各...

24410
来自专栏Crossin的编程教室

Python 抓取网页乱码原因分析

在用 python2 抓取网页的时候,经常会遇到抓下来的内容显示出来是乱码。 发生这种情况的最大可能性就是编码问题:运行环境的字符编码和网页的字符编码不一致。 ...

3556
来自专栏JAVA烂猪皮

BAT面试常的问题和最佳答案

客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将reques...

972
来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习

2054
来自专栏FreeBuf

挖洞经验 | 如何在一条UPDATE查询中实现SQL注入

前段时间,我在对Synack漏洞平台上的一个待测试目标进行测试的过程中发现了一个非常有意思的SQL注入漏洞,所以我打算在这篇文章中好好给大家介绍一下这个有趣的漏...

2315
来自专栏恰同学骚年

.NET单元测试的艺术-3.测试代码

开篇:上一篇我们学习单元测试和核心技术:存根、模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础。本篇会集中在管理和组织单元测试的技术,以及如何确保在真...

763
来自专栏瓜大三哥

​UVM(九)之sequencej机制续1

UVM(九)之sequencej机制续1 当一个sequence启动起来之后,UVM会自动执行sequence的body任务,所以要产生各种和杨的激励,就要写好...

24510
来自专栏逸鹏说道

04. Web大前端时代之:HTML5+CSS3入门系列~Input新增类型

Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.tel:输入...

2787

扫码关注云+社区