渗透TEA加密算法.doc_第1页
渗透TEA加密算法.doc_第2页
渗透TEA加密算法.doc_第3页
渗透TEA加密算法.doc_第4页
渗透TEA加密算法.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

渗透TEA加密算法 -文/KYO TEA是Tiny Encryption Algorithm的缩写,意即极小型的加密算法。由David Wheeler和Roger Needham在剑桥大学计算机实验室联合研究的。特点是加密速度快,高速高效,抗差分攻击能力强。明文密文块都是64byte,但密钥长度为128byte。 以上就是TEA加密算法的简单说明,至少让我们纪念一下前辈,并且了解一下密钥和明文密文的长度,这样的话才好对症下药啊。TEA这种加密虽然简单,可是应该比较少见,我也不曾见过类似这种加密的文章,在这里我就以一个例子来分析一下吧。正好HAPPYTOWN的第25个CRACKEME没有人分析,并且里面用到了TEA,下面就以这个CRACKME做为研究对象了。 还是先用PEID打探打探情况,如下图: 图1可以看到编写语言为VC+,程序用到了TEA32 rounds加密和big number.心里有了底后,可以先用IDA加载,选择“打开签名窗口”,接着选择CryptoSIG这个加密库,看IDA能否识别程序里的加密函数。 图2如图2可以看到找到了52个函数。看来还是有收获的。把map文件导出来吧。后面在用OD加载程序时要记得把这个map文件也加载进去的,方便我们快速定位一些加密算法用到的函数。*这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。返利网,淘你喜欢,淘宝返利,淘宝返现购物。* 用户名kyo327,密码1234567890.用万能断点断在下面0040121D LEA EDI,DWORD PTR SS:ESP+F400401224 OR ECX,FFFFFFFF00401227 XOR EAX,EAX00401229 REPNE SCAS BYTE PTR ES:EDI0040122B NOT ECX0040122D DEC ECX0040122E CMP ECX,4 ; 用户名长度要大于300401231 0F82 C0010000 JB CrackMe_.004013F700401237 8DBC24 F40000LEA EDI,DWORD PTR SS:ESP+F40040123E 83C9 FF OR ECX,FFFFFFFF00401241 REPNE SCAS BYTE PTR ES:EDI00401243 NOT ECX00401245 DEC ECX00401246 CMP ECX,18 ; 密码长度要小于2500401249 JA CrackMe_.004013F7这里是验证用户名和密码长度的地方。再往下看00401269 LEA ESI,DWORD PTR SS:ESP+2C0040126D MOV EDI,100401272 CMP DWORD PTR DS:40DFC8,EDI00401278 JLE SHORT CrackMe_.0040128D0040127A MOVSX EAX,BYTE PTR DS:ESI0040127D PUSH 8000401282 PUSH EAX00401283 CALL 00401288 ADD ESP,80040128B JMP SHORT CrackMe_.0040129E0040128D MOVSX ECX,BYTE PTR DS:ESI00401290 MOV EDX,DWORD PTR DS:40DDBC00401296 MOV AL,BYTE PTR DS:EDX+ECX*200401299 AND EAX,800040129E TEST EAX,EAX004012A0 JE CrackMe_.004013F7004012A6 MOV AL,BYTE PTR DS:ESI+1004012A9 INC ESI004012AA TEST AL,AL ; 密码要在0-9 a-f A-F之间004012AC JNZ SHORT CrackMe_.00401272004012AE LEA EDI,DWORD PTR SS:ESP+2C004012B2 OR ECX,FFFFFFFF004012B5 XOR EAX,EAX004012B7 REPNE SCAS BYTE PTR ES:EDI004012B9 NOT ECX004012BB DEC ECX ; 密码长度要等于16004012BC CMP ECX,10这一段是验证密码的输入规则,密码必须为0-9 a-f A-F中的任意一个字符,并且密码长度要等于16。紧接着下面是把输入的密码字符型转成同字母的16进制。我就不贴代码了。看下面主要的地方。0040130A LEA EAX,DWORD PTR SS:ESP+100040130E LEA ECX,DWORD PTR SS:ESP+2C00401312 PUSH EAX;这个参数值为1A2B3C4D5E6FABCD1A2BAC4D5E6FABCD,暂时不知道什么意思。00401313 LEA EDX,DWORD PTR SS:ESP+2400401317 PUSH ECX;这个参数为1234567890ABCDEF,也就是我们输入的密码。00401318 PUSH EDX;这个参数全为0,应该是经过下面那个CALL后装返回值的。00401319 CALL CrackMe_.00401410来到这里后,看到有三个参数入栈,上面我加了说明。等走到00401339时先下个断,再dd edx,F8一下过了这个CALL看堆栈中EDX的返回值变成了D598F72A2C8CA076。看来这个极有可能就是TEA算法的地方。我们先来看看TEA加密解密算法代码吧。我找了半天,现在分享出来:void TEA_encipher(DWORD *data, DWORD *Key)DWORD y=data0;DWORD z=data1;DWORD delta=0x9e3779b9;DWORD sum=0;DWORD a=Key0;DWORD b=Key1;DWORD c=Key2;DWORD d=Key3;for(int i=0;i32;i+)sum+=delta;y+=(z5)+b;z+=(y5)+d;data0=y;data1=z;void TEA_decipher(DWORD *data, DWORD *Key)DWORD y=data0;DWORD z=data1;DWORD delta=0x9e3779b9;DWORD sum=0xc6ef3720;DWORD a=Key0;DWORD b=Key1;DWORD c=Key2;DWORD d=Key3;for(int i=0;i32;i+)z-=(y5)+d;y-=(z5)+b;sum-=delta;data0=y;data1=z;由TEA源代码可以看到有两个函数TEA_encipher(DWORD *data, DWORD *Key)为加密函数。void TEA_decipher(DWORD *data, DWORD *Key)为解密函数。有所不同的是在解密函数中出现了sum=0xc6ef3720,加密函数中出现了delta=0x9e3779b9这个。我们可以把这两个数作为辨别是TEA加密还是TEA解密的标志吧。*这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。返利网,淘你喜欢,淘宝返利,淘宝返现购物。* 好,下面验证一下,跟随CALL CrackMe_.00401410看一下,入图3:看到有我画圈的地方有一个值刚好是0xc6ef3720。所以基本上可以判定这个CALL是TEA的解密函数。密钥为1A2B3C4D5E6FABCD1A2BAC4D5E6FABCD,密文为1234567890ABCDEF。用网上流传的工具测试怎么都对不上。无奈我自己用上面那个代码改写了一个TEA加密解密的程序。下面我用它来验证下,如图4: 图4由图4可以看出我们的分析是正确的。好接着F8继续跟进。看代码:0040131E PUSH 000401320 MOV DWORD PTR SS:EBP+234,100040132A CALL 0040132F PUSH 000401331 MOV ESI,EAX;mirvar(0) 初始化esi00401333 CALL 00401338 PUSH 00040133A MOV EDI,EAX;mirvar(0) 初始化edi0040133C CALL 00401341 PUSH 000401343 MOV EBX,EAX;mirvar(0) 初始化ebx00401345 CALL 0040134A PUSH CrackMe_.0040D118 ;ASCII 16EDE8A1E238448FCFB017368DC4DC026F44BD6C5A531286267C16B9B6DC6EE00040134F PUSH EDI00401350 MOV EBP,EAX;mirvar(0) 初始化ebp00401352 CALL 00401357 PUSH CrackMe_.0040D0D4 ; ASCII E7D47A8E307241130434E06254CE6561B4AF1790119DCB4B4544081A60B0A1BB0040135C PUSH EBP;Cinstr() 字符串转为大数0040135D CALL 00401362 MOV EAX,DWORD PTR SS:ESP+5400401366 LEA ECX,DWORD PTR SS:ESP+1200040136D PUSH ECX0040136E PUSH EBX0040136F MOV DWORD PTR DS:EAX+234,100;转为256进制00401379 CALL ;Cinstr() 字符串转为大数0040137E MOV EDX,DWORD PTR SS:ESP+5C00401382 PUSH ESI00401383 PUSH EBP00401384 PUSH EBX00401385 PUSH EDI00401386 MOV DWORD PTR DS:EDX+234,1000401390 CALL powmod(edi,ebx,ebp,esi)作用是esi=ediebx mod ebp00401395 ADD ESP,4400401398 PUSH ESI00401399 PUSH EBP0040139A PUSH ESI0040139B PUSH EDI0040139C CALL powmod(edi,esi,ebp,esi)作用是esi=esiedi mod ebp004013A1 LEA EAX,DWORD PTR SS:ESP+1CC004013A8 PUSH 0004013AA PUSH EAX004013AB PUSH ESI004013AC PUSH 0004013AE CALL ;big_to_bytes() 大数转为字符串004013B3 PUSH ESI004013B4 CALL ; mirkill(esi) 清空内存004013B9 PUSH EBP004013BA CALL ; mirkill(ebp) 清空内存004013BF PUSH EDI004013C0 CALL ; mirkill(edi) 清空内存004013C5 PUSH EBX004013C6 CALL ; mirkill(ebx) 清空内存004013CB ADD ESP,30004013CE CALL CrackMe_.004023D0004013D3 MOV ECX,2004013D8 LEA EDI,DWORD PTR SS:ESP+1BC004013DF LEA ESI,DWORD PTR SS:ESP+20;比较SS:ESP+1BC和SS:ESP+20中的值 相等则OK004013E3 XOR EDX,EDX004013E5 REPE CMPS DWORD PTR ES:EDI,DWORD PTR D004013E7 POP EDI004013E8 MOV EAX,EDX经过我上面的注释,应该很明了了。我再详细说明一下:Esi= ediebx mod ebp=7FB021984C05838E237FADC57C627AD7ED8C8FE25D4853FECA71C86108F69AA1然后esi= esiedi mod ebp=04AB07B64C12164E9F4DD622D3D37D5670AE03D737031D5222F78A94B52A1AA2然后把ESI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论