漏洞fix简明教程

漏洞fix简明教程

栈溢出漏洞

直接限制输入大小,非常简单不过多介绍

格式化字符串漏洞

方法一

把printf函数改为puts函数,比较简单。但是puts函数与printf函数还是有一点点区别的,因为puts函数是自动在输出的字符串尾部加入一个回车符,在有些比赛的check脚本中是通过比较两次输入与输出是否全等,就会导致这种patch方法不能过关。

方法二

给printf函数添加参数

首先需要在.eh_frame写入参数%s

image-20250314135953219

然后改变printf参数

改变前

image-20250314140046965

改变后

image-20250314140146839

1
2
3
主要思路就是改变前第一个参数rdi改为rsi,再通过mov rax , 0;这个命令的位置,给rdi参数赋值,mov rdi,offset %s_addr

X86ASM

整数溢出漏洞

UAF漏洞

方法一

跳转到.eh_frame段,布置代码进行指针清空,但是需要.eh_frame可执行权限

修复前

image-20250314163937040

修复后

image-20250314164009351

取下标的操作和原函数保持一致就行

方法二

直接重写free操作

修复前

image-20250314170432801

修复后

image-20250314170508871

1
2
3
4
5
6
7
8
9
10
11
mov rax, qword ptr [rbp+var_4]  ; 取idx
shl eax, 3 ; idx 乘以 8
lea rdx, qword ptr [0x4060] ; 取 heap_list 的地址
add rdx, rax ; 计算索引的地址
push rdx ; 将堆指针 压到stack 上
mov rdi,[rdx] ; 取heap地址
call _free ; free heap ;ret 后 rdi 寄存器是空的
pop rdx ; 取出指向heap的指针
mov [rdx], rdi ; 清空指针的内容


这种方法比较万能,但是比较吃字节控制

Off-By-One漏洞