使用pwnable.kr 06-随机和09-错误解决问题

图片

在本文中,我们将学习如何拦截在库函数和程序之间传输的数据,记住文件描述符,并从pwnable.kr网站解决第6和第9个任务。

组织信息
特别是对于那些想要学习新知识并在信息和计算机安全性的任何领域中发展的人们,我将撰写和讨论以下类别:

  • PWN;
  • 密码学(加密);
  • 网络技术(网络);
  • 反向(反向工程);
  • 隐写术(Stegano);
  • 搜索和利用Web漏洞。

除此之外,我将分享我在计算机取证,恶意软件和固件分析,对无线网络和局域网的攻击,进行笔测试和编写漏洞利用程序方面的经验。

为了使您可以查找有关新文章,软件和其他信息的信息,我在Telegram中创建了一个频道,并创建了一个小组来讨论 ICD领域中的所有问题 。 另外,我会亲自考虑您的个人要求,问题,建议和建议, 并会回答所有人

提供所有信息仅出于教育目的。 对于由于使用本文档而获得的知识和方法对某人造成的任何损害,本文档的作者不承担任何责任。

随机任务的解决方案


我们单击带有随机签名的图标,并被告知需要通过SSH与密码guest连接。

图片

连接后,我们会看到相应的横幅。

图片

让我们找出服务器上有哪些文件,以及我们拥有的权限。

ls -l 

图片

这样,我们就可以读取程序的源代码,因为每个人都有读取的权利,并可以根据所有者的权利随机执行程序(设置粘性位)。 让我们看看代码的结果。

图片

该程序生成一个随机数,应用XOR操作(异或),并且如果XOR操作的结果等于参考值,它将显示一个标志。

事实是该程序中使用了rand()函数。 该函数生成伪随机数,转换srand()函数生成的“纹理”。 每次调用rand()之前都必须调用srand(number)函数。 如果这没有发生,则默认情况下,在rand()之前先触发srand(1)。

因此,在该程序中,伪随机数生成器根据相同的算法每次都转换相同的“纹理”。 我们需要找出rand()函数返回的数字,并附带参考值。 由于XOR操作是可逆的,因此将接收到的值传递给程序的输入,我们得到一个标志。

让我们截取rand()库函数和程序之间的数据。 为此,请使用ltrace实用程序。

 ltrace ./random 

图片

我们可以看到rand()函数用什么参数调用以及返回什么值。 现在,将该值与参考值相乘。

图片

我们将结果编号提交到程序的输入中。

图片

我们通过标志并获得如此简单任务的一分。

图片

解决错误


我们单击带有错误签名的图标,然后告知我们需要通过SSH与密码guest连接。

图片

连接后,我们会看到相应的横幅。

图片

让我们找出服务器上有哪些文件,以及我们拥有的权限。

 ls -l 

图片

因此,由于每个人都有读取的权利,因此我们可以读取程序的源代码,并根据所有者的权利执行错误程序(设置了sticky-bit)。 让我们看看代码的结果。

图片

在程序的开头,将打开一个文件并创建一个描述符。 关于文件描述符,我已经在文章中进行了详细介绍。 但事实是这种情况犯了一个错误。 因此,首先进行比较,其结果是一个谎言,然后将该错误结果(即0)分配给变量fd。

图片

接下来,调用sleep函数,并且在不建议输入pw_buf变量的情况下,将读取数据。 但是由于条件错误,它们不是从带有密码的打开文件中读取的,而是从标准输入(句柄0)中读取的。

接下来,我们输入10个字符,每个字符争吵为1,并与密码进行比较。

图片

因此,我们输入两行,其中的字符应产生XOR操作的结果,我们将找到两个字符,如果对它们进行代理,则得到1。

图片

这些是字符A和@。 现在,在程序中输入两行,其中十个字符为“ A”,另一行为“ @”。

图片

我们交出国旗,再得一分。

图片

在以下文章中见!

我们在电报频道中: Telegram中频道

Source: https://habr.com/ru/post/zh-CN460527/


All Articles