9/27
文章共计1389个词
图片xue微有点多
注意流量哦
预计阅读7分钟
来和我一起阅读吧
1
引言
在攻防的时候不仅仅需要break,还需要fix将漏洞patch上。
2
工具
这里我使用的是keypatch
这个ida脚本
下载地址:https://github.com/keystone-engine/keypatch/blob/master/keypatch.py
3
栈溢出的patch
漏洞原理
由于输入函数的输入长度超过了局部变量所开辟的空间,因此使得输入能够覆盖到返回地址
patch
简单了解原理之后,我们可以知道,栈溢出起始就是输入的长度过大,那么我们将输入长度修改到局部变量开辟空间的范围内即可
例子
32为情况下
我们可以看到,buf
距离ebp
(栈底)距离0x28,但是输入却能够输入0x100
,很明显的栈溢出漏洞
可以看到这里参数为0x100
,因为32位程序是通过栈传参的。
再装好keypatch
之后,会在Edit
选项栏中出现keypatch
的选项,接着选中参数0x100
,点击patch
将长度改成小于0x28
即可,这里需要注意输入长度要为16进制。这里输入输入3个nop
指令是因为这条指令本身Size为5,然后push 0x20
为2,因此需要填充三个nop
与原本的Size一致。
修改完毕后,保存即可
64位情况下
我们知道64位下是通过寄存器传参数的,因此我们再找长度的参数时,找到相应的寄存器即可
例如read
函数的长度参数是通过rdx(edx)传入的,找到相应的寄存器按照上面方法修改即可。
4
格式化字符串的patch
漏洞原理
格式化字符串的漏洞是因为,程序中存在着格式化字符串输出函数,典型的printf
,但是printf,只有格式化字符串参数,而没有后续的参数一,参数二,并且格式化字符串参数由我们所控制,从而导致了任意地址读写的漏洞触发。
例子
题目中存在着典型的格式化字符串漏洞,那么修改漏洞有几种方法,例如将printf
函数修改为puts
函数或者添加%s
的参数。
方法一
若程序中即存在printf
函数,又存在puts
函数,那么我们可以将printf
函数修改为puts
函数
我们找到puts
函数的plt
表地址,因为puts
函数也是带一个参数,并且puts
函数与printf
函数的plt
表地址长度一致,因此直接修改不会造成程序down掉
修改成puts
函数的地址
修改成功后的效果,但是puts
函数与printf
函数还是有一点点区别的,因为puts
函数是自动在输出的字符串尾部加入一个回车符,在有些比赛的check
脚本中是通过比较两次输入与输出是否全等,就会导致这种patch
方法不能过关。
方法二
加入一个%s
参数
可以看到除了传递格式化字符串参数以为,程序还存在mov eax,0
,我们可以利用该指令修改,但是想要修改为%s
还有一个问题,程序中不存在%s
这个字符,就需要我们手动添加进去
我们可以在.eh_frame
这个段中填入%s
这个字符串,这个段中的信息不会影响程序的正常运行。
记住填入的地址0x400c01
mov edi, offset 0x400c01;mov rsi,offset format;
完成参数修改
修改完成
堆之uaf漏洞
堆中较为常见的漏洞use after free
漏洞原理
由于堆块释放后没有给指针置空,使得被释放的堆块能够被修改或者重复使用,导致漏洞
例子
free
完之后没有将指针置空,很明显的uaf
漏洞,想要修补uaf
漏洞,则将free
之后的指针置空即可
可以看到在调用完free
之后,没有多少空间可以写下新的汇编代码,因此需要与上一个方法一致,跳转到.eh_frame
段上
将call free
指令修改为跳转指令,在.eh_frame
段上写汇编代码
call 0x900; #调用free函数mov eax, [rbp-0xc]; #取出下标值cdqe;lea rdx, ds:0[rax*8];lea rax, qword ptr [heap];mov r8,0; #段地址不能直接赋予立即数mov [rdx+rax],r8;jmp 0xD56;
patch效果
5
总结
对于栈溢出来说,patch比较简单,只需要修改输入长度即可
对于格式化字符串漏洞来说,若有
puts
函数则将printf
函数修改为puts
函数,若没有则在.eh_frame
段上创造%s
对于堆的
uaf
来说,漏洞patch思路很简单,只需要将指针置空即可,但是需要了解汇编代码。
6
参考文章
https://xz.aliyun.com/t/5868
7
相关实验
CTF-PWN练习
https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014103116591300001
PWN是CTF竞赛中的主要题型之一,主要考查参赛选手的逆向分析、漏洞挖掘以及Exploit编写能力。通过由浅入深的方式,一步一步讲解栈溢出攻击原理与实践,同时详细介绍了Linux下GDB调试器的基本使用方法。
9/27
欢迎投稿至qq:3200599554
有才能的你快来投稿吧!
投稿细则都在里面了,点击查看哦
重金悬赏 | 合天原创投稿涨稿费啦!
戳