【二进制安全面试题】linux篇:保护机制、函数调用约定

news2024/11/15 20:53:34

在这里插入图片描述

前言
上来先道歉,对不起(>人<;)对不起,博客鸽了好久。私下有好多朋友问我毕业工作的事情,毕竟搞二进制最重要的是要有热情!我能做的也是有限,每个人的学习方式不完全相同,所以想开一个面试题解析的专题。本专题的初衷并不是为了应试面试,而是根据面试题差缺不漏,看看自身有哪些知识点还没有掌握~

编写不易,如果能够帮助到你,希望能够点赞收藏加关注哦Thanks♪(・ω・)ノ
PS:文章末尾有联系方式,交个朋友吧~

本文链接:https://hollk.blog.csdn.net/article/details/128591001
防爬链接,未经允许请勿转载

文章目录

  • 问题1:linux下有哪些常见保护机制
  • 问题2:Linux下保护机制原理是什么
    • Canary保护
    • NX保护
    • ASLR保护
    • PIE保护
  • 问题3:这些保护机制有哪些绕过方式
    • Canary保护
    • NX保护
    • PIE保护和ASLR保护
  • 问题4:你知道的函数调用约定有哪些
  • 问题5:stdcall、cdecl、fastacall有什么区别

问题1:linux下有哪些常见保护机制

这个问题如果是pwn手的话应该是张口就来,常见保护机制有CanaryNXASLRPIE等,这些保护机制的介绍及开启关闭方式在我的《堆栈保护机制》这篇文章中有详细记录,可以直接点击蓝色字跳转

问题2:Linux下保护机制原理是什么

Canary保护

栈溢出的基本原理是,通过向栈中输入超过局部变量内存空间的数据,导致数据覆盖至BP指针IP指针等,达到劫持程序控制流的效果。所以人们会想如果数据超过了内存限制的边界,是否可以进行一个预警,或者直接让程序停下来不造成进一步的破坏。

在这里插入图片描述

Canary保护开启后,首先会由security_init函数初始化当前栈TLSstack_guard成员变量的随机数值:

security_init (void)
{
  // 将_dl_random的最后一个字节设置为0x0,_dl_random随机数在进入函数之前由kernel写入
  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
  // 设置随机数到stack_guard中
  THREAD_SET_STACK_GUARD (stack_chk_guard);

  _dl_random = NULL;
}

接下来在fs寄存器0x28的位置进行取值,fs:0x28指向的是当前栈TLS结构stack_guard

typedef struct
{
  void *tcb;
  dtv_t *dtv;
  void *self;
  int multiple_threads;
  uintptr_t sysinfo;
  uintptr_t stack_guard;
  ...
} tcbhead_t;

函数在开始执行前会向%ebp-0x8的位置插入一条类似于cookie的信息,这个cookie信息就是取自fs寄存器0x28处的值,插入汇编如下:

mov    rax, qword ptr fs:[0x28]
mov    qword ptr [rbp - 8], rax

当函数执行返回前,会取出这个cookie与fs寄存器0x28处的值进行异或处理,如果结果为0,证明canary没有被覆盖或篡改,汇编检验如下:

mov    rdx,QWORD PTR [rbp-0x8]
xor    rdx,QWORD PTR fs:0x28
je     0x4005d7 <main+65>
call   0x400460 <__stack_chk_fail@plt>

由于跳转使用了je指令,当异或操作为1时即canary的值已经被篡改,将不会跳转值main函数,而是执行__stack_chk_fail。需要注意的是__stack_chk_fail函数也是glibc中的,这就意味着动态链接的情况下也遵循绑定延迟机制

NX保护

禁用栈空间执行权限,防止跳转至栈中执行shellcode,这个没什么好说的,利用shellcode的前提是shellcode所在段具有执行权限,NX直接在栈区一刀砍掉

在这里插入图片描述

ASLR保护

ASLR开启后,堆、栈、共享库映射区域地址进行随机化处理,个人认为只不过是起始地址发生变化导致后续线性布局一起进行随机化,也就是说线性布局前后相邻偏移量是不变的,linux内核具体实现可以参考这篇文章:
Linux kernel ASLR Implementation

