Pwn入坑之栈基础(1)

内存四区

技术小贴
技术小贴

代码区

.text

这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指令执行。

数据区

.data

也叫静态区(static area),用于存储全局变量静态变量常量,程序结束后由系统释放。

分为初始化的全局变量、静态变量、常量和未初始化的全局变量、静态变量、常量。

堆区

通过mallocfreenewdelete等函数动态地分配和回收内存,进程可以在堆区动态地请求一定大小的内存,并在用完后归还给堆区。

地址由高到低生长

栈区

存放局部变量函数参数返回数据返回地址,函数调用结束时释放。

栈区用以保护函数现场,可以动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行。

地址由低到高生长

内存区段选讲

一般情况下,一个程序本质上都是由 bss段、data段、text段三个段组成。

程序编译完成之后,已初始化的全局变量、静态变量保存在.data 段中,未初始化的全局变量、静态变量保存在.bss 段中。

举个例子:

//程序1
int a[30000];
void main()
{
    ...
}
//程序2
int a[30000]={1,2,3,4,5,6};
void main()
{
    ...
}

不难发现,编译之后的程序2明显大于程序1,为什么?

程序1位于bss段,而程序2位于data段。

全局的未初始化变量存在于bss段中,具体体现为一个占位符,全局的已初始化变量存于data段中,而函数内的局部变量都在栈上分配空间。

bss段并不给该段的数据分配空间,只是记录数据所需空间的大小,

而data段需要为数据分配空间,数据保存在目标文件中,包含经过初始化的全局变量以及它们的值。

bss段紧跟在data段的后面,包含data和bss段的整个区段此时通常称为数据区。

Pwn入坑之栈基础(1)

BSS段溢出攻击(选)

题目:game_of_chance.c

链接:BSS段溢出攻击

栈的结构

通常我们说的栈,是一种数据结构,数据存储方式为先进后出,压栈(push)和出栈(pop) 。

而我们这里说的栈,每个程序都有自己的进程地址空间,进程地址空间中的某一部分就是该程序的栈,用于保存函数调用信息和局部变量。

程序的栈是从进程空间的高地址向低地址增长的,数据是从低地址向高地址存放的。

Pwn入坑之栈基础(1)

函数调用

调用流程

函数调用大致包括以下几个步骤:

  1. 参数入栈:将参数从右向左依次压入系统栈中。
  2. 返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继
    续执行。
  3. 代码区跳转:处理器从当前代码区跳转到被调用函数的入口处。
  4. 栈帧调整:具体包括以下方法

    保存当前栈帧状态值,已备后面恢复本栈帧时使用(EBP 入栈)

    将当前栈帧切换到新栈帧(将 ESP 值装入 EBP,更新栈帧底部)

    给新栈帧分配空间(把 ESP 减去所需空间的大小,抬高栈顶)

返回流程

  1. 保存返回值:通常将函数的返回值保存在寄存器 EAX 中。
  2. 弹出当前栈帧,恢复上一个栈帧。

    在堆栈平衡的基础上,给 ESP 加上栈帧的大小,降低栈顶,回收当前栈帧的空间。

    将当前栈帧底部保存的前栈帧 EBP 值弹入 EBP 寄存器,恢复出上一个栈帧。

    将函数返回地址弹给 EIP 寄存器。

  1. 跳转:按照函数返回地址跳回母函数中继续执行。

源码分析

//referer to <<0day security vulnerability analyze technology>>
intfunc_B(int arg_B1, int arg_B2)
{
int var_B1, var_B2;
var_B1=arg_B1+arg_B2;
var_B2=arg_B1-arg_B2;
return var_B1*var_B2;
}
intfunc_A(int arg_A1, int arg_A2)
{
int var_A;
var_A = func_B(arg_A1,arg_A2) + arg_A1 ;
return var_A;
}
int main(int argc, char **argv, char **envp)
{
int var_main;
var_main=func_A(4,3);
    return var_main;
}

案例流程

当 CPU 在执行调用func_A 函数的时候,会从代码区中 main函数对应的机器指令的区域
跳转到func_A函数对应的机器指令区域,在那里取指并执行;

func_A函数执行完闭,需要
返回的时候,又会跳回到main函数对应的指令区域,紧接着调用 func_A 后面的指令继续执行
main 函数的代码。

在这个过程中,CPU 的取指轨迹如下图所示:

Pwn入坑之栈基础(1)

那么 CPU 是怎么知道要去func_A 的代码区取指,在执行完func_A后又是怎么知道跳回
到 main 函数(而不是func_B的代码区)的呢?

