【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中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

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.