动态定位API的shellcode
前面的<<HOOK IAT RING3>>文章中使用到了shellcode,那么这个shellcode是怎么制造出来的呢,本文将为你一步一步的解惑
这个shellcode的主要功能是调用MessageBoxA弹出一个空的对话框,注意此时的地址空间是在别的进程,由于不同的操作系统会影响动态链接库的加载地址,而且不同版本的dll中函数的偏移量RVA也不尽相同,因此写一个通用型的shellcode就显得非常的有必要
那么shellcode要怎么动态去定位API的地址呢,方法还是一样的,首先定位函数所在的模块,然后在EAT里面进行搜索即可,只要找到Kernel32.dll中的GetProcAddress和LoadLibraryA的地址就可以通过这两个获得其他模块中函数的地址
注意:网上的很多此类代码并没有通过搜索kernel32.dll模块,而是直接去寻找Ldr->InInitializationModuleList的第3个模块,这是有问题的,因为从win7开始引入了MinWin的概念导致InInitializationModuleList中的第三个模块是KernelBase.dll,第四个才是Kernel32.dll,不过Ldr->InMemoryOrderModuleList中的第三个模块并没有改变还是Kernel32.dll,为了以防万一还是搜索吧,搜索的时候用的是比较模块的第七个字符是不是'3’来匹配,因为kernel32.dll的第七个字符就是3,这样就可以不用通过计算哈希值来比较
下面贴出内嵌汇编代码,并加了一些注释(winxp,win7x86,win7x64以兼容32位的模式运行,都没问题~)
这个shellcode是我花了一个下午的时间写的,由于是新手,如果下文中有什么纰漏的话欢迎指正!
#include <windows.h> #include <stdio.h>void PopMessageBox() {__asm{jmp startfind_function:push ebpmov ebp,esp
mov eax,fs:[0x30] //fs points to teb in user mode,get pointer to pebmov eax,[eax+0x0c] //get peb->ldrmov eax,[eax+0x14] //get peb->ldr.InMemoryOrderModuleList.Flink(1st entry) module_loop:mov eax,[eax] //skip the first entry or get the next entrymov esi,[eax+0x28] //get the BaseDllName->Buffercmp byte ptr [esi+0x0c],'3' //test the module's seventh's wchar is '3' or not,kernel32.dll jne module_loop//====================================//find kernel32.dll module//====================================mov eax,[eax+0x10] //LDR_DATA_TABLE_ENTRY->DllBase//====================================//kernel32.dll PE Header//==================================== mov edi,eaxadd edi,[edi+0x3c] //IMAGE_DOS_HEADER->e_lfanew//====================================//kernel32.dll export directory table//====================================mov edi,[edi+0x78] //IMAGE_NT_HEADERS->OptinalHeader.DataDirectory[EAT].VirtualAddress add edi,eaxmov ebx,edi // ebx is EAT's virtual address,we’ll use it later//====================================//kernel32.dll Name Pointer Table//====================================mov edi,[ebx+0x20] //IMAGE_EXPORT_DESCRIPTOR->AddressOfNames RVA add edi,eaxxor ecx,ecx //NameOrdinals name_loop:mov esi,[edi+ecx*4]add esi,eaxinc ecxmov edx,[esp+8] //first parameter cmp dword ptr [esi],edxjne name_loopmov edx,[esp+0xc] //second parametercmp dword ptr [esi+4],edxjne name_loop//======================================//kernel32.dll Ordinal Table//======================================mov edi,[ebx+0x24]add edi,eaxmov ecx,[edi+ecx*2]and ecx,0xFFFF //cause ordinal is USHORT of size,so we just use its lower 16-bits//======================================//kernel32.dll Address Table//======================================mov edi,[ebx+0x1c]add edi,eaxdec ecx //subtract ordinal basesal ecx,2mov edi,[edi+ecx]add eax,edipop ebpret 8start://====================================// Get GetProcAddress's address//====================================push 0x41636f72 //rocApush 0x50746547 //Getp call find_functionpush eax //store GetProcAddress in stack//====================================//Get LoadLibraryA's address//====================================push 0x7262694c //Librpush 0x64616f4c //Load call find_functionpush eax //store LoadLibraryA in stack// stack snap//-----------------------------high address// GetProcAddress's address//-----------------------------// LoadLibraryA's address <-----------------esp//-----------------------------low address//====================================// Get User32.dll's image base//====================================push 0x3233 //32push 0x72657375 //userpush esp //lpFileNamecall eax //call LoadLibraryA("user32.dll") add esp,8 //cause we push user32 string//====================================//Get MessageBox's address//====================================push 0x41786f //oxApush 0x42656761 //ageBpush 0x7373654d //Messpush esp //lpProcNamepush eax //hModulecall [esp+0x18] //call GetProcAddress(hModule,"MessageBoxA") add esp,0xc //cause we push MessageBoxA string push 0push 0push 0push 0call eax //call MessagBoxA(0,0,0,0) add esp,8 //cause we push GetProcAddress and LoadLibrary in stack } }int main() {PopMessageBox();return 0; }
至于怎么转为shellcode,这里提供一个方法,就是按F10进入VS的调试模式,然后再右键选择查看汇编代码,找到内嵌汇编的开始地址,复制那个地址处的内容直到内嵌汇编的右大括号,放到十六进制的编辑器中比如NotePad++,然后替换空格为\0x,再稍作修改即可,这里说的比较的模糊,等有时间的时候再回头过来照顾一下新手吧,先把上面的汇编消化掉~
ps:喜欢贴代码,不想打字。。。怎么破。。。
转载于:https://www.cnblogs.com/unixstudio/archive/2012/11/09/2761883.html
动态定位API的shellcode相关推荐
- shellcode中动态定位API
定位API的原理: 所有的win_32程序都会加载ntdll.dll和kerner32.dll这两个最基础的动态链接库.如果想要在win_32平台下定位kernel32.dll中的API地址 1,首先 ...
- shellcode中变形bindshell的实现
最近学习<0day安全>一书 记录一下调试编码过程 书中环境XP VC6 本机的环境是server 2008 r2 x64 编译环境是vs2013 第一步: 首先是写一个win c版本的 ...
- shellcode编写
1.最简单的不考虑平台性等等问题 HANDLE libHandle; char dllbuf[22] = "user32.dll"; libHandle = LoadLibrary ...
- PengCode:EXE转换ShellCode工具
0x0 工具介绍 PengCode是Windows下PE文件转换成ShellCode格式的二进制生成工具,目前支持32位和64位的程序兼容大部分Windows版本,较老的系统如XP不支持,可以兼容Go ...
- 0day安全:软件漏洞分析技术(第2版)
0day安全:软件漏洞分析技术(第2版) 基本信息 作者:王清 张东辉 周浩 王继刚 赵双 丛书名:安全技术大系 出版社:电子工业出版社 ISBN:9787121133961 上架时间 ...
- 0day安全:软件漏洞分析技术(第2版)pdf
下载地址:网盘下载 内容简介 · · · · · · 本书分为4篇17章,系统全面地介绍了Windows平台缓冲区溢出漏洞的分析.检测与防护.第一篇为常用工具和基础知识的介绍:第二篇从攻击者的视角出 ...
- 从exp入手分析漏洞
分析poc和分析exp有一些不一样,因为exp是人为构造后的东西,它会执行一段自定的shellcode.结果是根本不会触发异常或者异常在离触发点十万八千里的地方.这样分析poc的技巧就用不上了(因为无 ...
- 将.C文件编译成最小的PE可执行文件
开头,如果想知道编译最小的ELF文件,参考http://web.archive.org/web/20111205062215/http://www.muppetlabs.com/~breadbox/s ...
- shellcode模板(使用hash获取API)
一.获取kernel32 通过 LDR 链表遍历dll,检查 BaseDllName.Buffer 的第6,7个字符是不是"32",如果是就认为是kernel32. // CTF. ...
最新文章
- HDU 5375 Gray code
- 合并石子 四边形不等式优化
- 1.2 正交化-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
- spring-core
- 128_Power BI父级排名TOPN子级动态展示
- Python 字符串(一)
- Android 中的数据储存方案, 持久化技术
- Atitit 标记语言ML(Markup Language) v6 目录 1. 标记语言ML Markup Language	1 1.1. 简介	1 2. 置标语言置标语言通常可以分为三类:标识性的
- 2015年我走过的日子
- java 按照笔画排序,怎样用java把名单按姓氏笔画排序
- 红米手机使用应用沙盒一键修改cpu信息
- JQuery----倒计时插件downCount
- 做软件测试必须了解的7个常用术语
- java语言编译系统_请问C语言,JAVA之类的语言编译程序是属于 系统软件 还是 应用软件??...
- oeasy教您玩转vim - 2 - # 使用帮助
- 以中国南方航空为竞品结构化分析并设计航空购票网页
- 听java技术讲座心得体会_听讲座心得体会范文3篇
- 4G模块加网流程_4G拨号上网相关知识
- gnuplot命令大全
- stm32捕获占空比_【电机控制】六步法驱动BLDC电机,使用硬件COM事件,STM32+CUBEMX(HAL库)配置...