字母数字shellcode

逆向工程 外壳代码 元破解
2021-06-25 08:24:00

我用这个命令生成了一个字母数字的 shellcode:

msfvenom -a x86 --platform linux -p linux/x86/exec CMD=/bin/sh -e x86/alpha_mixed BufferRegister=ECX -f python

我的目标是 Linux 上的 32 位 x86 架构。

这是shell代码(我已将其转换为字符串):

IIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJI0jTK68mIcbCVrHDmsSOyywSXfO2SsXgpe86OSRSY2NOyYs1Byxc8s0WpUPDo0b2I2NVOCCSXs0V7RsK9yq8Mk0AA

这是一个运行 shellcode 的非常基本的 c 程序:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

typedef void (*shellcode_t)();
// unsigned char code[] = "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";
unsigned char code[] = "IIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJI0jTK68mIcbCVrHDmsSOyywSXfO2SsXgpe86OSRSY2NOyYs1Byxc8s0WpUPDo0b2I2NVOCCSXs0V7RsK9yq8Mk0AA";


int main (int argc, char * argv[])
{
  shellcode_t appel = (shellcode_t)code;
  appel();

  return 0;
}

这是我编译它的方法:

$ cc -Wall -m32 -z execstack -fno-stack-protector -O0 test.c -o test

当我运行程序时,出现段错误。

请注意我在 c 程序中注释的经典 shellcode 工作得很好。所以这不是ac程序编译问题。

谢谢

1个回答

字母数字 shellcode 期望 shellcode 的位置存储在寄存器中,因为通常的 call/pop 技术不能用有限的字符集执行。

在上面的示例中,这是使用 BufferRegister=ECX 设置的,但是您的 C 程序并未考虑到这一点,这就是它崩溃的原因。去掉 BufferRegister 指令会给你一个 shellcode blob,它手动确定位置,但不是纯字母数字。不过,这应该在您的程序中运行。

另一种方法是使用从文件运行 shellcode 的东西,因为它们通常有一个 jmp/call reg32,然后您可以将其与 BufferRegister 一起使用。