写在前面的话:

ShellCode是一门艺术,就像围棋手门追求的“神之一手”,今天就来初探一下这让人疯狂的艺术;

零、代码0

相信手写opcode,目前很少有人干了,其实,也确实已经没有这个必要了,毕竟,汇编引擎帮我们干了不少事;

如果直接贴出来一堆二进制出来,相信不少人都会迷惑,因此,我们还是从汇编入手了;

先说下代码的功能,就是简单的谈了个框,但是简单的事情背后,也是有内涵的;

0.代码中用到的API,能随便用吗?考虑到ShellCode的Context,如果目标没有导入对应的DLL怎么办;

1.没有导入,不会自己加载吗?那么问题就来了,加载DLL不也需要函数吗,这个API哪里来;

2.ShellCode里,用到的变量的地址,怎么去拿;怎么使用变量;

带着这些问题,看下面的代码吧,相信你会找到答案(附注:代码中用到的知识,可以参考前面的两篇帖子,这里直接贴代码了)

    _asm {sub esp, 0x70;
        jmp Palyload;
        _asm _emit(0x4C) _asm _emit(0x6F) _asm _emit(0x61) _asm _emit(0x64) _asm _emit(0x4C) _asm _emit(0x69);
        _asm _emit(0x62) _asm _emit(0x72) _asm _emit(0x61) _asm _emit(0x72) _asm _emit(0x79) _asm _emit(0x41) _asm _emit(0x00);// LoadLibraryA_asm _emit(0x75) _asm _emit(0x73) _asm _emit(0x65) _asm _emit(0x72) _asm _emit(0x33) _asm _emit(0x32);
        _asm _emit(0x2E) _asm _emit(0x64) _asm _emit(0x6C) _asm _emit(0x6C) _asm _emit(0x00);// user32.dll_asm _emit(0xB0) _asm _emit(0xF8) _asm _emit(0x9D) _asm _emit(0x74); // MessageBoxA_asm _emit(0xC0) _asm _emit(0x3B) _asm _emit(0x2F) _asm _emit(0x75); // ExitProcess_asm _emit(0x48) _asm _emit(0x65) _asm _emit(0x6C) _asm _emit(0x6C) _asm _emit(0x6F) _asm _emit(0x20); // Hello _asm _emit(0x57) _asm _emit(0x6F) _asm _emit(0x72) _asm _emit(0x6C) _asm _emit(0x64) _asm _emit(0x00); // WorldPalyload:call CodeStart;
    CodeStart:pop edx; // GetPCpush eax;
        push ebx;
        push ecx;
        push esi;
        push edi;
mov eax, fs:[0x30]; // PEBmov eax, [eax + 0xC]; // LDRmov eax, [eax + 0xC]; // InLoadOrderModuleList, exemov eax, [eax]; // nt.dllmov eax, [eax]; // kernel32.dllmov eax, dword ptr ds : [eax + 0x18]; // BaseAddr;push eax; // ESP + Cadd eax, [eax + 0x168]; // ExportStart_VAmov ebx, eax;
        add ebx, 0x28;
        push ebx; // EAT->ESP + 8mov ebx, eax;
        add ebx, 0x1914;
        push ebx; // ENT->ESP + 4mov ebx, eax;
        add ebx, 0x3200;
        push ebx; // EOT->ESPxor ebx, ebx;
        mov eax, 0x63B;
        cld;
_ENT_FIND:mov ecx, 13;
        mov esi, [esp + 4];
        mov esi, [esi + 4 * ebx]; // ENT RVAadd esi, [esp + 0xC];
        lea edi, [edx - 0x31]; // LoadLibraryArepe cmpsb;
        je _ENT_OK;
        inc ebx;
        dec eax;
        cmp eax, 0;
        jg _ENT_FIND;
        jmp _ENT_END;
_ENT_OK:mov ecx, [esp]; // EOT Numbermov ecx, [ecx + 2 * ebx];
        and ecx, 0xFFFF;
        mov esi, [esp + 8];
        mov esi, [esi + 4 * ecx]; // EAT Address RVAadd esi, [esp + 0xC]; // EAT Address VAadd esp, 0x10;
lea eax, [edx - 0x24]; // user32.dllpush edx;
        push eax;
        call esi;
        pop edx;
mov eax, [edx - 0x19]; // MessageBoxAlea ebx, [edx - 0x11]; // Hello Worldpush edx;
        push 0;
        push 0;
        push ebx;
        push 0;
        call eax;
        pop edx;
mov eax, [edx - 0x15]; // ExitProcessxor ebx, ebx;
        push ebx;
        call eax;
_ENT_END:pop edi;
        pop esi;
        pop ecx;
        pop ebx;
        pop eax;
    }

一、抠出OpCode,进行测试,代码1