在这里插入图片描述

PIE保护

由于ASLR保护仅仅只对栈、堆、mmap、动态链接库映射内存区域进行了随机化,他管不着代码段、数据段、bss段,这三个部分的随机化就由PIE保护来做。PIE生效的前提是ASLR开启哦!

一个程序本身的地址是不支持随机化加载的,但是PIE保护的实现是在编译器层面实现的(有pie编译选项,ASLR可以在编译后开启关闭),PIE默认是开启状态,在PIE下编译出来的程序叫做位置无关代码(可以在我的《程序员自我修养学习心得》系列找到)

在这里插入图片描述

PIE编译后,我们可以在ida看到的代码段的样子就像上图一样,只会有一个低地址位的偏移,这样一来程序就可以通过随机高地址位加载到任意位置。PIE和ASLR的结合使得内存像浆糊一样,但是根据ISO三原则:保密性、完整性、可用性,三者其中一项提高,势必会影响另外一项或两项的降低,因此PIE会影响性能,实际工作中不开启的情况还是有的

问题3:这些保护机制有哪些绕过方式

Canary保护

从上面的canary整条流程进行梳理,从头到尾的顺序应该是security_init初始化TLS中的stack_guard–>取出fs:0x28处stack_guard随机数值插入%ebp-0x8位置–>函数执行后重新提取canary值并与fs:0x28做异或–>如果异或为1(已篡改)则执行__stack_chk_fail函数

姿势一:泄露canary

条件:PIE关闭、程序可以循环输出每一个输入字节

因为在security_init中设置随机数结尾为0x0,这样设置是为了保证canary可以以\x00为结尾,确保可以截断字符串,那么在溢出的时候就可以首先覆盖canary的低字节,通过覆盖canary最后一个\x00字节来打印出canary信息,计算好到栈中bp偏移后直接将打印出来的内容覆盖至canary存放位置(覆盖了,但还是原来的值)

姿势二:canary爆破

由于canary的值为随机数,并且会随着进程的重启发生变化,但是同一个进程的不同线程或fork函数创建的子进程中canary是不发生改变的,利用这一原理可以进行canary按位爆破

姿势三:劫持__stack_chk_fail函数

前面说过,在篡改canary中的之后,程序将会进入__stack_chk_fail函数流程。但__stack_chk_fail函数遵循绑定延迟机制,所以可以篡改__stack_chk_fail函数的GOT表执行其他操作

姿势四:修改TLS中存储的Canary值

由于函数结束前会通过fs:0x28的方式重新对TLS中的stack_guard取值,当溢出长度很长的时候,可以同时覆盖Canary和TLS存储

NX保护

ROP就可以,NX主要防的是shellcode,而gadget本身就处于代码段,属于程序内部执行代码

PIE保护和ASLR保护

姿势一:shellocde

这个姿势需要一个前提就是NX保护要关闭(做题情况可能很少,但是实际环境NX可能不开启),使用C语言编写exp,使用execl()函数执行shellcode

姿势二:构造ROP泄露内存地址

前面说过虽然进行了随机化处理,但是类似于动态链接库映射类内存,相邻两个函数真实地址的偏移是不变的。因此构造ROP首先leak出某个函数的真实地址,然后进行推算执行函数地址。进程不停,地址不会发生新的变化!

问题4:你知道的函数调用约定有哪些

stdcall、cdecl、fastcall、thiscall、naked call

问题5:stdcall、cdecl、fastacall有什么区别

  • stdcall
    • 参数从右向左入栈
    • 函数内部进行堆栈平衡
    • 编译修饰约定:下划线 + 函数名 + @ + 总参数字节数
  • cdecl
    • 参数从右向左入栈
    • 函数调用者平衡堆栈
    • 编译修饰约定:下划线 + 函数名
  • fastcall
    • 第一个和第二个小于等于DWORD长度的参数通过ecx和edx传递,其他参数从右向左入栈
    • 函数内部进行堆栈平衡
    • 编译修饰约定:@ + 函数名 + @ + 总参数字节数

