Pwn 二进制漏洞审计

news2024/11/23 21:23:19

PWN的另一个名字是二进制漏洞审计

Pwn和逆向工程一样,是操作底层二进制的,web则是在php层面进行渗透测试

我是从re开始接触CTF的,有一点二进制基础,本文可能会忽略一些基础知识的补充

”Pwn”是一个黑客语法的俚语词 ,是指攻破设备或者系统。发音类似“砰”,对黑客而言,这就是成功实施黑客攻击的声音——砰的一声,被“黑”的电脑或手机就被你操纵了。

Pwn在CTF竞赛是体现技术实力的关键部分,也是最难的部分。

下面讲解一下Pwn有关的知识

                        ——Your computer,my access!

Pwn的目的

最终目的:获得一个shell

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。

它接收用户输入的命令并把它送入内核去执行。

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。

获得一个shell意味着获取了一个服务器的控制台,我们就可以随心所欲地操作服务器中的数据。

基础知识

程序的编译和链接

编译过程

编译->汇编->链接

file命令

可以查看文件类型

gcc使用的vim查看底层二进制

在vim中查看底二进制,在命令行中输入:%!xxd

还原为字符文件 %!xxd -r

gcc直接编译

gcc 要编译的文件

逐步使用gcc编译

gcc -S 源代码文件 得到汇编文件

gcc 汇编语言文件 得到可执行文件

./可执行文件 可以执行可执行文件

可执行文件

Windows:PE

可执行程序

exe

动态链接库

dll

静态链接库

lib

Linux:ELF

可执行程序

out

动态链接库

so

静态链接库

a

需要对PE文件和ELF文件有一定的了解

堆栈

这里讲解一下汇编语言的堆栈机制,读完不能很好理解的读者可以自行学习汇编语言

堆栈数据结构

堆栈数据结构就是我们数据结构课中学到的栈

 栈顶添加新元素,删除元素在栈顶删除

后进去先出FILO

本文要讲的是运行时堆栈

运行时堆栈

运行时堆栈是内存数组,程序的数据存放在内存上,运行时用抽象数据结构中栈的形式来处理数据

ESP寄存器

ESP寄存器(extended stack pointer,扩展堆栈指针)

可以理解为抽象数据结构栈中指向栈顶的指针

存放某个位置的32位偏移量

基本上不会被程序员修改

用CALL,RET,PUSH,POP指令间接修改

入栈操作

32位入栈操作是把栈顶指针减4,再将数值复制到栈顶指针指向的位置

运行时堆栈在内存中是向下生长的,从高地址向低地址扩展

出栈操作

从堆栈删除元素,站定指针减小

下面介绍一些汇编指令

PUSH指令

首先减少ESP的值,将操作数复制到堆栈

POP指令

将ESP指向的堆栈元素复制到一个操作数当中,增加ESP的值

PUSHFD指令

将32位EFLAGS寄存器的内容压入堆栈

POPFD指令

将栈顶元素弹出到32位EFLAGS寄存器

PUSHAD指令

按照EAX,ECX,EDX,EBX,ESP,EBP,ESI,EBI的顺序

将所有32位通用寄存器压入堆栈

POPAD指令

按照与PUSHAD相反的顺序将其弹出堆栈

堆栈帧

堆栈参数

堆栈帧是一块堆栈保留区域

存放

  • 被传递的实际参数
  • 子程序的返回值
  • 局部变量
  • 被保存的寄存器

创建步骤

  1. 将被传递的实际参数压入堆栈
  2. 当子程序被调用时,该子程序的返回值压入堆栈
  3. 子程序开始执行的时候,EBP被压入堆栈
  4. 设置EBP等于ESP,EBP成为子程序所有参数的引用基址
  5. 如果有局部变量,修改ESP在堆栈中为其预留空间
  6. 需要保留的寄存器,将它们压入堆栈

Fastcall调用方式

顾名思义,是一种希望快速的调用方式

我们来分析一下这个调用方式: 

调用自过程的时候,需要首先将参数传入EAX,EBX,ECX,EDX,少数情况还会传入ESI,EDI

我们知道寄存器是CPU内部的原件,堆栈在内存上,寄存器调用明显更快

但是我们知道通用寄存器很少,很多都有特定的功能,乘法需要用到EAX,还有许多寄存器用来循环数值和参与计算的操作数

因此寄存器不可能一直存放传递给过程的参数

在过程调用之前, 存放参数的寄存器需要首先入栈,然后向其分配过程参数

但是这些额外的入栈操作会让代码变得混乱,还有可能消除性能优势

值传递

一个参数通过数值传递时,该值的副本会被压入堆栈

