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
当然也有其他办法:比如修改canary校验的代码为指针清0的汇编代码
3.2 off-byte-one/off-byte-null
off-byte-one
和off-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