一、栈题的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 |