.data
val1 DWORD 3
val2 DWORD 6
.code
push val2
push val1
call AddTwo

引用传递

通过引用来传递的参数包含的是对象的地址

push OFFSET val2
push OFFSET val1

传递数组

将数组的地址压入堆栈 

不愿意采用将每个数组元素压入堆栈的原因是这样很慢而且浪费堆栈空间

访问堆栈的参数

1.将传递的参数压入堆栈,调用子过程

2.EBP寄存器存放的是原来栈帧的基址,我们需要现将EBP压入栈保存

3.然后将当前的ESP作为新的栈帧的基址

示例

int AddTwo(int x,int y)
{
    return x+y;
}

将EBP入栈,设置ebp位esp的值

AddTwo PROC
    push ebp
    mov ebp,esp

ADD(5,6)

6

[EBP+12]
5[EBP+8]
返回地址[EBP+4]
EBPmov ebp,esp

这样通过当前EBP和偏移量就能访问传入的参数和原来的ebp(返回地址)

显式的堆栈参数

堆栈参数的引用表达式形如[esp+8],称它们为显式的堆栈参数

清除堆栈

子程序返回时,必须将参数从堆栈中删除

否则会导致内存泄露,堆栈会被破坏

C调用方式-cdecl

用于C和C++语言

子程序的参数按逆序入栈

解决了运行时堆栈的问题

在调用子过程后,紧跟一条语句让堆栈指针ESP加上一个数,该数的值即为子程序参数所占的堆栈空间

main PROC
    push 6
    push 5
    call AddTwo
    add esp,8
    ret
main ENDP

能将参数从堆栈中删除

STDCALL调用规范

给RET指令添加了一个参数,使程序在返回调用过程的时候,ESP会加上这个参数

这个添加的整数和过程参数占用的堆栈空间字节数相等

AddTwo PROC
    push ebp
    mov ebp,esp
    mov eax,[ebp+12]
    add eax,[ebp+8]
    pop ebp
    ret 8
AddTwo ENDP

局部变量

在子过程中创建的变量

局部变量在ebp下

void Mysub()
{
    int X=10;
    int Y=20;
}

每个变量的存储大小都要向上取整保存为4的倍数

两个局部变量一共保留8个字节

MySub PROC
    push ebp
    mov ebp,esp
    sub esp,8
    mov DWORD PTR [ebp-4],10
    mov DWORD PTR [ebp-8],20
    mov esp,ebp
    pop ebp
    ret
MySub ENDP

从堆栈中删除局部变量,只需要执行:

mov esp,ebp

esp向上移动=内存释放

可以给局部变量的偏移量定义一个符号,在代码中使用这些符号

X_local EQU DWORD PTR [ebp-4]
Y_local EQU DWORD PTR [ebp-8]

MySub PROC
    push ebp
    mov ebp,esp
    sub esp,8
    mov X_local,10
    mov Y_local ,20
    mov esp,ebp
    pop ebp
    ret
MySub ENDP

保存和恢复寄存器

子程序在修改寄存器之前将它们的当前值保存到堆栈

通常在ebp入栈,设置ebp等于esp之后,相关寄存器入栈

栈帧
解释说明
传递的参数[EBP+8]

返回地址

[EBP+4](原来栈帧的EBP)
EBP

当前栈帧的EBP

ECX
EDX当前ESP指向的位置

EBP被初始化之后,整个过程中它的值将保持不变

ECX,EDX入栈并不影响EBP按照原来的偏移量访问传递的参数

引用参数

引用参数通常是基址-偏移量寻址方式进行访问

每个引用参数都是一个指针

.data
count=100
array WORD count DUP(?)

.code
push OFFSET array
push count
call ArrayFill
ArrayFill PROC
    push ebp
    mov ebp,esp
数组偏移量
数组长度

返回地址

EBP

下面我们来进入与Pwn的正文

StackOverflow

StackOverflow是一种常见的Pwn的手段

同时与有与之同名的网站StackOverflow是全球最大的编程问答社区

C语言函数调用栈

复习和补充一下函数调用栈的内容

  • 函数调用栈是值程序运行时内存一段连续的区域

  • 用来保存函数运行时的状态信息

  • 称之为“栈”是因为发生函数调用的时候,调用函数的状态被保存在栈内

  • 在函数调用结束之后,栈顶的函数状态被弹出,栈顶恢复到调用函数的状态

  • 函数调用栈在内存中从高地址向低地址扩展

栈帧结构

previous stack frame pointer
arguments
return address
stack frame pointer
callee saved registers
local variable

arguments会倒序压入栈

StackOverflow原理

我们要控制程序执行流

就要控制EIP,RIP这种PC寄存器

