栈溢出原理

参考我之前发的一篇 Windows栈溢出原理

还有 brant 师傅的《0day安全笔记》

Pwn常用工具

gdb:Linux下程序调试

PEDA:针对gdb的python漏洞利用开发协助

pwndbg:和PEDA类似,GDB插件

pwntools:写exp和poc的利器(python库)

checksec:检查elf程序的安全性和程序的运行平台(一般来说peda里面自带的就够了)

objdump和readelf:可以很快的知道elf程序中的关键信息(Ubuntu自带)

ROPgadget:强大的Rop利用工具

one_gadget:可以快速的寻找libc中的调用exec('bin/sh')的位置

libc-database: 可以通过泄露的libc的某个函数地址查出远程系统是用的哪个libc版本

检测elf安全性

拿到elf,首先用checksec检查elf运行平台,安全措施

如果用gcc的编译后,默认会开启所有的安全措施

1、RELRO:有Partial RELRO和FULL RELRO(开启),如果开启,则无法修改got表

2、Stack:如果栈中开启Canary found,就不能用直接用溢出的方法覆盖栈中返回地址

而且要通过改写指针与局部变量、leak canary、overwrite canary的方法来绕过

3、NX:NX enabled 如果这个保护开启就是意味着栈中数据没有执行权限

以前的经常用的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过

4、PIE:PIE enabled 如果程序开启这个地址随机化选项,就意味着程序每次运行的时候地址都会变化

而如果没有开PIE的话那么No PIE (0x400000),括号内的数据就是程序的基地址

5、FORTIFY:FORTIFY_SOURCE 机制对格式化字符串有两个限制

(1)包含%n的格式化字符串不能位于程序内存中的可写地址。

(2)当使用位置参数时,必须使用范围内的所有参数。

所以如果要使用%7$x,你必须同时使用1,2,3,4,5和6。

泄露libc地址和版本的方法

[1] 利用格式化字符串漏洞 泄露栈中的数据,从而找到libc的某个函数地址

再利用libc-database来判断远程libc的版本,之后再计算出libc的基址,一般找__libc_start_main的地址

[2] 利用write这个函数,pwntools有个很好用的函数DynELF去利用这个函数计算出程序的各种地址

括函数的基地址,libc的基地址,libc中system的地址

[3] 利用printf函数,printf函数输出的时候遇到0x00时候会停止输出

如果输入的时候没有在最后的字节处填充0x00,那么输出的时候就可能泄露栈中的重要数据

比如libc的某个函数地址

简单的栈溢出

程序没有开启任何保护:

方法一:传统的教材思路是把shellcode写入栈中,然后查找程序中或者libc中有没有call esp或者jmp esp,

比如这个题目: http://blog.csdn.net/niexinming/article/details/76893510

方法二:但是现代操作系统中libc中会开启地址随机化,所以先寻找程序中system的函数,再布局栈空间,

调用gets(.bss),最后调用system('/bin/sh')

比如这个题目:http://blog.csdn.net/niexinming/article/details/78796408

方法三:覆盖虚表方式利用栈溢出漏洞,这个方法是m4x师傅的方法,

比如这个题目:http://blog.csdn.net/niexinming/article/details/78144301

开启nx的程序

开启nx之后栈和bss段就只有读写权限,没有执行权限了,所以就要用到rop这种方法拿到系统权限,如果程序很复杂,或者程序用的是静态编译的话,那么就可以使用ROPgadget这个工具很方便的直接生成rop利用链。有时候好多程序不能直接用ROPgadget这个工具直接找到利用链,所以就要手动分析程序来getshell了,比如这两个题目: http://blog.csdn.net/niexinming/article/details/78259866

开启canary的程序

开启canary后就不能直接使用普通的溢出方法来覆盖栈中的函数返回地址了,要用一些巧妙的方法来绕过或者利canary本身的弱点来攻击 【1】利用canary泄露flag,这个方法很巧妙的运用了canary本身的弱点,当stack_check_fail时,会打印出正在运行中程序的名称,所以,我们只要将libc_argv[0]覆盖为flag的地址就能将flag打印出来,比如这个题目: http://blog.csdn.net/niexinming/article/details/78522682 【2】利用printf函数泄露一个子进程的Canary,再在另一个子进程栈中伪造Canary就可以绕过Canary的保护了,比如这个题目:http://blog.csdn.net/niexinming/article/details/78681846

开启PIE的程序

(1) 利用printf函数尽量多打印一些栈中的数据,根据泄露的地址来计算程序基地址,libc基地址,system地址

比如这篇文章中echo2的wp: http://blog.csdn.net/niexinming/article/details/78512274

(2) 利用write泄露程序的关键信息,这样的话可以很方便的用DynELF这个函数了

比如这个文章中的rsbo2的题解:http://blog.csdn.net/niexinming/article/details/78620566

全部保护开启

如果程序的栈可以被完全控制,那么程序的保护全打开也会被攻破

比如这个题目:http://blog.csdn.net/niexinming/article/details/78666941

格式化字符串漏洞

格式化漏洞现在很难在成熟的软件中遇到,但是这个漏洞却很有趣 (1) pwntools有很不错的函数FmtStr和fmtstr_payload来自动计算格式化漏洞的利用点

并且自动生成payload

