其实不是很爱搞Linux,但是因为CTF必须要接触一些,漏洞利用方面也是因为CTF基本都是linux的pwn题目。

基本的题目分类,我认为就下面这三种,这也是常见的类型。

下面就分类来说说

0x0.栈溢出

  栈溢出一般都是CTF中,PWN类别的第一题。基本思想就是覆盖栈中返回地址啦,这个谁都知道。这种题一定会有NX保护,怎么跳是问题。常见的是leak出一个函数的got表,leak方法题中一定会给出的,然后看看有没有给出libc。如果有libc就能算system()和/libc/sh的地址了,直接溢出就OK了。如果没有libc的话,如果能构造一个无限次循环的漏洞函数的话,可以使用pwn库的DynELF函数找出system地址,再想方设法的往一个地方写个/libc/sh就可以了(因为DynELF没法泄漏字符串的地址)。如果这道题比较简单的话,出题人会在程序里调用system()函数,这样你直接跳过去用就可以了。

  基本的思路就是这些,如果不能(不乐意)使用DynELF函数就可以使用ret2dl_resolve方法了,这两者是差不多的。之前写过的www.Ox9A82.com/Ox9A82/p/5487275.html

  还有一种就是x64下的栈溢出,因为x64并不是通常的使用栈传递参数,而是把参数放在寄存器中传递所以不能直接的去布置参数了。但是,可以有通用的gadgets来用。http://www.Ox9A82.com/Ox9A82/p/5487725.html这个是用来布置参数加执行,而且可以构成rop链。

  另外的是,如果有canary保护的话,可能就不是栈溢出(或者不是要去覆盖返回地址了),因为canary对于直接的覆盖返回地址来说是没办法绕过的。

总体思路如下:

0x1.格式化字符串

  格式化字符串的题,一般都比栈溢出分值高一档。格式化字符串漏洞找起来应该还是相当的容易的,主要格式化串是否可控即可。对于传统的格式化字符串漏洞来说,只要在格式化串中带有要进行写入的目标地址即可,使用%1000x来形成1000字符,使用%4$n来指定栈中的参数即可达到目的。而现在很多人不这么玩了,很多出题人把格式化串放到堆或是bss段中,这样你就不能像传统的那样去读取格式化串中的目标地址了,不在栈中你是不可能读到的。对于这种题目的做法就是要进行两次漏洞利用,第一次在栈中构造跳板。第二次利用跳板去进行任意地址写。具体的说就是:第一次:在栈中找一个指向栈里面的指针(这种指针肯定会有,因为堆栈框架就是这样的),往这个栈的地方写入第二次要写入的地址。第二次:就跟正常利用一样了,使用前面输入的那个进行任意地址写。

  然后要明确的一点是,格式化字符串漏洞的本质是任意地址写。所以参数构造也是一个问题,因为不像栈溢出,栈溢出了参数就构造出来了。任意地址写参数可能没地方搞。另外注意一点是:要注意开没开nx、要注意开没开nx、要注意开没开nx。重要的事情说三遍。因为没开nx的话,几乎就是明晃晃的说,往我的堆/bss写shellcode吧,我可以执行。

总体思路:

0x2.堆

  对于堆进行考察的题一般都处于压轴的位置。我个人认为堆的应该分为两种,即堆的漏洞和模拟堆的漏洞。先说模拟堆的漏洞,这种题并不是真的在考堆的漏洞利用。而且出题人自己利用链表去模拟出一个堆来,更恰当的说我认为应该叫链表漏洞。这类题的一大特征就是给出了一个内存块的详细构造,比如有一个前向指针、一个后向指针(双链表)、有一个放用户名的域、有一个放编号的域等等。这个是在模拟一种堆的管理机制,所以最大的区别在于这个东西它没有check机制,不像堆一样有溢出保护机制。这种出法或者有溢出有unlink导致任意地址写等玩法。

  再来说真正的考察堆漏洞的,因为堆是有溢出保护的,unlink的宏在进行unlink之前会检查当前的指针合不合法,这个在题中的体现就是有的题会在bss段中存放每个块的指针,利用这个指针就可以bypass保护机制。然后就是利用方法,这个在之前也写过,就是去伪造两个堆块,利用堆的空块合并机制。当然了,首先得有堆溢出,没有溢出你拿什么去伪造堆块。伪造的目的是构造如下情况:

在灰色的原堆块中搞了个新的伪空堆块出来(注意,是通过堆溢出,溢出下一堆块头部实现的构造伪空堆块)。然后,我们再想办法去释放橙色堆块,就引发了空块合并机制。

最后谈谈经验,不一定对,就是做了几个题总结出来的。首先堆的题很多情况下不只是一个漏洞,往往有个什么整数溢出啊栈溢出啊什么的做辅助利用。然后就是堆的题一般都是标准的选单程序,就是给你个类似于记事本的功能选单,有什么新建笔记、编辑笔记、删除笔记、查看笔记之类的。一般都是先看新建的功能,因为通过新建功能可以看出分配的结构是什么样的,和怎么分配的。而删除功能往往都是用来进行free的。编辑笔记是经常设置漏洞的出题点。查看笔记可能会用于leak东西。

0x3.End