当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈中。

这个栈帧中的内存空间被它所属的函数独占,正常情况下是不会和别的函数共享的。当函数返回时,系统栈会弹出该函数所对应的栈帧。

调用约定

声明 参数入栈顺序 恢复栈平衡的位置
__cdecl 右→左 母函数
__fastcall 右→左 子函数
__stdcall 右→左 子函数

如果要明确使用某一种调用约定,只需要在函数前加上调用约定的声明即可,否则默认情
况下,VC 会使用__stdcall 的调用方式。

栈帧结构

栈帧概要

每一个函数独占自己的栈帧空间。当前正在运行的函数的栈帧总是在栈顶。Win32 系统提
供两个特殊的寄存器用于标识位于系统栈顶端的栈帧。

  1. ESP:栈指针寄存器(extended stack po inter),其内存放着一个指针,该指针永远指向
    系统栈最上面一个栈帧的栈顶。
  2. EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向
    系统栈最上面一个栈帧的底部。

Pwn入坑之栈基础(1)

ESP 和 EBP 之间的内存空间为当前栈帧,EBP 标识了当前栈帧的底部,ESP
标识了当前栈帧的顶部。

除了与栈相关的寄存器外,还有一个至关重要的寄存器EIP。
EIP:指令寄存器(Extended Instruction Pointer),其内存放着一个指针,该指针永远指向下
一条等待执行的指令地址。

可以说如果控制了 EIP 寄存器的内容,就控制了进程——我们让 EIP 指向哪里,CPU 就会
去执行哪里的指令。

Pwn入坑之栈基础(1)

内含信息

在函数栈帧中,一般包含以下几类重要信息。

  1. 局部变量:为函数局部变量开辟的内存空间。
  2. 栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部
    可以通过堆栈平衡计算得到),用于在本帧被弹出后恢复出上一个栈帧。
  3. 函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,
    以便在函数返回时能够恢复到函数被调用前的代码区中继续执行指令。

案例分析

以上一小节的函数调用的源代码做函数栈帧级别的分析,具体如下:

  1. 在 main 函数调用 func_A 的时候,首先在自己的栈帧中压入函数返回地址,然后为
    func_A 创建新栈帧并压入系统栈。
  2. 在 func_A 调用 func_B 的时候,同样先在自己的栈帧中压入函数返回地址,然后为
    func_B 创建新栈帧并压入系统栈。
  3. 在 func_B 返回时,func_B 的栈帧被弹出系统栈,func_A 栈帧中的返回地址被“露”
    在栈顶,此时处理器按照这个返回地址重新跳到 func_A 代码区中执行。
  4. 在 func_A 返回时,func_A 的栈帧被弹出系统栈,main 函数栈帧中的返回地址被“露”
    在栈顶,此时处理器按照这个返回地址跳到 main 函数代码区中执行。

Pwn入坑之栈基础(1)

参数传递

32位程序

  • 通过栈传参
  • 从右向左传入参数
  • 先压入最后一个参数

64位程序

  • 使用rdi rsi rdx rcx r8 r9 依次接收先传入的六个参数
  • 剩下传入的参数和32位的传参方式相同

原创文章,作者:小嵘源码,如若转载,请注明出处:https://www.lcpttec.com/pwnbasic/

(1)
上一篇 2019年9月30日 下午4:20
下一篇 2019年9月30日 下午4:34