比如这个题目:http://blog.csdn.net/niexinming/article/details/78699413

http://blog.csdn.net/niexinming/article/details/78512274 中echo的题解

(2) 格式化漏洞也是信息泄露的好伴侣,比如这个题目中制造格式化字符串漏洞泄露各种数据

http://blog.csdn.net/niexinming/article/details/78768850

uaf漏洞

如果把堆释放之后,没有把指针指针清0,还让指针保存下来,那么就会引发很多问题

比如这个题目 http://blog.csdn.net/niexinming/article/details/78598635

任意位置写

如果程序可以在内存中的任意位置写的话,那么威力绝对很大 (1) 虽然只能写一个字节,但是依然可以控制程序的并getshell

比如这个题目 http://blog.csdn.net/niexinming/article/details/78542089

(1) 修改got表是个控制程序流程的好办法,很多题目只要能通过各种方法控制got的写入,就可以最终得到胜利

比如这个题目: http://blog.csdn.net/niexinming/article/details/78542089

(3) 如果能计算出libc的基地址的话,控制top_chunk指针也是解题的好方法

比如这个题目: http://blog.csdn.net/niexinming/article/details/78759363

Pwn大佬博客

sakura

muhe

Pwn(NSFW)

Swing

学习资源

checksec及其包含的保护机制

安全客堆讲解

Linux(x86) 漏洞利用开发系列

how2heap总结

pwn-内存泄漏one_gadget

glibc里的one gadget

解析ctf中的pwn--Fast bin里的UAF

Pwn思维导图

Pwn入坑指南的更多相关文章

  1. electron入坑指南

    electron入坑指南 简介 electron 实际集成chrome浏览器和node环境, 运行你写的网页 app 基本目录结构 index.html 名称可以不是index, 这个文件与普通网页的 ...

  2. C语言入坑指南-被遗忘的初始化

    前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题. 什么是初始化 初始化指的是对数据对象或者变量赋予初始值.例如: int va ...

  3. Elasticsearch入坑指南之RESTful API

    Elasticsearch入坑指南之RESTful API Tags:Elasticsearch ES为开发者提供了非常丰富的基于Http协议的Rest API,通过简单的Rest请求,就可以实现非常 ...

  4. ElasticSearch入坑指南之概述及安装

    ---恢复内容开始--- ElasticSearch入坑指南之概述及安装 了解ElasticSearch ElasticSearch(简称ES)基于Lucene的分布式全文检索引擎.使用ES可以实现近 ...

  5. eclipse中导入外部包却无法查看对应源码或Javadoc的入坑指南

    eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应AP ...

  6. Rust入坑指南:核心概念

    如果说前面的坑我们一直在用小铲子挖的话,那么今天的坑就是用挖掘机挖的. 今天要介绍的是Rust的一个核心概念:Ownership.全文将分为什么是Ownership以及Ownership的传递类型两部 ...

  7. Rust入坑指南:鳞次栉比

    很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...

  8. Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...

  9. Rust入坑指南:朝生暮死

    今天想和大家一起把我们之前挖的坑再刨深一些.在Java中,一个对象能存活多久全靠JVM来决定,程序员并不需要去关心对象的生命周期,但是在Rust中就大不相同,一个对象从生到死我们都需要掌握的很清楚. ...

随机推荐

  1. bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3503 b[i][j] 表示i对j是否有影响 高斯消元解异或方程组 bitset优化 #include ...

  2. HDU 5299 圆扫描线 + 树上删边

    几何+博弈的简单组合技 给出n个圆,有包含关系,以这个关系做游戏,每次操作可以选择把一个圆及它内部的圆全部删除,不能操作者输. 圆的包含关系显然可以看做是树型结构,所以也就是树上删边的游戏. 而找圆的 ...

  3. FFprobe使用指南

    http://blog.csdn.net/stone_wzf/article/details/45378759 http://blog.chinaunix.net/uid-26000296-id-42 ...

  4. 求二叉树中第K层结点的个数

    一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...

  5. Mysql select id 加上order by 后结果不一致

    测试数据将近280万 1.SELECT id FROM cbbd ORDER BY id LIMIT 900000,10 2.SELECT id FROM cbbd  LIMIT 900000,10 ...

  6. [整理]JS中的状态机

    /*StateMachine*/ var StateMachine = (function(){ function StateMachine(opts){ this.current = opts.in ...

  7. HDU 2680 Choose the best route 最短路问题

    题目描述:Kiki想去他的一个朋友家,他的朋友家包括所有的公交站点一共有n 个,一共有m条线路,线路都是单向的,然后Kiki可以在他附近的几个公交站乘车,求最短的路径长度是多少. 解题报告:这道题的特 ...

  8. 第9月第9天 CTFramesetterCreateWithAttributedString

    1. NSString *text = @"This\nis\nsome\nmulti-line\nsample\ntext."; UIFont *uiFont = [UIFont ...

  9. [HNOI2013]比赛 (用Hash实现记忆化搜索)

    [HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...

  10. lrc歌词文件格式

    一.lrc文件有什么作用 lrc文件就是一个文本文件,用来记录歌曲的歌词信息,使得播放歌曲时能够让歌词与声音同步显示,类似于电影字幕那种效果. 心情很丧时我们会听首歌陶冶一下情操,不知你是否注意过音乐 ...