只要EIP寄存器能写入我们想要的值,整个程序执行流就会被我们劫持

能传给EIP值的位置只有return address这里

缓存区溢出

本质是向定长的缓存区中写入了超长的数据,造成超出的数据覆写了合法内存区域

栈溢出

  • 最常见,漏洞比例最高,危害最大的二进制漏洞

  • 在CTF PWN中往往是漏洞利用的基础

堆溢出

  • 现实中的漏洞占比不高

  • 堆管理器复杂,利用花样繁多

  • CTF PWN中的常见题型

BSS溢出

  • 现实中与CTF比赛中占比都不高

  • 攻击效果依赖于BSS上存放了何种控制数据

什么样的代码会发生缓存区溢出

#include<stdio.h>



int main(){

    char str[8];

    read(0,str,24);

    return 0;

}

上述代码企图在8个元素的数组中输入24个数据

编译执行结果如上图,我们在运行的时候输入了超过8个字符

在一些Linux中这种缓存区溢出会导致程序崩溃

如果要是输入一些精心构造的数据,就能实现劫持

我们输入的数据位置和存储原函数EBP的位置是相邻的

我们可以利用StackOverflow修改存储原函数的EBP的值

这样函数返回的时候,原函数的EBP被我们修改了,我们就修改了PC,劫持了这个程序执行流程

PWN必备的工具

  • IDA pro

  • pwntools

  • pwndbg

  • checksec

  • ROPgadget

  • one_gadget

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS#1 引入方式和基础语法

JavaScript(JS)是一门跨平台, 面向对象的脚本语言, 来控制网页行为的, 它能够是网页可交互一. 引入方式内部脚本与外部脚本内部脚本: 将JS代码定义在HTML页面中外部脚本: 将JS代码定义在外部JS文件中, 然后引入到HTML页面中注意: 在HTML中,JS代码必须位于<script></sc…

纯手动搭建大数据集群架构_记录008_搭建Hbase集群_配置集群高可用---大数据之Hadoop3.x工作笔记0169

首先准备安装包 然后将安装包分发到集群的其他机器上去 然后因为运行hbase需要zookeeper支持,所以这里首先要去,启动zk 走到/opt/module/hadoop-3.1.3/bin/zk.sh 然后 zk.sh start 启动一下,可以看到启动了已经 然后zk.sh status 可以看zookeeper的状态 然后我们再去启动一下…

购买运动耳机应该考虑什么问题、运动达人必备的爆款运动耳机

喜欢运动的小伙伴都知道&#xff0c;运动和音乐是最配的&#xff0c;在运动中伴随着节奏感的音乐能够让自己更兴奋&#xff0c;锻炼的更加起劲儿。在运动耳机方面我也一直都有所研究&#xff0c;购买运动耳机最重要的就是要满足我们运动时候听音乐的需求&#xff0c;从佩戴舒适…

SAP Insurance Analyzer

SAP Insurance Analyzer 是一款用于保险公司财务和风险管理的软件。SAP Insurance analyzer 支持基于 IFRS 17 或 Solvency II 的保险合同估值和计算要求。SAP Insurance Analyzer 于 2013 年 5 月推出&#xff0c;为源数据和结果数据集成了一个预配置的保险数据模型。 源数据…

网上商城系统用户子功能模块

技术&#xff1a;Java、JSP等摘要&#xff1a;网上购物系统又称为网上商城、网络商城、网上商城、网上开店平台、网店管理系统、网店程序、网上购物系统、网上商城系统等。无论是开设个人网上购物商店还是企业网上商城商城&#xff0c;一套好用的网上购物系统都是必须的。网上购…

颠覆你的认知,这3款软件,每一款都非常实用

闲话少说&#xff0c;直上干货。 1、WizTree WizTree是一款最快的磁盘空间分析器&#xff0c;傻瓜式操作&#xff0c;功能还特别强大。它可快速的从硬盘中查找和释放被大量占用的空它将扫描的硬盘驱动器&#xff0c;直观显示哪些文件和文件夹使用的磁盘空间最多&#xff0c;及时…

day22_IO

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、缓冲流 三、字符流 四、缓冲字符流 五、匿名内部类 零、 复习昨日 File: 通过路径代表一个文件或目录 方法: 创建型,查找类,判断类,其他 IO …

EPICS synApps介绍

一、synApps是什么&#xff1f; 1&#xff09; 一个用于同步束线用户的EPICS模块集合。 2&#xff09; EPICS模块 alive, autosave, busy, calc, camac, caputRecorder, dac128V, delaygen, dxp, ip, ip330, ipUnidig, love, mca, measComp, modbus, motor, optics, quadEM,…

