栈溢出原理

参考我之前发的一篇 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. 《剑指offer》— JavaScript(34)第一个只出现一次的字符

    第一个只出现一次的字符 题目描述 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置. *** 思路 新建一个对象,其中key用 ...

  2. CSUOJ 1170 A sample problem

    J: A Simple Problem Submit Page   Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 87     S ...

  3. java基础基础总结----- 构造方法,可变参数列表

    package com.mon11.day2; /** * 类说明 :构造方法,可变参数列表 * @author 作者 : chenyanlong * @version 创建时间:2017年11月2日 ...

  4. Jquery教你写一个简单的轮播.

    这个我表示写的不咋地-_-//,但是胜在简单,可优化性不错. 实际上我本来想写个复杂点的结构的,但是最近忙成狗了!!!!所以大家就讲究着看吧 HTML结构 <div class="ba ...

  5. [转载]详解主流浏览器多进程架构:Chrome、IE

    http://www.cnbeta.com/articles/109595.htm 随着Web浏览器重要性的日益突出,恶意软件.木马.间谍软件等网络攻击也呈现逐渐的上升.而面对 如此众多的潜在威胁,为 ...

  6. ASP.NET私有构造函数作用

    一.私有构造函数的特性 1.一般构造函数不是私有或者保护成员,但构造函数可以使私有成员函数,在一些特殊的场合,会把构造函数定义为私有或者保护成员. 2.私有构造函数是一种特殊的实例构造函数.它通常用在 ...

  7. HDU 6406 Taotao Picks Apples 线段树维护

    题意:给个T,T组数据: 每组给个n,m:n个数,m个操作: (对序列的操作是,一开始假设你手上东西是-INF,到i=1时拿起1,之后遍历,遇到比手头上的数量大的数时替换(拿到手的算拿走),问最后拿走 ...

  8. 云计算-MapReduce

    Hadoop示例程序WordCount详解及实例http://blog.csdn.net/xw13106209/article/details/6116323 hadoop中使用MapReduce编程 ...

  9. Mini Twitter

    Implement a simple twitter. Support the following method: postTweet(user_id, tweet_text). Post a twe ...

  10. u_boot移植之内存基础知识DDR【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4938411.html