AWD简介
AWD(AttackWithDefense,攻防兼备)模式需要在一场比赛里要扮演攻击方和防守方,利用漏洞攻击其他队伍进行得分,修复漏洞可以避免被其他队伍攻击而失分。也就是说,攻击别人的靶机可以获取Flag分数时,别人会被扣分,同时也要保护自己的主机不被别人攻陷而扣分。
Patch-PWN
各家awd平台检查机制各不相同,原则上是只针对漏洞点进行patch加固,也就是最小修改加固。以下总结不需要改动文件大小、针对漏洞点进行patch的几种漏洞类型。
Patch资料
跳转指令
无符号跳转
有符号跳转
Patch-整数溢出
Scanf以longint长整形读取输入到unsignedint变量v2中,然后将v2强制转为int再与int48比较。
但从scanf读入一个负数时,最高位为1,从unsignedint强制转换为int结果是负数,必定比48小,在后面read读入会造成栈溢出。
Patch方法
将第9行的if跳转汇编指令patch为无符号的跳转指令,具体指令参考跳转指令。
使用keypatach进行修改:
jle--jbe
Patch-栈溢出
对于栈溢出加固,x64更容易一些,因为是使用寄存器传参,而x86使用栈传参,需要用nop等保持加固前后的空间不变。
x64
Patch方法
是第三个参数,存储寄存器是rdx,找到给rdx传参的汇编指令进行patch
使用ida默认修改插件修改(Edit-PatchProgram-Changeword),也可以用keypatach:
0x64是长度
0xBA是操作符
0x64--0x20
x86
不需要对齐
找到压栈的指令,修改压入的数值
修改数值需要补上0x
这里修改前size为2,修改后size也为2,所以这题patch不需要用nop保持size
需要对齐
找到压栈的指令,修改压入的数值
直接修改0x20后,size长度不对齐,会引起栈空间变化,需要用nop进行对齐:
更方便快捷方法是勾选NOPspaddinguntilnextinstructionboundary进行自动填充。
Patch-格式化字符串
修改函数
将printf改为puts,将call的地址改为putsplt