如何提升权限运行远程桌面客户端?

​ 我们远程支持他人的时候&#xff0c;有些情况下需要管理员权限才能执行操作&#xff0c;比如更新软件。那么如何提升权限运行远程桌面客户端&#xff1f; 如果您使用 Splashtop SOS 软件远程支持客户&#xff0c;可以使用连线提权功能提升至系统管理员权限&#xff0c;方便…

java 1(概要、变量与运算符)

java ——概要、变量与运算符 ✍作者&#xff1a;电子科大不知名程序员 &#x1f332;专栏&#xff1a;java学习指导 各位读者如果觉得博主写的不错&#xff0c;请诸位多多支持&#xff1b;如果有错误的地方&#xff0c;欢迎在评论区指出 目录java ——概要、变量与运算符命令行…

Linux | 压缩和解压文件详细

linux系统中针对不同的文件&#xff0c;有不同的压缩命令。本文对常见压缩和解压命令进行总结zip文件1.1.unzip解压单个文件unzip 命令可以查看和解压缩 zip 文件。该命令的基本格式如下&#xff1a;unzip filename.zip (文件后可添加压缩相关参数)-d 目录名 将压缩文件解压到指…

牛客网--加法模拟器---题号:NC22007

链接&#xff1a;https://ac.nowcoder.com/acm/problem/22007 来源&#xff1a;牛客网 题目描述 牛牛渐入佳境&#xff0c;他准备做一个加法模拟器来玩玩&#xff0c;输入两个数&#xff0c;分别打印这两个数的横式和竖式运算式子。 输入描述: 输入两个整数a, b 以空格隔开…

大家一起做测试的,凭什么你现在拿20k,我却还只有10k?...

最近我发现一个神奇的事情&#xff0c;我一个97年的朋友居然已经当上了测试项目组长&#xff0c;据我所知他去年还是在深圳的一家创业公司做苦逼的测试狗&#xff0c;短短8个月&#xff0c;到底发生了什么&#xff1f; 于是我立刻私聊他八卦一番。 原来他所在的公司最近正在裁…

softmax与simod如何选择?

前言&#xff1a;博主最近在复现代码的时候遇到一个问题&#xff0c;有的代码使用softmax有的使用sigmod&#xff0c;两者使用到底有什么区别呢&#xff1f; 一、softmax函数 1.1公式 &#xff08;一般只用于最后一层进行分类&#xff09;深度学习中使用Softmax进行分类。 1…

数据结构与算法——5.空间复杂度分析

这篇文章让我们来讨论一下空间复杂度 目录 1.概述 2.java中常见内存占用 2.1基本数据类型内存占用情况 2.2计算机访问内存的方式 2.3引用大小 2.4对象大小 2.5一般内存占用 2.6数组占用地址大小 3.算法的空间复杂度 4.小结 1.概述 计算机的软硬件都经历了一个比较漫…

大数据面试题集锦-Hadoop面试题(四)-YARN

你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题&#xff0c;关注一下"张飞的猪大数据分享"吧&#xff0c;公众号会不定时的分享相关的知识和资料。 文章目录1、为什么会产生 yarn,它解决了什么问题&#xf…

Linux系统常用的2种切换用户命令

文章目录一、su命令二、sudo命令总结一、su命令 1、语法&#xff1a;&#xff08;英文全拼&#xff1a;switch user&#xff09; su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]2、参数说明&#xff1a; -f或--fast&#xff1a;不必读启动档&…

值得收藏!适合小微企业的万元数字化攻略!

编者按&#xff1a;小微企业数字化之路困难重重&#xff1f;看看这款全新的全面数字化方案&#xff0c;低成本、部署效率、免安装、免维护、数据安全&#xff0c;小微企业的数字化福音&#xff01;关键词&#xff1a;低成本&#xff0c;开箱即用&#xff0c;免安装免维护&#…

数据结构——树(一):二叉树

前言 在这篇文章中&#xff0c;荔枝会整理一下自己学习二叉树的学习笔记。主要内容包括树与二叉树的基本定义以及基础概念、二叉树的存储结构、二叉树的四种遍历方法以及二叉查找树的基本内容。 文章目录 前言 一、树形存储结构 二、二叉树 2.1 二叉树的基本定义 2.2 二叉…

【项目笔记】尚硅谷《云原生实战》

尚硅谷《云原生实战》1、云服务器nginx测试2、子网3、Docker4、Redis尚硅谷云原生项目 官方笔记 1、云服务器nginx测试 在云服务器供应商购买云服务器&#xff0c;配置弹性公网ip&#xff1a;121.37.230.200。外部访问使用公网ip&#xff0c;弹性公网每次会变&#xff1b;服务…