ShellCode初体验
写在前面的话:
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初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
随机推荐
- HTML 框架 frameset,frame
通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面.每份HTML文档称为一个框架,并且每个框架都独立于其他的框架 框架结构标签(<frameset>) 框架结构标签(<fram ...
- Java控制并发线程数的Semaphore
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.以前我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿 ...
- 读jQuery源码释疑笔记3
1.在jQuery.fn=jQuery.prototype中定义了方法:init, map, each , toArray, get, pushStack, ready, slice,first ...
- mysql 创建数据库,添加用户,用户授权
一.创建mysql数据库 1.创建数据库语法 --创建名称为"testdb"数据库,并设定编码集为utf8 CREATE DATABASE IF NOT EXISTS testdb ...
- 最小公倍数(BNUOJ30195)
最小公倍数 Time Limit: 0 ms Case Time Limit: 0 ms Memory Limit: 0 KBSubmit: 17 Accepted: 1 This problem w ...
- Java的策略模式
策略模式也是我们经常使用的模式,它的定义如下:将可变的部分从程序中抽象分离出来成为算法接口,在该部分下分别封装一系列算法实现并使它们可以相互替换. 举个例子,我们现在有三种支付方式:支付宝支付,微信支 ...
- div阴影
.box-shadow{ //Firefox4.0- -moz-box-shadow:投影方式 X轴偏移量 Y轴偏移量阴影模糊半径 阴影扩展半径 阴影颜色; //Safariand Google ch ...
- php+layui实现图片上传与预览
端代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- JQuery 常用知识
1.JSON 解析 JSON字符串: var str1 = '{ "name": "deyuyi", "sex": "man&qu ...
- sublime3 常用快捷键
轻量级编辑器,一直用的sublime text3 , 可以根据自己喜好安装喜欢的风格插件,根据工作需求安装代码处理插件. 下一章将推荐我常用的一些风格与代码插件 这里记录一些sublime 常用的快捷 ...