以上就是这期的五个问题,我的回答一定会有一些不足之处,欢迎小伙伴们评论补充哦!编写不易,如果能够帮助到你,希望能够点赞收藏加关注哦Thanks♪(・ω・)ノ

交个朋友吧~
扫描下方二维码,一起讨论研究👇👇👇

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

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

相关文章

Http4s 存在输入验证不当漏洞(CVE-2023-22465)

漏洞描述 http4s 是一个用于处理 HTTP 服务的 Scala 接口。 http4s 的受影响版本延迟加载模型化标头&#xff08;modeled headers&#xff09;&#xff0c;用于处理规范化标头的请求&#xff08;如&#xff1a;Option[Header] req.headers.get(“User-Agent”.ci)&#xff0…

C语言进阶——字符串函数(一)

目录 一. strlen 二. strcpy 三. strcat 四. strcmp 五. strncpy 六. strncat 七. strncmp 八. strstr 九. strtok 一. strlen 字符串以 \0 作为结束标志&#xff0c;strlen函数返回的是在字符串中 \0 前面出现的字符个数&#xff08;不包 含 \0 …

陪诊软件开发,陪诊服务具备哪些好处,前景如何

在当下互联网快速发展的时代&#xff0c;我们要首先明确&#xff0c;一个行业的发展最重要的是什么&#xff0c;什么才能促进这个行业的前进。当然是用户的数量&#xff0c;**而我们的陪诊服务&#xff0c;潜在的用户数量是巨大的。因为自己独立不便就医的人群&#xff0c;都可…

maven导入第三方jar包,出现找不到类

我们开发时&#xff0c;会用到第三代第三方的jar包&#xff0c;私服上没有&#xff0c;只能导入使用。 导入步骤&#xff1a; 1、在项目根目录建文件夹lib&#xff0c;降jar包复制过去。 在pom.xml中引入jar包&#xff0c;如引入bcprov-jdk15on-1.59.jar <dependency>&…

c++ - 第21节 - 智能指针

1.为什么需要智能指针 分析一下下面这段程序有没有什么内存方面的问题&#xff1f;前面在异常的博客中&#xff0c;我们分析了下图一的代码Func函数中如果div()函数抛异常则程序会直接跳到主函数的catch捕获程序部分&#xff0c;然后接着主函数catch捕获程序部分往后执行代码&a…

【IOS的safari浏览器】uniapp的H5项目 safari<添加到主屏幕>功能的实现(多页面、单页面)

uniapp的H5项目safari <添加到主屏幕>功能的实现ios添加到主屏幕的需求具体效果实现前提完整的HTML页面如何判断应用是从主屏幕打开还是从浏览器打开特殊情况ios添加到主屏幕的需求 添加到主屏幕——这个功能属于ios的safari浏览器的特性之一&#xff0c;他可以让我们的…

Java环境安装、替换jdk后java编译javac无反应,但java和java -version可以成功:实操解决方案

这里写自定义目录标题问题背景方案一方案二方案三问题背景 最近换了新电脑&#xff0c;安装java环境&#xff0c;一次性下载了3个jdk版本&#xff0c;在配置后返现 cmd命令行下javac编译java文件不成功&#xff0c;但是输入java和java -version没问题 在CSDN看了许多解决方案…

linux安装go

下载地址 https://studygolang.com/dl?id2&id15&id0&id8&adinfo678baidu&adinfo678baidu%3Epage%3E go语言中文网 解压 tar -xvf go1.19.4.linux-amd64.tar.gz 解压之后在 root目录下面 有个 go的文件夹 vim ~/.bashrc 配置环境变量 export GOROOT/roo…

【Dash搭建可视化网站】项目10:疫情数据可视化大屏制作步骤详解

疫情数据可视化大屏制作步骤详解1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 header.py文件完善3.4 cards.py文件完善3.5 api.py和api.ipynb文件完善3.5.1 数据获取3.5.2 数据处理3.5.3 接口数据导入header.py和cards.py文…

SpringMVC基本使用

SpringMVC基本使用1、回顾MVC1.1、什么是MVC1.2、Model1时代1.3、Model2时代1.4、回顾Servlet2、什么是SpringMVC2.1、概述2.2、中心控制器2.3、SpringMVC执行原理3、HelloSpring3.1、配置版3.2、注解版3.3、小结4、Controller 及 RestFul4.1、控制器Controller4.2、实现Contro…

