一、栈题的patch技巧
1、修改read的大小:
这里很明显栈大小是0x30,但是可以输入的大小是0x12C,所以绝对的栈溢出,这里改size为0x30就不会溢出了:记住是改汇编
2、第二种改法是改leave_ret为ret_ret:
修改后:
方法二只适用于只有main函数的,没有子函数调用的栈溢出类型题目。
3、当遇到gets函数时,改成read函数:
这里改到我们的en_frame段中去执行那个read函数:
将size大小改成了0x18,就不会栈溢出啦~
二、格式化字符串的patch技巧:
1、将printf函数改为puts函数:
这里通过2种方法去改成puts,一种是改机器码:
这里看到0x601030-0x400576=0x200ABA,所以我们看下puts的jmp地址:
看到是0x601018,接着计算出机器码:0x601018-0x400576=0x200AA2,所以我们改printf的那个jmp的偏移即可:
第二种改法,利用lief库去改(先装个库即可):
1 | import lief |
如果说没有puts函数,同时printf不止一个,有漏洞的,没有漏洞的printf都有,这时比较棘手,就可以在en_frame那里写,改成write函数,再写个计算buf里面字符串数目的循环即可:
我们改写汇编:
第一步,改call为jmp到的地址:
第二步,自己写个循环,判断输入有多少位,换行作为结束符:
3、跳回去看看:
成功将printf函数改成了系统调用的write函数,如果要完全一致就自己再inc rdx就行了,多个换行符
三 、堆的patch技巧:
1、UAF漏洞:
现在就在en_frame那里开个位置将其置为0:
call的是free函数的plt表地址
取出下标
cdqe
指针清空操作
执行完free,跳回下一条将要执行的指令地址
成品
跳回去:
这里记住一个点就是
1 | mov qword ptr chunk[rax*8], 0 //UAF的敌人 |
2、offbyone和offbynull
如果是单独加在末尾的,直接把这行给nop掉即可~
如果是在while循环里面的,改跳转条件即可:
这里很明显是多了一个字节,我们改汇编:jg改成jge
offbyone和offbynull都没了
3、edit时有溢出
直接改read的size即可,如果有漏洞是通过scanf触发的,那就改成read(在en_frame段改)
4、如果是由realloc触发的漏洞,改成calloc(跑脚本,改符号名)
5、删除后门函数
6、实在没招时,最后才nop掉free函数
这篇文章会持续更新~(等我遇到新的题目再说嘻嘻)
*如果做不出来题目,又不会patch,可以上bin_waf抓一波流量,虽然会down,但是可以赚到一波:
1 | //1、waf程序上传,给权限777 |