【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

相关文章

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n