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