char cShellCode[] =
"\x83\xEC\x70\xEB\x2C\x4C\x6F\x61\x64\x4C\x69\x62\x72" \
"\x61\x72\x79\x41\x00\x75\x73\x65\x72\x33\x32\x2E\x64" \
"\x6C\x6C\x00\xB0\xF8\x9D\x74\xC0\x3B\x2F\x75\x48\x65" \
"\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x00\xE8\x00\x00" \
"\x00\x00\x5A\x50\x53\x51\x56\x57\x64\xA1\x30\x00\x00" \
"\x00\x8B\x40\x0C\x8B\x40\x0C\x8B\x00\x8B\x00\x3E\x8B" \
"\x40\x18\x50\x03\x80\x68\x01\x00\x00\x8B\xD8\x83\xC3" \
"\x28\x53\x8B\xD8\x81\xC3\x14\x19\x00\x00\x53\x8B\xD8" \
"\x81\xC3\x00\x32\x00\x00\x53\x33\xDB\xB8\x3B\x06\x00" \
"\x00\xFC\xB9\x0D\x00\x00\x00\x8B\x74\x24\x04\x8B\x34" \
"\x9E\x03\x74\x24\x0C\x8D\x7A\xCF\xF3\xA6\x74\x09\x43" \
"\x48\x83\xF8\x00\x7F\xE2\xEB\x3B\x8B\x0C\x24\x8B\x0C" \
"\x59\x81\xE1\xFF\xFF\x00\x00\x8B\x74\x24\x08\x8B\x34" \
"\x8E\x03\x74\x24\x0C\x83\xC4\x10\x8D\x42\xDC\x52\x50" \
"\xFF\xD6\x5A\x8B\x42\xE7\x8D\x5A\xEF\x52\x6A\x00\x6A" \
"\x00\x53\x6A\x00\xFF\xD0\x5A\x8B\x42\xEB\x33\xDB\x53" \
"\xFF\xD0\x5F\x5E\x59\x5B\x58";
__asm {LEA EAX, cShellCode;
        PUSH EAX;
        RET;
    }

可以参考代码中相关注释,另外,对于文章开头提出的疑问,有不解的,可以参考前面两篇帖子;

转载于:https://www.cnblogs.com/Reginald-S/p/8779880.html

ShellCode初体验相关推荐

  1. 苹果电脑安装python3密码_mac系统安装Python3初体验

    前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7. 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 ...

  2. MapReduce编程初体验

    需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...

  3. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  4. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言 2 下载.安装wxWidgets 3 wxWidgets应用程序初体验 4 wxWidgets学习资料及利用方法指导 5 ...

  5. 用鸿蒙跑了个 “hello world”!鸿蒙开发初体验

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源 | https://my.oschina.net/u ...

  6. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

  7. 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)

    2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...

  8. Spring环境搭建,IoC容器初体验~

    由于最近的任务是关于IoC配置文件格式的转换,所以需要从Spring的IoC容器开始学起,今天根据网上的介绍搭建了Spring环境,并对其IoC容器进行了初体验.文章中涉及到的软件以及推荐的一本关于S ...

  9. 来自新手Banana Pi香蕉派初体验

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 一段时间来对有强大的技术支持和完善的社区的Raspberry Pi很感兴趣,本想入一片学习学习,但转念一想Raspb ...

最新文章

  1. CSS:布局的三个关键属性:float、position、display
  2. iOS 15.2计划上线“数字遗产”!网友:管的真远,身后事都替我操心?
  3. 公网开放的plc设备——一种新型的后门
  4. C#+WebSocket+WebRTC多人语音视频系统
  5. 【WPF】MVVM模式的3种command
  6. 用或非门构造D型触发器
  7. Celery基本介绍
  8. Django框架(1.Django框架的简介)
  9. boost::mpl::less相关的测试程序
  10. JavaScript Map 和 Set
  11. html5多大场景,HTML5新标签解释及其使用场景
  12. CF476D-Dreamoon and Sets【结论】
  13. Android蓝牙通信功能开发
  14. 2.scrapy 的使用
  15. 轩小陌的Python笔记-Pandas时间序列与日期
  16. LV0009基于Labview的中文短信报警
  17. 基于线性回归的股票预测案例
  18. 请上传sku预览图后重新操作_增值税专用发票申请开票限额操作指南
  19. 一款App的开发成本是多少?
  20. #51单片机#DS18B20硬件原理以及通信的工作时序

热门文章

  1. RHEL7 -- 修改主机名
  2. HCNA配置telnet远程管理
  3. Alpha(9/10)
  4. 关于推送的一些记录要点
  5. [bzoj 3226]校门外的区间
  6. Wordpress 模版技术手册 - WordPress Theme Technical manuals
  7. 在3.5下实现无配置WCF服务
  8. Windows Server 2008密码重设盘
  9. ASP.NET 程序中常用的三十三种代码(1)
  10. sscli 2.0 简介