awd patch 技巧

2024-10-12

0. 整数溢出

整型溢出一般只需修改跳转指令
修改后:

1. 栈

1.1 栈溢出:read函数

可以直接把参数patch为所需数值即可

2. 格式化字符串

针对这个场景,一种办法是把printf改为puts(修改plt),但是校验严格就不能用
另一种办法是利用eh_frame段(其他可读的段空闲空间 均可)写入格式化字符串
然后修改汇编代码:不知道为什么,自己编写的printf函数编译后前面总是有个mov eax,0指令,可以靠它修改
但是5个字节不够你写(64位程序),这时发现有两个没用的mov eax,0,你需要调换一下位

3. 堆

3.1 uaf

对于有uaf的漏洞,需要做2步:

1. 把call free函数替换掉,比如 jmp xxxx(二进制文件某个可执行segment中的section)

2. 010editor修改相应segment的权限为rwx

3.2 off-byte-one/off-byte-null

off-byte-oneoff-byte-null成因类似,所以放在一起。
通常这种问题只需修改跳转指令,或修改参数数字即可完成patch。

修改0x20为0x1f,或修改jle为jl均可

4. 当现有elf文件结构不满足patch时:lief

如果patch要求添加额外代码且原elf文件中没有空间给你新增额外代码,首选的解决方案是通过lief往elf文件中添加代码区间
lief的使用很简单,直接用pip install lief即可安装
详情可看官方文档https://lief.re/doc/latest/formats/elf/python.html#binary

4.1 lief修改symbols

源码如下:亲测有效

import lief
PATH = "./test"

# print elf info
binary: lief.ELF.Binary = lief.ELF.parse(PATH)

# change symbol
printf_sym = next(i for i in binary.imported_symbols if i.name == "printf")
printf_sym.name = "system"
binary.write("./test1")

4.2 lief添加segments

写一个自己的库文件:

//gcc -nostdlib -nodefaultlibs -fPIC -Wl,-shared hook.c -o hook
void myprintf(){
  asm(
      "mov $0xa6e75736e6f6874,%rsi\n"
      "mov $0x0,%rdi\n"
      "mov $0x8,%rdx\n"
      "mov $0x1,%rax\n"
      "syscall"
  );
}

然后对目标程序添加segment:

import lief
PATH = "./test"
LIB_PATH = "./hook"

# print elf info
binary: lief.ELF.Binary = lief.ELF.parse(PATH)
lib: lief.ELF.Binary = lief.ELF.parse(LIB_PATH)

# add segments
added_segment = binary.add(lib.segments[1])
binary.write("./test2")

添加segment的目的是开辟一段可以用来执行shellcode的空间
添加segment后,接下来的步骤之前提到的一样,手动打patch。

5. 通防

5.1 sandbox通防

简单介绍一下linux的sandbox机制。
sandbox直译就叫做沙盒,在linux中沙盒主要用来限制进程可执行的系统调用。
要想实现进程沙盒,对于开发者来说最方便的做法是使用seccomp,seccomp提供接口允许进程限制自己哪些系统调用可以被执行
seccomp是对prctl机制封装而来,prctl是linux提供的一个系统调用,用于控制和修改进程的行为和属性
prctl执行沙盒限制的机制又通过BPF来实现,BPF(Berkeley Packet Filter)最初用于过滤网络报文,实际上发展为了通用的虚拟机,执行特定的字节码,它允许用户向内核注册代码
沙盒通防的一个开源工具如下:
https://github.com/TTY-flag/evilPatcher
详情原理可看https://bbs.kanxue.com/thread-273437.htm

5.2 流量记录-防御-转发

https://github.com/i0gan/pwn_waf
可以实现流量的记录-防御以及转发,不过个人应该只会用记录和转发的功能

references

https://blog.csdn.net/weixin_72981769/article/details/141086735
https://gdufs-king.github.io/2020/01/03/AWD%E4%B8%ADpwn%E9%A2%98%E7%9A%84patch%E6%8A%80%E5%B7%A7%E6%80%BB%E7%BB%93/
https://xz.aliyun.com/t/13881?time__1311=GqmxnD0D2DuQG%3DD%2FirPBK4Y5MDWTz07ufbD#toc-2
https://blog.csdn.net/qq_54218833/article/details/129959460