【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 Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言