PWN January 03, 2020

AWD中的patch技巧总结

Words count 6k Reading time 5 mins. Read count 0

一、栈题的patch技巧

1、修改read的大小:

57414473770

这里很明显栈大小是0x30,但是可以输入的大小是0x12C,所以绝对的栈溢出,这里改size为0x30就不会溢出了:记住是改汇编

57414615546

57414613089

2、第二种改法是改leave_ret为ret_ret:

57414497785

修改后:

57414494576

方法二只适用于只有main函数的,没有子函数调用的栈溢出类型题目。

3、当遇到gets函数时,改成read函数:

57414790857

这里改到我们的en_frame段中去执行那个read函数:

57414818700

将size大小改成了0x18,就不会栈溢出啦~

57414820646

二、格式化字符串的patch技巧:

1、将printf函数改为puts函数:

57414842269

这里通过2种方法去改成puts,一种是改机器码:

57414854481

这里看到0x601030-0x400576=0x200ABA,所以我们看下puts的jmp地址:

57414862139

看到是0x601018,接着计算出机器码:0x601018-0x400576=0x200AA2,所以我们改printf的那个jmp的偏移即可:

57414889198

第二种改法,利用lief库去改(先装个库即可):

1
2
3
4
5
6
7
import lief
binary = lief.parse(sys.argv[1])
puts_sym = filter(lambda e: e.name == "printf", binary.dynamic_symbols)[0]
puts_sym.name = "puts"
binary.write("format_patch");
#编译命令:
#python test.py format

57414909470

如果说没有puts函数,同时printf不止一个,有漏洞的,没有漏洞的printf都有,这时比较棘手,就可以在en_frame那里写,改成write函数,再写个计算buf里面字符串数目的循环即可:

57414973287

我们改写汇编:

第一步,改call为jmp到的地址:

57415037795

第二步,自己写个循环,判断输入有多少位,换行作为结束符:

57415042099

3、跳回去看看:

57415032230

成功将printf函数改成了系统调用的write函数,如果要完全一致就自己再inc rdx就行了,多个换行符

三 、堆的patch技巧:

1、UAF漏洞:

57415128983

现在就在en_frame那里开个位置将其置为0:

57415187080

call的是free函数的plt表地址

image-20200603161144247

取出下标

image-20200603161747627

cdqe

image-20200603161811919

指针清空操作

image-20200603162646418

执行完free,跳回下一条将要执行的指令地址

image-20200603162214356

成品

57415188216

跳回去:

57415185846

这里记住一个点就是

1
mov qword ptr chunk[rax*8], 0    //UAF的敌人

2、offbyone和offbynull

如果是单独加在末尾的,直接把这行给nop掉即可~

如果是在while循环里面的,改跳转条件即可:

57415373994

57415309577

这里很明显是多了一个字节,我们改汇编:jg改成jge

57415313728

57415315085

57415316144

offbyone和offbynull都没了

3、edit时有溢出

直接改read的size即可,如果有漏洞是通过scanf触发的,那就改成read(在en_frame段改)

4、如果是由realloc触发的漏洞,改成calloc(跑脚本,改符号名)

5、删除后门函数

6、实在没招时,最后才nop掉free函数

这篇文章会持续更新~(等我遇到新的题目再说嘻嘻)

*如果做不出来题目,又不会patch,可以上bin_waf抓一波流量,虽然会down,但是可以赚到一波:
1
2
3
4
//1、waf程序上传,给权限777
//2、mv我们的waf名字为题目名字
//3、mv我们的题目名字为dummy
//4、查看waf_log既可知道别人的流量情况
0%