Pwn之简单patch

Stella981
• 阅读 677

亲爱的,关注我吧

文章共计1389个词

图片xue微有点多

注意流量哦

预计阅读7分钟

来和我一起阅读吧

≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈

1 引言

在攻防的时候不仅仅需要break,还需要fix将漏洞patch上。

2 工具

这里我使用的是keypatch这个ida脚本

下载地址:https://github.com/keystone-engine/keypatch/blob/master/keypatch.py

3 栈溢出的patch

漏洞原理

由于输入函数的输入长度超过了局部变量所开辟的空间,因此使得输入能够覆盖到返回地址

patch

简单了解原理之后,我们可以知道,栈溢出起始就是输入的长度过大,那么我们将输入长度修改到局部变量开辟空间的范围内即可

例子

32为情况下

Pwn之简单patch

我们可以看到,buf距离ebp(栈底)距离0x28,但是输入却能够输入0x100,很明显的栈溢出漏洞

Pwn之简单patch

可以看到这里参数为0x100,因为32位程序是通过栈传参的。

Pwn之简单patch

再装好keypatch之后,会在Edit选项栏中出现keypatch的选项,接着选中参数0x100,点击patch

Pwn之简单patch

将长度改成小于0x28即可,这里需要注意输入长度要为16进制。这里输入输入3个nop指令是因为这条指令本身Size为5,然后push 0x20为2,因此需要填充三个nop与原本的Size一致。

Pwn之简单patch

修改完毕后,保存即可

64位情况下

我们知道64位下是通过寄存器传参数的,因此我们再找长度的参数时,找到相应的寄存器即可

Pwn之简单patch

例如read函数的长度参数是通过rdx(edx)传入的,找到相应的寄存器按照上面方法修改即可。

4 格式化字符串的patch

漏洞原理

格式化字符串的漏洞是因为,程序中存在着格式化字符串输出函数,典型的printf,但是printf,只有格式化字符串参数,而没有后续的参数一,参数二,并且格式化字符串参数由我们所控制,从而导致了任意地址读写的漏洞触发。

例子

Pwn之简单patch

题目中存在着典型的格式化字符串漏洞,那么修改漏洞有几种方法,例如将printf函数修改为puts函数或者添加%s的参数。

方法一

若程序中即存在printf函数,又存在puts函数,那么我们可以将printf函数修改为puts函数

Pwn之简单patch

我们找到puts函数的plt表地址,因为puts函数也是带一个参数,并且puts函数与printf函数的plt表地址长度一致,因此直接修改不会造成程序down掉

Pwn之简单patch

修改成puts函数的地址

Pwn之简单patch

修改成功后的效果,但是puts函数与printf函数还是有一点点区别的,因为puts函数是自动在输出的字符串尾部加入一个回车符,在有些比赛的check脚本中是通过比较两次输入与输出是否全等,就会导致这种patch方法不能过关。

方法二

加入一个%s参数

Pwn之简单patch

可以看到除了传递格式化字符串参数以为,程序还存在mov eax,0,我们可以利用该指令修改,但是想要修改为%s还有一个问题,程序中不存在%s这个字符,就需要我们手动添加进去

Pwn之简单patch

我们可以在.eh_frame这个段中填入%s这个字符串,这个段中的信息不会影响程序的正常运行。

Pwn之简单patch

记住填入的地址0x400c01

Pwn之简单patch

mov edi, offset 0x400c01;

mov rsi,offset format;

完成参数修改

Pwn之简单patch

修改完成

堆之uaf漏洞

堆中较为常见的漏洞use after free

漏洞原理

由于堆块释放后没有给指针置空,使得被释放的堆块能够被修改或者重复使用,导致漏洞

例子

Pwn之简单patch

free完之后没有将指针置空,很明显的uaf漏洞,想要修补uaf漏洞,则将free之后的指针置空即可

Pwn之简单patch

可以看到在调用完free之后,没有多少空间可以写下新的汇编代码,因此需要与上一个方法一致,跳转到.eh_frame段上

Pwn之简单patch

将call free指令修改为跳转指令,在.eh_frame段上写汇编代码

Pwn之简单patch

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;

Pwn之简单patch

patch效果

5 总结

对于栈溢出来说,patch比较简单,只需要修改输入长度即可

对于格式化字符串漏洞来说,若有puts函数则将printf函数修改为puts函数,若没有则在.eh_frame段上创造%s

对于堆的uaf来说,漏洞patch思路很简单,只需要将指针置空即可,但是需要了解汇编代码。

6 参考文章

https://xz.aliyun.com/t/5868

7 相关实验--CTF-PWN练习

PWN是CTF竞赛中的主要题型之一,主要考查参赛选手的逆向分析、漏洞挖掘以及Exploit编写能力。通过由浅入深的方式,一步一步讲解栈溢出攻击原理与实践,同时详细介绍了Linux下GDB调试器的基本使用方法。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这