写在前面的话:

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); // World Palyload:
call CodeStart;
CodeStart:
pop edx; // GetPC push eax;
push ebx;
push ecx;
push esi;
push edi; mov eax, fs:[0x30]; // PEB
mov eax, [eax + 0xC]; // LDR
mov eax, [eax + 0xC]; // InLoadOrderModuleList, exe
mov eax, [eax]; // nt.dll
mov eax, [eax]; // kernel32.dll
mov eax, dword ptr ds : [eax + 0x18]; // BaseAddr;
push eax; // ESP + C add eax, [eax + 0x168]; // ExportStart_VA
mov ebx, eax;
add ebx, 0x28;
push ebx; // EAT->ESP + 8
mov ebx, eax;
add ebx, 0x1914;
push ebx; // ENT->ESP + 4
mov ebx, eax;
add ebx, 0x3200;
push ebx; // EOT->ESP xor ebx, ebx;
mov eax, 0x63B;
cld; _ENT_FIND:
mov ecx, ;
mov esi, [esp + ];
mov esi, [esi + * ebx]; // ENT RVA
add esi, [esp + 0xC];
lea edi, [edx - 0x31]; // LoadLibraryA
repe cmpsb;
je _ENT_OK;
inc ebx;
dec eax;
cmp eax, ;
jg _ENT_FIND;
jmp _ENT_END; _ENT_OK:
mov ecx, [esp]; // EOT Number
mov ecx, [ecx + * ebx];
and ecx, 0xFFFF;
mov esi, [esp + ];
mov esi, [esi + * ecx]; // EAT Address RVA
add esi, [esp + 0xC]; // EAT Address VA add esp, 0x10; lea eax, [edx - 0x24]; // user32.dll
push edx;
push eax;
call esi;
pop edx; mov eax, [edx - 0x19]; // MessageBoxA
lea ebx, [edx - 0x11]; // Hello World
push edx;
push ;
push ;
push ebx;
push ;
call eax;
pop edx; mov eax, [edx - 0x15]; // ExitProcess
xor 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;
}

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

ShellCode初体验的更多相关文章

  1. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  2. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  3. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  4. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  5. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  6. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  7. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  8. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

  9. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

随机推荐

  1. mongodb副本集数据同步的踩坑

    一.故事 最近随着搞活动比较频繁导致数据库出现了波动,后端日志总是报数据库连接和读取的问题.由于我设置的是读写分离(伪的,通过设置副本集的读取策略实现的,设置的db.getMongo().setRea ...

  2. Python时间系统

    Python的time和datetime模块提供了时间日期工具, python中的时间有4种表示方式: datetime obj time obj/tuple posix timestamp time ...

  3. Jquery特殊属性

    val():获取或设置元素的值,主要用于input. 参数:string 字符串     设置元素的值: 不写参数:获取元素的值: 其实这个属性  我们也可以用attr操作,但是没有这个方便  添加类 ...

  4. 音频播放时出现 Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first. https://goo.gl/xX8pDD

    <audio id="play" controls="controls" loop="loop"> <source src ...

  5. Outlook2013怎样自动答复电子邮件

    工具/原料 office2013或outlook2013 百度经验:jingyan.baidu.com 方法/步骤 1 首先我们创建自己的答复邮件.打开outlook2013,单击“开始”>“新 ...

  6. oracle 11g 分区表创建(自动按年、月、日分区)

    前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性. oracle 11g 支持自动分区,不 ...

  7. Calendar类的一些不易区分的属性

    1.Calendar.MONTH 月份从0-11,获取之后需要加1才能得到真正的月份 2.Calendar.DAY_OF_WEEK 本周的第几天,从星期天开始算 3.Calendar.WEEK_OF_ ...

  8. Http升级到Https (本地测试,无须域名和认证)

    在之前的语音识别的项目中,一切都在本地进行得很顺利,然后把写的Demo部署到服务器上给老大看的时候,通过IP访问(http://192.168.145.170:8080这样的形式)时,从一开始就坏掉了 ...

  9. influxdb-1.7.2.x86_64安装 install influxdb-1.7.2.x86_64 on RedHat & CentOS

    1.下载安装 wget http://dl.influxdata.com/influxdb/releases/influxdb-1.7.2.x86_64.rpm https://portal.infl ...

  10. BFC(块状格式化上下文)

    今天先来说关于BFC的一些基础知识 BFC是块状格式化上下文,它是一个独立的渲染区域,规定了内部如何布局,并且这个布局和外部毫不相干 触发BFC的方法 1.根元素(即html) 2.float属性不为 ...