Skip to content

执行 Shellcode

Warning

The current page still doesn't have a translation for this language.

You can read it through Google Translate.

Besides, you can also help to translate it: Contributing.

介绍

shellcode 是一段用于利用软件漏洞而执行的代码,shellcode 为16进制之机械码,以其经常让攻击者获得 shell 而得名。shellcode 常常使用机器语言编写。 可在暂存器 eip 溢出后,塞入一段可让 CPU 执行的 shellcode 机械码,让电脑可以执行攻击者的任意指令。在编译时关闭 ASLR、NX 、CANARY 选项,这样就可以在输入时把 shellcode 布置在栈中,通过动态调试获得所需要的 padding 溢出到返回地址为输入的 shellcode 地址,这样程序返回后便会执行 shellcode。

demo

示例

下面给出一个经典例子,验证程序溢出后执行 shellcode,编译的环境为 winxp 工具为 vc6.0。

#include <stdio.h>
#include <windows.h>

#define PASSWORD "1234567"

int verify_password(char *password)
{
    int authenticated;
    char buffer[50];
    authenticated = strcmp(password,PASSWORD);
    memcpy(buffer,password,strlen(password)); 
    return authenticated;
}

void main()
{
    int valid_flag =0;
    char password[1024];
    FILE *fp;

    LoadLibrary("user32.dll");

    if (!(fp=fopen("password.txt","rw+")))
    {
        exit(0);
    }
    fscanf(fp,"%s",password);

    valid_flag = verify_password(password);

    if (valid_flag !=0)
    {
        printf("incorrect password!\n\n");
    }
    else
    {
        printf("Congratulation! You have passed the verification!\n");
    }
    fclose(fp);
    getchar();
}

编译完成后拖入 OllyDbg 动态调试确定 padding 的长度,在 memcpy 处下一个断点方便随后调试。可以先生成50 BYTES 的 padding 比较与返回地址的距离,最后确定为60 BYTES 后为返回地址。

demo

输入的字符串会被复制到栈中 0012FAE4 的位置。

demo

因为通过合理的 padding 控制了返回地址到 0012FAE4,所以在函数返回时寄存器 EIP 的值为 0012FAE4,这时系统会认为栈中的数据为机器码,程序就会执行地址为 0012FAE4 的代码。

demo

password.txt 中的内容为精心布置的机器码,功能是弹出一个消息框,内容为 hackhack。如何编写 password.txt 中的内容,我们放在后面的章节来讲,本章着重介绍整个执行流程。

如我们所期望的,程序返回后执行了弹窗功能。

demo

参考阅读

0day安全:软件漏洞分析技术

cve-2015-8277