最后说下调试,因为用python库写exp(如pwn库和zio库)时都是打本地的,而且都是自动的,所以调试起来就很难办。可以在py中加入raw_input("wait input");来中断一下,然后用gdb附加。附加方法是gdb attch pid,pid可以用看pid的命令得到,也可以gdb attch `pidof elf文件名`来实现附加到进程上。而且还有一个好处就是脱离调试器后进程不会终止,这是和windows不一样的地方。但是注意调exp的时候如果python脚本退出了是会杀掉进程的,所以要保证python脚本不能提前退出,比如可以在最后加上.interact()函数来防止退出。

个人实在不是太喜欢Linux,所以也都是因为做比赛才来接触。感觉PWN这个东西积累很重要,套路也很重要。

CTF中做Linux下漏洞利用的一些心得的更多相关文章

  1. Linux下fastbin利用小结——fd覆盖与任意地址free(House of Spirit)

    linux下的fastbin是ctf中pwn题的重点出题点.去年(2015)中,XCTF就有两站是使用fastbin的利用作为pwn400的压轴题来出现,这也是我刚开始接触fastbin的利用,参考了 ...

  2. 初识linux内核漏洞利用

    0x00 简介 之前只接触过应用层的漏洞利用, 这次第一次接触到内核层次的,小结一下. 0x01 概况 这次接触到的,是吾爱破解挑战赛里的一个题,给了一个有问题的驱动程序,要求在ubuntu 14.0 ...

  3. 浅谈linux 下,利用Nginx服务器代理实现ajax跨域请求。

    ajax跨域请求对于前端开发者几乎在任何一个项目中都会用到,众所周知,跨域请求有三种方式: jsonp; XHR2 代理: jsonp: 这种应该是开发中是使用的最多的,最常见的跨域请求方法,其实aj ...

  4. Linux下漏洞提权

    Linux下的漏洞提权 linux下一般都是系统漏洞提权,分为以下几个步骤:

  5. java中在linux下利用jstack检测死锁

    首先,编写一个死锁程序 package deadlock; public class testJstack { final static Object resource_1 = new Object( ...

  6. Linux内核漏洞利用-环境配置(转)

    实验环境: Ubuntu-14.04.1 x86 linux-2.6.32.1 busybox-1.27.2 qemu 0x00 安装qemu sudo apt-get install qemu qe ...

  7. Comet4J推技术在SSHE三大框架中应用-linux下亲测可用

    Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询.长连接.自动选择三种工作模式. 下载地址 co ...

  8. 【持续更新中···】Linux下的小技巧

    1.Linux回到上级文件的命令: cd ..回到上一级目录(注意:cd 和..中间有空格) cd ~回到home目录 cd -回到某一目录

  9. CTF中的变量覆盖漏洞

    https://www.cnblogs.com/bmjoker/p/9025351.html 原   作 者:bmjoker出 处:https://www.cnblogs.com/bmjoker/p/ ...

随机推荐

  1. img、列表和table标签

    一.img图片 <body> <a href="https://www.fmtxt.com"> <img src="images/1.jpg ...

  2. codevs 3152 装箱问题3

    装箱问题3 http://codevs.cn/problem/3152/ 题目描述 Description 设有n种物品,记作A1.A2.….An,对应于每个Ai(1<=i<=n)都有一个 ...

  3. Linux下安装PHP的lua扩展库

    一.安装Lua 5.3.4 下载 http://www.lua.org/ftp/lua-.tar.gz tar xvf lua-.tar.gz cd lua- 重要:进入解压缩后的路径 cd .../ ...

  4. Java并发编程原理与实战三十五:并发容器ConcurrentLinkedQueue原理与使用

    一.简介 一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素进行排序.队列的头部 是队列中时间最长的元素.队列的尾部 是队列中时间最短的元素.新的元素插入到队列的尾部,队列 ...

  5. 说明你javascript写的很烂的5个问题

    Javascript在互联网上名声很臭,但你又很难再找到一个像它这样如此动态.如此被广泛使用.如此根植于我们的生活中的另外一种语言.它的低学习门槛让很多人都称它为学前脚本语言,它另外一个让人嘲笑的东西 ...

  6. 平铺式窗口管理器 Musca 初体验

    作者: 吴吉庆 Version: 1.0 release: 2009-11-04 update: 2009-11-04 为什么用平铺式窗口管理器? 什么是平铺式窗口管理器(tiling window ...

  7. 37、使用FileInputStream和FileOutputStream读取和写入

    绝对路径和相对路径 绝对路径:指文件在硬盘上真正存在的路径,比如:D:\Java\HelloWorld.java,这个指的是在电脑的d盘下的Java文件夹里面有个HelloWorld.java文件 相 ...

  8. python pachong zhuanzai

    come from:http://www.cnblogs.com/dyllove98/archive/2013/07/12/3187186.html 先来说一下我们学校的网站: http://jwxt ...

  9. web项目启动首页能访问接口报404

    这个问题如果控制台没有报错,然后看一下日志,看看spring容器是否加载: 如果是一直卡在这里了,多半是resources文件下的配置有问题,或者是resources目录不是源文件,工具无法识别 我遇 ...

  10. 洛谷 P3835: 【模板】可持久化平衡树

    题目传送门:洛谷P3835. 题意简述: 题面说的很清楚了. 题解: 考虑建立一棵每个节点都表示一个版本的树. 以初始版本 \(0\) 为根.对于第 \(i\) 个操作,从 \(v_i\) 向 \(i ...