Shellcode
是一段可执行的机器码(指令)的十六进制编码字符串。
"\xFF\xD0" ==> call eax ==> DOFF ==> "\xFF\xDO"
在Shellcode中使用函数不能使用函数名,而是函数的地址,所以,在Shellcode中使用函数需要先LoadLibrary加载动态链接库,再通过GetProcAddress获取函数地址再进行使用。
专业IT网络知识平台,分享IT百科知识、生活百科知识解答!
Shellcode
是一段可执行的机器码(指令)的十六进制编码字符串。
"\xFF\xD0" ==> call eax ==> DOFF ==> "\xFF\xDO"
在Shellcode中使用函数不能使用函数名,而是函数的地址,所以,在Shellcode中使用函数需要先LoadLibrary加载动态链接库,再通过GetProcAddress获取函数地址再进行使用。
EXPLOIT
构造攻击字符串,通过EXP书写规则:'任意字符串+JMP ESP+ SHELLCODE'。

使用Shellcode
编写Shellcode方法
(1)如果硬编码功底或者汇编功底好直接OD写了拷贝出来。
(2)如果上面这种不行则可以自己创建一个项目,写上要执行的操作后只需要在程序的main函数中任意代码行下断使其断下来,然后转到汇编页,复制机器码即可。如果没有显示机器码,右击->显示字节码(Show Code Bytes)。
注意事项:如果提取出来的Shellcode中间存在 00 这种字符则可能导致Shellcode被截断,这种情况就需要进行指令替换,例如 00 是 mov eax,0 这条指令导致产生的,则我们修改该指令为 xor eax,eax ,通过这种方式进行替换规避。
ShellCode的设计
(1)提取机器码(VS直接提取)
(2)调试
(3)通用性(获取调用的API地址)
(4)EXPLOIT:构造攻击字符串
"任意字符串+JMPESP+SHELLCODE"
任意字符串:用于填满缓冲区。
Jmp esp:用于跳转到Shellcode。
Shellcode:真正执行的恶意代码。
如何获得函数地址
#include <windows.h>#include <stdio.h>typedef void (*MYPROC) (LPTSTR);int main(){ HINSTANCE LibHandle; MYPROC ProcAdd; LibHandle = LoadLibrary( "msvcrt.dll"); printf( "kernel32LibHandle = 0x%x\n",ibHandle); ProcAdd=(MYPROC)GetProcAddress(LibHandle,"system"); printf("system= 0x%x\n",ProcAdd); return 0;}
如何获取JMP XXX系列指令地址
思路:内存中查找机器码。
其实这里不一定需要ESP才可以利用,也可以使用其他的配合达到目的。
下面这段代码就是搜索JMP ESP指令的程序。
//FF E0 JMP EAX//FF E1 JMP ECX//FF E2 JMP EDX//FF E3 JMP EBX//FF E4 JMP ESP//FF E5 JMP EBP//FF E6 JMP ESI//FF E7 JMP EDI//FF D0 CALL EAX//FF D1 CALL ECX//FF D2 CALL EDX//FF D3 CALL EBX//FF D4 CALL ESP//FF D5 CALL EBP//FF D6 CALL ESI//FF D7 CALL EDI//#define DLL_NAME "mfc42.dll"#include <windows.h>#include <stdio.h>#define DLL_NAME "user32.dll"int main(){ BYTE* ptr; int position,address; HINSTANCE handle; BOOL done_flag = FALSE; handle=LoadLibrary(DLL_NAME); if(!handle) { printf(" load dll erro !"); exit(0); } ptr = (BYTE*)handle; for(position = 0; !done_flag; position++) { try { if(ptr[position] == 0xFF && ptr[position+1] == 0xE4) { // 0xFFE4 is the opcode of jmp esp int address = (int)ptr + position; printf("OPCODE found at 0x%x\n",address); } } catch(...) { int address = (int)ptr + position; printf("END OF 0x%x\n", address); done_flag = true; } } return 0;}
默认栈的大小是2M。
新版本的VS编译器中已经加入了缓冲区溢出保护,就是加了security cookie,这个东西就像是Linux中Cannary。
栈溢出中的字节对齐问题
在进行计算溢出字节数的时候不要为了局部变量区会进行字节对齐,X86上是以4字节对齐,例如如果是我们的在函数中开辟的是长度为10的字符数组,则需要16个字节才到返回地址,因为 10字节以4字节对齐就是12字节 + 4字节ebp = 16字节。
Shellcode绕过检测
加密+自解密
案例

本文地址:IT百科频道 https://www.hkm168.com/tags/933478_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!
相关阅读
多图片排版,是Word编辑文档时常见场景之一,几乎每个人都会碰到,对很多人来说仍然是一大难题。当图片数量一多,很多人都不知道图片该怎么摆放,如何快速高效地搞定一组图片?因为没有掌握系统的套路技巧,每次制作都花费大量时间,做不出满意的效果。今...
ppt插入自定义动作按钮: 打开幻灯片文件,然后在菜单栏中点击插入,打开插入工具栏,之后在插入工具栏中选择形状工具,如下图所示:点击形状工具后,就打开所有预置的形状列表,如下图所示,选择我们需要的形状。选择好形状后,自动退回到ppt文件编辑...
主板显卡卡扣断了可以尝试使用胶带或胶水将其固定、更换显卡插槽、更换主板或者寻求专业人员的帮助。详细介绍:1、使用胶带或胶水将其固定,使用胶带或胶水时要小心,以免粘到其他部件上;2、更换显卡插槽,建议找专业的电脑维修人员来进行操作;3、更换主...
区分方法:1、a类ip地址,第一段号码为网络号码,剩下的三段号码为本地计算机的号码;2、b类ip地址,前两段号码为网络号码;3、c类ip地址,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。本教程操作环境:windows7系统、De...
创建jsp文件的步骤:1、安装和配置java开发环境;2、安装和配置web服务器;3、创建jsp文件;4、编写jsp代码;5、部署和运行应用程序;6、调试和测试。详细介绍:1、安装和配置java开发环境,首先需要在计算机上安装jdk,可以从...
win7客户在系统更新的过程中遇到了80072efe的报错,像这种状况要怎么办呢?你先清查网络问题,然后去微软官网下载代理,假如你用的是32位计算机就免费下载32位代理,安装下载完成后马上重启。假如再次出现升级不正确得话,你也就再去官方网站...
git合并分支代码的方法:1、使用“gitmerge”命令,该命令用来做分支合并,可以将其他分支中的内容合并到当前分支中。2、使用“gitrebase”命令,该命令用于改变当前的分支的基点,进而实现分支合并。本教程操作环境:Window...
作为原型和原型链的基础,先了解清楚构造函数以及它的执行过程才能更好地帮助我们学习原型和原型链的知识。本篇文章带大家详细了解一下javascript中的构造函数,介绍一下怎么利用构造函数创建一个js对象,希望对大家有所帮助!一个普通的函数被用...
c语言的输入函数有哪些...浏览:766次
奇异值分解(SVD)简介及其在图片压缩中的示...浏览:1927次
用U盘轻松实现一键重装系统的小白装机教程浏览:5545次
因特网能提供的最基本服务有哪些浏览:4453次
某台微机安装的是64位操作系统中,64位指的...浏览:9933次
总结CreateJS的详细介绍浏览:4816次
ppt中怎么插入自定义动作按钮浏览:9735次
c语言是什么意思浏览:1576次
主板显卡卡扣断了怎么办浏览:301次