shellcode开发

一、shellcode介绍 
      shellcode是什么?百度告诉我们 shellcode是一段用于利用软件漏洞而执行的代码,shellcode是一段16进制的机器码,因为经常让攻击者获得shell而得名。
shellcode具有体积小,能够嵌入到任意进程内存中执行的特点。此外通过对shellcode的变形和加密, 可以逃避杀毒软件的查杀。所以当前黑客经常将一些恶意代码编写成shellcode以躲避杀毒软件的查杀。
shellcode虽然厉害,但开发起来并不容易,往往要涉及到汇编语言。本篇文章中将介绍利用一个shellcode开发框架和一个hash获取工具实现shellcode的快速开发。
 
二、一个shellcode开发框架
 
1)下面就给大家介绍一个shellcode开发框架 地址如下: https://github.com/TonyChen56/ShellCodeFrame
 
 
 
 
2)几个头文件和源文件的功能如下:
 
其他具体介绍可以去作者的地址上浏览
 
3)GetProcAddressWithHash(获取Win32 API导出函数的地址)
        整个shellcode开发框架中,b.work.cpp文件中的GetProcAddressWithHash是一个比较重要的函数。其执行流程
大致是将模块名hash值加上函数名hash值的和作为参数,通过获取PEB地址,遍历加载的模块链表,获取每个模块hash值与导出函数hash值的和,并与提供的参数进行对比,如果匹配成功,就返回该函数地址。
 
函数如下:
 
将需要调用的模块+函数名的hash作为参数,首先获取PEB(进程环境块)的地址。
 
按加载顺序,获取当前进程所加载的模块
遍历模块,获取模块的名字
 
计算模块名的hash
计算模块中函数名的hash。
 
 
计算模块名hash+函数名hash
 
 
如果匹配匹配成功,返回函数地址
 
 
4)第一次打开框架
框架默认生成一个弹出框的shellcode
5)运行ShellCodeFrame.exe,
 6) 将生成的ShellCode.bin文件拖入shellcodeLoader.exe(shellcode加载器)
7)弹出一个对话框
 
 
三  hash值获取工具
工具用来计算函数所在的模块名加上函数名的hash,也就是ShellCodeFrame框架中的GetProcAddressWithHash函数的参数
下面我们计算一下kernel32模块名+WinExec函数名的hash.
 
1)源代码如下:
 
 
2)执行结果:
 
 
四、实战
目标:生成一个调用执行程序的shllcode
步骤如下:
1)调用函数
 
正常程序中我们通过调用kernel32.dll模块中的WinExec函数,可以启动一个执行程序。如下:
 
当我们生成一个PE程序时,编译器自动转换WinExec函数的绝对地址,程序执行并调用函数时,直接跳到函数的绝对入口地址。但在shellcode编写中我们不能使用函数的绝对地址,因为当shellcode被插入到其他程序进程中时,这个绝对地址可能是其他函数的入口地址,也可能什么函数都没有。因此我们在shellcode的编写中,我们不能使用绝对地址,也就意味着只能使用相对地址。以此来保证无论此shellcode被插入到任意一个程序的进程中,都能够正确的获取到函数的地址。
 
 
 
 
 
2)获取WinExec函数hash值
  利用前面介绍的hash值获取工具,输入kernel32.dll和WinExec参数
得到hash值
3)获取函数的相对地址
shellcode框架中,我们可以利用b.work.cpp源文件中的GetProcAddressWithHash函数,通过传入WinExec函数的hash值,就可以获取到WinExec函数的相对地址。
 
 
 
 
4)定义函数指针
在a.start.cpp源文件ShellCodeEntry()函数中添加WinExec("calc.exe ", SW_SHOW);
 
 
右键跳转到WinExec函数的声明:
 
将声明复制到
api.h头文件中定义函数指针并添加到结构体
5)定义hash值
将生成的WinExec函数hash添加到hash.h头文件中
 
6)字符串定义
shellcode编写中,字符串必须要写到代码段,这样才可以保证被正常使用,并且对字符串的使用要使用相对地址,不能使用绝对地址。我们通常的定义方式如Char data=“abcdef”,但这种方式字符串会被存储到数据段中,并以绝对地址的方式引用。
所以我们应该采用Char data={‘a’,’b’,’c’,’d’,’e’,’f’,0} (0代表结束符)。这种字符串定义方式可以将字符串存放在代码段中,并以相对地址的方式被引用。这样就可以保证当shellcode被加载到其他程序进程中时,依然可以被正常的使用。
 
 
7)调用自定义的WinExec函数
 
8)重新生成
 
9)生成shellcode
运行ShellCodeFrame.exe ,成功生成ShellCode.bin文件
 
10)验证
将生成的ShellCode.bin文件拖入shellcodeLoader.exe

猜你喜欢

转载自www.cnblogs.com/ready-gogo/p/12506445.html