【笔记:第一课】学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春

文章目录前言来源正文小结前言 创作开始时间&#xff1a;2023年1月9日20:02:19 如题&#xff0c;学习一下RISC-V。 来源 https://www.bilibili.com/video/BV1Q5411w7z5/ 正文 打好基础&#xff01;好好学习 本课程目的&#xff1a; 了解 RISC-V 的相关知识学会查看RISC-…

week10

T1 Einstein学画画 题目描述 Einstein 学起了画画。 此人比较懒~~&#xff0c;他希望用最少的笔画画出一张画…… 给定一个无向图&#xff0c;包含 nnn 个顶点&#xff08;编号 1∼n1 \sim n1∼n&#xff09;&#xff0c;mmm 条边&#xff0c;求最少用多少笔可以画出图中所…

解决RuntimeError: CUDA error: out of memory

注意&#xff1a;报错内容只有这一行&#xff0c;RuntimeError: CUDA error: out of memory&#xff0c;没有后面的内存分析。 因为报错的时候忘记截图了&#xff0c;修改好了才来记录的。这里引用别的博主的图片。图片来源 1&#xff1a;刚开始我怀疑是batchsize设的太大了&a…

vue01-基础

一、vue简介 1.1 描述 一套用于构建用户界面的渐进式JavaScript框架 构建用户界面&#xff1a;把数据处理成界面 渐进式&#xff1a;可以从简单应用引入的轻量小巧核心库&#xff0c;扩展至各式vue插件 1.2 特点 1.组件化模式&#xff0c;提高代码复用率且便于维护&#…

【自学Python】Python整型(int)

Python整型(int) Python整型(int)教程 Python 整型专门用来表示整数。 Python 整型支持四种形式&#xff0c;即十进制形式、二进制形式、八进制形式和十六进制形式。 Python整型(int) 十进制形式 Python 最常见的整数就是十进制形式的整数。在使用十进制表示整数值时&…

虚拟化技术学习笔记7

1、KVM虚拟机CPU热添加&#xff1a; # 能够了解虚拟机添加CPU的作用及预准备 # 能够通过virt-manager为虚拟机添加CPU # 能够通过virsh命令为虚拟机添加CPU CPU热添加&#xff0c;不需要重新启动虚拟机。这个是CPU的热添加。 virsh list virsh dominfo centos7-1lscpuvish s…

软件测试中的网络问题

1.背景 在测试过程中&#xff0c;出现的问题&#xff0c;除了代码问题&#xff0c;还有很多的网络问题&#xff0c;所以需要了解网络知识&#xff0c;这样能发现网络问题&#xff0c;尽快解决就能提高效率。 2.计算机网络体系结构 OSI七层模型&#xff1a;物理层&#xff0c…

【链表】leetcode24. 两两交换链表中的节点(C/C++/Java/Js)

leetcode24. 两两交换链表中的节点1 题目2 思路3 代码3.1 C版本&#xff08;递归迭代&#xff09;3.2 C版本&#xff08;递归迭代&#xff09;3.3 Java版本&#xff08;递归迭代&#xff09;3.4 JavaScript版本4 总结1 题目 题源链接 给你一个链表&#xff0c;两两交换其中相…

Deep Learning for Image Super-resolution:A Survey

Abstract图像超分辨率技术是计算机视觉中提高图像和视频分辨率的一类重要的图像处理技术。近年来&#xff0c;深度学习技术在图像超分辨率方面取得了显著进展。本文旨在对基于深度学习的图像超分辨率研究进展进行综述。一般而言&#xff0c;我们可以将现有的SR技术研究大致分为…

C++设计模式:原型模式(详解+实现案例)

文章目录原型模式使用场景实现步骤案例一案例二优缺点原型模式 原型模式&#xff1a; 用原型实例指定创建对象的种类&#xff0c;并通过拷贝这些原型创建新的对象&#xff0c;简单理解就是“克隆指定对象” 使用场景 某些结构复杂的对象的创建工作中由于需求的变化&#xff…