前面的<<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相关推荐

  1. shellcode中动态定位API

    定位API的原理: 所有的win_32程序都会加载ntdll.dll和kerner32.dll这两个最基础的动态链接库.如果想要在win_32平台下定位kernel32.dll中的API地址 1,首先 ...

  2. shellcode中变形bindshell的实现

    最近学习<0day安全>一书 记录一下调试编码过程 书中环境XP VC6 本机的环境是server 2008 r2 x64  编译环境是vs2013 第一步: 首先是写一个win c版本的 ...

  3. shellcode编写

    1.最简单的不考虑平台性等等问题 HANDLE libHandle; char dllbuf[22] = "user32.dll"; libHandle = LoadLibrary ...

  4. PengCode:EXE转换ShellCode工具

    0x0 工具介绍 PengCode是Windows下PE文件转换成ShellCode格式的二进制生成工具,目前支持32位和64位的程序兼容大部分Windows版本,较老的系统如XP不支持,可以兼容Go ...

  5. 0day安全:软件漏洞分析技术(第2版)

    0day安全:软件漏洞分析技术(第2版) 基本信息 作者:王清   张东辉   周浩   王继刚   赵双 丛书名:安全技术大系 出版社:电子工业出版社 ISBN:9787121133961 上架时间 ...

  6. 0day安全:软件漏洞分析技术(第2版)pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书分为4篇17章,系统全面地介绍了Windows平台缓冲区溢出漏洞的分析.检测与防护.第一篇为常用工具和基础知识的介绍:第二篇从攻击者的视角出 ...

  7. 从exp入手分析漏洞

    分析poc和分析exp有一些不一样,因为exp是人为构造后的东西,它会执行一段自定的shellcode.结果是根本不会触发异常或者异常在离触发点十万八千里的地方.这样分析poc的技巧就用不上了(因为无 ...

  8. 将.C文件编译成最小的PE可执行文件

    开头,如果想知道编译最小的ELF文件,参考http://web.archive.org/web/20111205062215/http://www.muppetlabs.com/~breadbox/s ...

  9. shellcode模板(使用hash获取API)

    一.获取kernel32 通过 LDR 链表遍历dll,检查 BaseDllName.Buffer 的第6,7个字符是不是"32",如果是就认为是kernel32. // CTF. ...

最新文章

  1. HDU 5375 Gray code
  2. 合并石子 四边形不等式优化
  3. 1.2 正交化-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  4. spring-core
  5. 128_Power BI父级排名TOPN子级动态展示
  6. Python 字符串(一)
  7. Android 中的数据储存方案, 持久化技术
  8. Atitit 标记语言ML(Markup Language) v6 目录 1. 标记语言ML Markup Language 1 1.1. 简介 1 2. 置标语言置标语言通常可以分为三类:标识性的
  9. 2015年我走过的日子
  10. java 按照笔画排序,怎样用java把名单按姓氏笔画排序
  11. 红米手机使用应用沙盒一键修改cpu信息
  12. JQuery----倒计时插件downCount
  13. 做软件测试必须了解的7个常用术语
  14. java语言编译系统_请问C语言,JAVA之类的语言编译程序是属于 系统软件 还是 应用软件??...
  15. oeasy教您玩转vim - 2 - # 使用帮助
  16. 以中国南方航空为竞品结构化分析并设计航空购票网页
  17. 听java技术讲座心得体会_听讲座心得体会范文3篇
  18. 4G模块加网流程_4G拨号上网相关知识
  19. gnuplot命令大全
  20. stm32捕获占空比_【电机控制】六步法驱动BLDC电机,使用硬件COM事件,STM32+CUBEMX(HAL库)配置...

热门文章

  1. shell分析日志常用指令合集
  2. Linux多网口绑定配合华为5700 eth-trunk技术,提高网络性能
  3. Python问题记录:如何处理中文网页中的多余空格
  4. POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
  5. T-SQL之公用表表达式(CTE)
  6. 终于有人把内卷和囚徒困境讲明白了
  7. 和 Python 2.x 说再见!
  8. 最近都在谈的「私域流量」,究竟有没有前途?
  9. 谁再问你“天天爬那些数据有什么用”,就把这5本书扔给他!
  10. CANOpen生命守护机制