二进制漏洞修补
2022-03-07 11:44:35

pwn漏洞修补

kaypatch(修补):

在修改完后要保存====》edit==》patch program===》apply patches to input file

整形溢出:

更换跳转指令:

将有符号跳转改成无符号跳转===》jlb改成jbe

无符号跳转:

汇编指令 描述
JA 无符号大于则跳转
JNA 无符号不大于则跳转
JAE 无符号大于等于则跳转(同JNB)
JNAE 无符号不大于等于则跳转(同JB)
JB 无符号小于则跳转
JNB 无符号不小于则跳转
JBE 无符号小于等于则跳转(同JNA)
JBNE 无符号不小于等于则跳转(同JA)

有符号跳转:

汇编指令 描述
JG 有符号大于则跳转
JNG 有符号不大于则跳转
JGE 有符号大于等于则跳转(同JNL)
JNGE 有符号不大于等于则跳转(同JL)
JL 有符号小于则跳转
JNL 有符号不小于则跳转
JLE 有符号小于等于则跳转(同JNG)
JNLE 有符号不小于等于则跳转(同JG)

栈溢出:

32:通过栈传参

通过修改接受的栈大小====》push

64:通过寄存器传参

找到相应寄存器,修改成对应值

格式化字符串:

1、修改函数:将printf函数换成puts函数(可能会被check)

call printf=====》call (填写puts的plt地址)

2、添加%s参数

先在eh_frame段中填入%s字符串===》记住该字符串的地址
修改:mov edi,offset %s地址;
mov rsi,offset format;

UAF:

修改成调用free后,释放指针:

在call free处patch,jmp至eh_frame段,填写

call 0x3f88;           #调用free函数
mov     eax, [rbp-0xc]; #取出下标值
cdqe;
lea     rdx, ds:0[rax*8];
lea rax, qword ptr [heap];
mov r8,0; #段地址不能直接赋予立即数
mov [rdx+rax],r8;
jmp 0xD56;