相关推荐

  • 关于宝塔面板良心插件Nginx防火墙免费版

    有人在宝塔官方论坛发布了一款宝塔面板Nginx防火墙免费版。可以使用在centos、debian、ubuntu系统的宝塔面板里。使用逻辑基本和官方版一样(可以说基本相同)。不知道官方能让这个插件存活多久。 安装方式,宝塔面板7.0.2版本。找到软件商店 – 第三方应用 – Nginx防火墙免费版1.0。安装即可。 让我们来看看界面 看了以上界面,是不是感觉非…

    2019年11月15日
    1.4K0
  • 关于图片优化:免费图片压缩工具下载

    这次,小编给大家带来的是 ”关于图片优化:免费图片压缩工具下载“。希望对大家做SEO优化的小伙伴们有所帮助,希望能提升小伙伴们网站的打开与读取速度哈。 分享一个免费图片压缩工具软件,压缩图片大小体积质量不缩水。 这款名叫:瑞影无损图片压缩大师V1.4 中文汉化版压缩工具,可以无损批量压缩图片。 对图片压缩有需求的朋友可以下载使用。   网盘地址:h…

    2019年12月15日
    1.8K0
  • 漏洞复现:”CVE_2019_0708 BlueKeep”

    环境篇 Windows7 ultimate sp1 x64 MSF 开启远程桌面: 关闭防火墙: 利用篇 早期蓝屏 这是早期漏洞利用POC! git clone https://github.com/n1xbyte/CVE-2019-0708.git cd CVE-2019-0708 pip3 install impacket python3 crashpo…

    2019年9月26日
    3.7K0
  • Google Hacking

    基础技术 特殊字符 *:指代任意内容 + / -:强制(不)搜索+ / -后面的内容,不得有空格 “”:强制搜索””内部包含的内容 ():Google对()不敏感,但可以帮助使用者明确搜索语法,如intext:(password|passcode) intext:(username|userid)与intext:password | passcode int…

    2019年9月26日
    2.2K0
  • Linux背景知识

    操作系统 体系结构 控制器:CPU,读取系统指令 运算器:CPU,运算 储存器:RAM(内部存储器:易失性存储器) 输入设备:输入数据 输出设备:显示命令执行结果 总线结构 地址总线:负责内存寻址 数据总线:负责传输数据 控制总线:负责控制指令 基本背景 前世 1969年,一群MIT BELL Lib 的家伙用汇编语言开发出一款收费操作系统:MULTICS …

    2019年9月30日
    1.7K0
  • Linux服务器VPS一键添加与删除Swap虚拟内存

    说明:很多人的VPS服务器由于内存太小,会导致很多进程被杀掉,这时候就需要我们添加Swap虚拟内存了,这里就整了个一键脚本方便懒人或小白使用。 脚本 提示:脚本不支持OpenVZ架构,安装会自动退出。 运行命令: wget https://www.moerats.com/usr/shell/swap.sh && bash swap.sh 然后…

    2019年11月16日
    2.7K0
  • How to Make 图片马

    Copy命令制作 copy 1.png/b+1.php/a 2.png a 表示ascii文件 b 表示二进制文件 Cat命令制作 cat 1.png 1.php > 2.php 用于绕过getimagesize()函数的检查

    2019年9月26日
    1.5K0
  • 靶机渗透之HackInOS

    环境搭建 下载HackInOS 使用VirtualBox导入ovf,注意需要使用vbox导入 主机发现 本机ip: ​ 192.168.222.131 ip发现: arp-scan –interface=eth0 192.168.222.0/24 靶机ip: ​ 192.168.222.132 00:0c:29:9e:3a:be VMware, Inc. …

    2019年9月26日
    2.5K0
  • 推荐一款免费的网站后门在线查杀工具

    网络安全,对于各位站长来说,现在是至关重要。网站被黑,网站被挂后门,可能会造成各种的损失。做好网络安全防护对于SEO优化也是至关重要的一步,保护好自己的网站,也能保护好自己网站的排名。这次,小编来推荐一款免费的网站后门在线查杀工具,希望对大家有帮助。 最近网站被挂马劫持风险非常之高,负责的几个网站都被植入后门和挂马,网站流量深受其害,今天为大家介绍一款在线木…

    2019年12月15日
    2.4K0
  • CTF签到之html信息隐藏

    出题形式 Flag隐藏在html文件中,此类题目比较隐蔽,不易发现! 题目制作 1.新建1.html文档 <!DOCTYPE html> <html> <head> <title>请寻找Flag值</title> </head> <body> <h1>我就是一个简…

    2019年9月30日
    3.6K0
  • SEO内容检测神器:摩天楼SEO内容助手工具

    SEO内容检测神器:摩天楼SEO内容助手工具。这是我们老师:无忧老大推荐的。小编也亲测过,好使。真的能很详细地检测出来文章的内容质量度,明显是比乐观号要好很多很多。但是这个价格是有点高,小编正在犹豫是否要购买。但是小编最近是转换了工作,在外贸公司做独立站运营与谷歌SEO,所以比较少接触百度SEO了,购买计划先推迟一下下吧。但这个工具确实强大。 说到摩天楼内容…

    2019年12月15日
    2.4K0
  • 信息安全实验

    Day1 开班总结 以企业管理的要求约束自己:自律、慎独 做好自己,帮助他人,乐于分享,团队合作 团队 团队4人 课程计划 安装Centos7 远程访问配置 LAMP搭建与Linux+Tomacat+mysql搭建js的环境 通过shell运维网站 部署zabbix实时监控网站及服务器 部署IDS(snort)入侵检测系统 对上述网站进行渗透测试和漏洞修复 …

    2019年9月26日
    2.3K0