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 ...
随机推荐
- TDSQL“相似查询工具MSQL+”入选VLDB论文
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 作者介绍:王晓宇,腾讯数据库TDSQL团队成员,目前参与TDSQL数据库内核研发工 ...
- 百度前端技术学院task34源码——会指令的小块2
任务描述 增加新的指令如下: TRA LEF:向屏幕的左侧移动一格,方向不变 TRA TOP:向屏幕的上面移动一格,方向不变 TRA RIG:向屏幕的右侧移动一格,方向不变 TRA BOT:向屏幕的下 ...
- HDU 1535 Invitation Cards(逆向思维+邻接表+优先队列的Dijkstra算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 Problem Description In the age of television, n ...
- dom操作------创建节点/插入节点
<section> <div id="box" style="position: relative;"> <p id=" ...
- AutoMapper之自定义解析
自定义解析 4.自定义解析 AutoMapper可以通过名称匹配等规则进行对象的映射,但是在实际的项目中,只是这样是远远不够的,比说我们需要名称不同的字段进行映射,或者需要再加一些逻辑处理.AutoM ...
- TRIZ解决问题方法
个人觉的成功是有规律的,那些成功的人士,都有一套处理事情的秘籍.只要我们的思维方式把那些秘籍融会贯通,并快速执行,我们有一天也会成功的. TRIZ解决问题的5点方法. 1.确定最终目标. 2.列出阻碍 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- 使用 RabbitMQ 实现异步调用
目录 引言 启动 RabbitMQ 服务器 运行 rabbitmq 容器 RabbitMQ 控制台 Exchange 和 Queue 开发服务端和客户端 开发服务端 开发客户端 Java Bean 类 ...
- 在Oracle中实现每日表备份并删除7天前的备份表
不用闪回技术,因为业务想眼睁睁的看到备份表,而不是让DBA搞一通之后,才能看到备份数据表 OK,那好办了,写个存储过程解决你的需求,每天建个新表,把数据备份进去,业务人员可以看到这些每天的备份表 然后 ...
- Context 上下文
全称:context 解释:上下文,在我们的开发的程序中,通常使用context上下文. 理解:结合实际生活我们可以把它理解为是语境,比如A说:我喜欢他. 那么这个他是谁,我们不知道,如果在这句话之前 ...