写在前面的话:

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. [机器学习] 训练集(train set) 验证集(validation set) 测试集(test set)

    在有监督(supervise)的机器学习中,数据集常被分成2~3个即: 训练集(train set) 验证集(validation set) 测试集(test set) 一般需要将样本分成独立的三部分 ...

  2. mysql索引总结(1)-mysql 索引类型以及创建

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  3. C/C++编程GUI库比较

    转自:http://blog.csdn.net/lostown/article/details/658654 最强的GUI库当属Qt,毕竟是商业化的东西,功能最完整,什么都好,包括类似java代码风格 ...

  4. zoj 2818 Root of the Problem(数学思维题)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2818 题目描述: Given positive integer ...

  5. JS 对话框 语法

    javaScript  是个脚本语言,没有能力独立执行,必须要有宿主文件 html, 作用 进行数据运算 控制浏览器的一些功能(对一下高级浏览器的影响有限) 控制元素(属性,样式,内容等) 一 用法 ...

  6. 表达式树(Expression Trees)

    [翻译]表达式树(Expression Trees) 原文地址:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/con ...

  7. 这些天C#面试有感

    为何面试 为何面试! 还用问?肯定是因为要离职啊 - -!离职原因就不说了,说来说去就是那么几个原因:这里主要讲我这些天面试遇到的问题,以及对面试的一些感受吧[断续更新

  8. CSS学习笔记04 CSS文字排版常用属性

    字体样式属性 font-size:字号大小 font-size属性用于设置字号,该属性的值可以使用相对长度单位,也可以使用绝对长度单位.其中,相对长度单位比较常用,推荐使用像素单位px,绝对长度单位使 ...

  9. 撩课-Web大前端每天5道面试题-Day28

    1.用setTimeout()方法来模拟setInterval()与setInterval()之间的什么区别? 首先来看setInterval的缺陷,使用setInterval()创建的定时器确保了定 ...

  10. Alice and Bob(博弈)

    Alice and Bob Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users ...