【PWN】学习笔记(三)【返回导向编程】(上)

2023-12-11 21:30

本文主要是介绍【PWN】学习笔记(三)【返回导向编程】(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 课程
  • 回顾
    • ret2shellcode
  • ret2syscall

课程

课程链接:https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source=7b06bd7a9dd90c45c5c9c44d12e7b4e6
课程附件: https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6

回顾

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

ret2shellcode

在这里插入图片描述
局部变量肯定会发生溢出,一直输入0x64字节打满,再输入一个字节到0x68覆盖ebp指向上一个函数的地址,最后再加上一个字节覆盖返回地址
在这里插入图片描述
在这里插入图片描述
用gdb调试的主要目的还是找到正常情况下(即输入8个A后)字符串所在的位置(即ebp与esp的位置)
在这里插入图片描述
在最开始的寄存器也可以看到,如果隔得太远就需要把stack后面的项数调大一些
在这里插入图片描述
这里esp存放的是一个指针,gdb会自动把指针指向的数据打印出来
在这里插入图片描述
在这里插入图片描述
从字符串所在的地址到ebp所在的地址是我们关心的位置,用来填充适量的垃圾数据
在这里插入图片描述
我们可用python来计算需要填充多少垃圾数据,即计算二者的差值
但是我们会发现,这与IDA告诉我们的值(0x64)不同
当两者发生冲突肯定是动态调试是准确的,因为IDA是静态的
在这里插入图片描述
由于没有直接的后门程序,我们应该将shellcode写入缓冲区,这里不用考虑栈了(可能被远程地址随机化了),考虑Bss的缓冲区位置,我们可以发现在strncpy(buf2,s,0x64u)提供了位置【将第二个参数(s)中的指定长度(0x64个字节)拷入第一个参数(buf2)中】
由于我们没有在main函数中看到buf2的定义,由此可判定其为全局变量
在这里插入图片描述
其在Bss位置(804A080)
在这里插入图片描述
此时我们拥有了shellcode以及远程服务器所保存shellcode的目标地址
在这里插入图片描述
我们首先应填充shellcode的地址再向后补充垃圾数据,这是因为这一部分数据被拷贝到buf2中后首先执行前面的数据(shellcode),最后把buf2的起始地址填充之前的返回地址进行跳转即可。
值得注意的是,我们可利用.ljust(num,b’X’)以补全字符X到固定长度num;以及最后的地址记得转p32
在这里插入图片描述
最后发送并交互来打通
在这里插入图片描述
防御者提前放一个canary(金丝雀)以保护,当s覆盖掉后,防御者会检测新的canary和旧的是否保持一致
值得注意的是,在64位下时,需要在脚本中提前写context.arch = “amd64”
以及shellcraft.amd64.sh()
后续加上ebp的字节是8而不是4
以及是p64不是p32
gdb默认是关闭ASLR的

ret2syscall

在这里插入图片描述
在这里插入图片描述
ldd 可查看一个程序所用到的所有动态链接库
libc.so.6是一个软链接,即快捷方式
在这里插入图片描述
eax永远存的是系统调用号,后续的寄存器保存系统调用的参数,最后通过int 0x80这样一个指令来执行,这里的int是中断的意思,不同的中断号表示的系统调用不同
ROP的意思是,组合分离的这些指令变成系统调用【现实情况下是没有这些连续的代码的】
在这里插入图片描述
之前的溢出覆盖return address已经不足以完成攻击,从红色框可见形成了一个链
在这里插入图片描述
我们可使用ROPgadget找到文件中大量的制定代码段,也就是gadget
在这里插入图片描述
我们随机选取一个地址,在IDA中按G输入这样的地址
在这里插入图片描述
可以看到这段代码的位置,也就是说我直接跳转到这个位置可以直接执行这段代码
text段存在过多的pop ret这样的指令
在这里插入图片描述
在这里插入图片描述
此时已成功实现栈溢出。stack overflow;ret;为溢出的第一行返回地址
在返回地址之后又接着溢出了一些内容
栈中的内容和text中的内容对应
ret 在x86中对应 pop eip,就会把0x08052318指向的值pop到eip中,即对应的 pop edx; ret;那么就需要执行这段代码
值得注意的是此时esp往上走指向了数据0x0c0c0c
在这里插入图片描述
根据pop edx; ret;以及esp之前指向的是值value,那么先把值value存放在edx中,同时esp继续向高地址移动,指向0x0809951f
紧接着执行ret,那么esp继续向高地址移动,并且把0x0809951f指向的代码放入eip,等效于pop eip,就需要执行xor eax, eax; ret;
在这里插入图片描述
xor eax, eax; ret;
xor eax, eax;表示清空eax,为eax赋值为0
ret;表示pop eip,同理
在这里插入图片描述
mov eax, edx; ret;
mov eax, edx;表示把eax中的值给edx对应的位置【注意这是AT&T不是intel,二者是反过来的】
我们可以发现,这要代码段的结尾是ret,这样的情况就能无限循环下去
在这里插入图片描述
在这里插入图片描述
先checksec目标程序
在这里插入图片描述
在这里插入图片描述

用IDA进行反编译,先尝试在functions window中ctrl+f找后门函数(system)【这里是没有的】
在这里插入图片描述
还可以在汇编窗口按shift+f12再来搜索/bin/sh,这里是有的,可以跳转看看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找一下引用它的位置;此时我们程序中有/bin/sh字符串但是没有system函数,没有后门函数;虽然有后门函数对应的参数,但是也没用

在这里插入图片描述
回到main函数回到汇编窗口【在函数窗口双击即可】,再按f5到c语言程序
在这里插入图片描述
在这里插入图片描述

找一下对应的gadget,根据我们的目标,先找到pop eax以及pop ebx,对于ecx和ebx我们运气好的话在调用时默认为0
在这里插入图片描述

这里老师为了简单说明,直接看写好的文件了。
这里没有直接pop ebx的gadget,只有可替代的
在这里插入图片描述

以上是整个函数调用栈的构造

这篇关于【PWN】学习笔记(三)【返回导向编程】(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482162

相关文章

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp