当前位置: 首页 > Web前端 > CSS

AWDPwn漏洞加固总结

时间:2023-03-30 16:00:29 CSS

AWD介绍AWD(AttackWithDefense,攻守兼备)模式需要在一场比赛中打出进攻方和防守方,利用漏洞攻击其他队伍得分,修复漏洞避免被被其他队伍攻击丢分。也就是说,当你攻击别人的无人机可以获得Flag积分的时候,别人就会被扣分,同时你要保护好自己的宿主不被别人攻击,也会被扣分。Patch-PWN对每个awd平台都有不同的检查机制。原则上,补丁加固只对脆弱点进行,即最小修改加固。下面总结几类不需要改变文件大小和修补漏洞点的漏洞。补丁数据跳转指令无符号跳转汇编指令说明JA无符号大于等于跳转JNA无符号不大于跳转JAE无符号大于等于跳转(同JNB)JNAE无符号不大于等于跳转(JB无符号小于,跳转JNB无符号不小于,跳转JBE无符号小于等于跳转(同JNA)JBNE无符号不小于等于跳转(同JA)有符号跳转汇编指令说明JG有符号大于,跳转JNG有符号不大于,跳转JGE有符号大于等于跳转(同JNL)JNGE有符号不大于等于跳转(同JL)JL有符号小于,跳转到JNL有符号不跳转iflessthanJLESignedlessthanorequaltojump(sameasJNG)JNLESignednotlessthanorequaltojump(sameasJG)补丁整数溢出将v2转换为int并与int48进行比较。但是当scanf读取负数时,最高位为1,unsignedint强制转换为int的结果为负数,必须小于48,并且稍后读取将导致堆栈溢出。Patch方法将第9行的if跳转汇编指令修补为无符号跳转指令。具体指令参见跳转指令。使用keypatach修改:jle-->jbePatch-stackoverflow对于栈溢出加固,x64比较容易,因为它使用寄存器传递参数,而x86使用栈传递参数,需要使用nop等来保持硬化前后空间不变。x64image-20210715165543609Patch方法100为第三个参数,存储寄存器为rdx。找到汇编指令将参数传给rdx进行patch。默认使用ida修改插件(Edit-PatchProgram-Changeword),也可以使用keypatach:0x64是长度0xBA是操作符0x64-->0x20x86不需要对齐找指令到入栈,修改push的值修改值需要加0x这里修改前的size是2,修改后的size也是2,所以本题Patch不需要用nop来维护size和需要对齐才能找到push指令。修改入栈值后直接修改0x20,size长度没有对齐,会引起栈空间变化。对齐需要使用nop:更方便快捷的方法是检查NOPspaddinguntilnextinstructionboundary自动填充。patch-格式字符串修改函数将printf修改为puts,并将调用地址修改为putsplt地址:该方法的局限性在于puts会在原字符串中添加\n,发起人检查可能不会修改printf,因为这个参数把printf(format)改成printf("%s",format),修改printf前面的传参指令:movedi,offset0x400c01;movesi,偏移格式;Patch-UAF修改逻辑是劫持call指令跳转到。在eh_frame段上编写的自定义汇编程序。先把代码写在.eh_frame段上,先调用free完成释放,然后将chunk_list归零。chunk_list地址的编译可以从callfree前面复制过来:call0x900;#callthefreefunction(pltaddress)moveax,[rbp-0xc];#取出下标值cdqe;leardx,ds:0[rax*8];learax,qwordptr[heap];movr8,0;#段地址不能直接赋给立即数mov[rdx+rax],r8;jmp0xD56;#跳转回原地址image-20210713134459423Patch-if范围假设需要把图片上的第二个if放到if结构中,修改跳转地址:原跳转代码:js0x40081C-->js0x400845Patch-replacingthedangerousfunction和uaf类似,写汇编实现函数调用,dangerousfunction用其他函数代替。如果程序中没有目标函数,则通过系统调用来调用。将gets替换为read,将.eh_frame输入汇编,将rdi的写地址移至rsi,将其他寄存器作为参数传递,进行系统调用: