二进制漏洞修补
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;