代码还原小测试(一):魔改MD5

发布于:2024-10-24 编辑:匿名 来源:网络

1。目标当年,MD5已经是最基本的签名算法了,但是如果你只是在输入上做一个简单的MD5,你肯定会被你的同行嘲笑。

加一点盐是基本的改善,但在这个就业形势严峻的时代,仅仅加盐肯定是不够的。今天我们就来说说修改后的MD5,让这个算法更加先进。

1、彩卷最简单的神奇修改方法就是改变MD5的初始参数。代码语言:txt复制context->state[0] = 0x;上下文->状态[1] = 0xEFCDAB89;上下文->状态[2] = 0x98BADCFE;上下文->状态[3] = 0x;只需修改这四个参数即可。

通过修改这些参数,我们可以改变MD5运算的结果。但这个方法太简单了,无法卷起来。

接下来我们将介绍更先进的滚压方法。 2. Meatloaf md5将执行64轮计算。

每轮计算都会使用一个常数组成一个常数表K,K的原始值计算为2^32 * |sin i |,然后取其整数部分。然后有理想想法的同学可以改变K值,比如把sin改成cos或者tan,这样就可以卷起来了。

3.卷中卷代码语言:txt复制//F,G,H,I四个非线性变换函数#define F(x,y,z) ((x & y) | (~x & z))#定义 G(x,y,z) ((x & z) | (y & ~z))#定义 H(x,y,z) (x^y^z)#定义 I(x,y,z) (y ^ (x | ~z))//x向左旋转n位的操作 #define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))要真正roll Up,我们需要改变MD5中的四个非线性变换函数F、G、H和I。我们可以添加XOR或减少AND运算,整个算法就会改变它的外观。

这种先进的滚动方式可以骗过boss,让算法更加强大。我们今天的目标是尝试恢复修改后的MD5算法。

通过这次实践,我们将了解算法复原的基本方法。本示例的输入参数是字符串:“3” 返回值是 32 个字符:“DD89CAD8B10F75A3D” 2. 步骤 第一步,我们需要使用 Unidbg run-through 算法。

与古代使用ida调试的前辈相比,Unidbg的出现直接将算法还原的难度降低了一个数量级。第二步,我们需要通过逆向求导将结果Z一步步返回到原始输入A。

这种方法称为逆向效应,是逆向分析的基本套路。我们假设这个样本是MD5或者修改后的MD5。

我们可以通过以下方法来还原算法: 1、调试断点 2、条件断点 3、数据打印 4、Trace内存读写 5、Trace代码 1、调试断点逆向分析是一门经验科学。虽然有一些基本套路,但还是以尝试为主。

首先使用IDA打开libnative-lib.so,从Exports导出表中找到导出函数Java_com_littleq_cryptography_md5_MainActivity_sign。该函数的起始地址为0x,结束地址为0x12B4,但主要代码逻辑在函数sub_A3C中。

让我们尝试在 sub_A3C 函数的末尾设置一个断点。代码语言:txt 复制文本:11D4 E0 07 40 F9 LDR X0, [SP,#0x+var_ ].text:11D8 03 00 00 90+ ADRL X3, aSSSS ; "%s%s%s%s".text:11D8 63 EC 0A 91.text:11E0 E4 83 01 91 ADD .text:11E4 E5 43 01 91 ADD X5, SP, #0x+var_C0.text:11E8 E6 03 01 91 ADD X6, SP, #0x+var_D0.text:11EC E7 C3 00 91 ADD var_E0.text:11F0 01 00 80 92 MOV我们将 Unidbg 中的下一个断点设置为 0x11D8。

代码语言:txt copy Debugger debugger = emulator.attach(); debugger.addBreakPoint(module.base + 0x11D8);并运行它。代码语言成功破解:txt copy debugger break at: 0x11d8 @ Function64 address=0x,arguments=[unidbg@0xfffe[libandroid.so]0x, 25, 58]>>> x0=0xbffff(-40) x1=0x0 x2=0x4 x3=0xbffffed20 x4=0xx5=0x02c0 x6=0x1 x7=0xbffffx8=0x0 x9=0x0 x10=0x1 x11=0x0 x12=0x8 x13=0x8 x14=0x8>>> x15=0x8 x16=0x8d70 22 =0x68ca89dd x 23 =0x3d5a x24=0x72ebb x25=0xddf5ac1 x26=0xd0d5adc6 x27=0x8b4d x28=0xffp=0xbffffLR=RX@0x11d4[libnative-lib.so]0x11d4SP=0xbffffPC=RX@0x11d8[libnative -lib.so]0x11d8nz CV:N=0, Z=1,C=1,V=0,EL0,使用 SP_EL0start + 0xae8=> *[libnative-lib.so*0xd8]*[]*0x11d8:*"adrp x3, #0x" [libnative- lib.so 0xdc] [63ec0a91] 0x11dc:“添加x3,x3,#0x2bb”[libnative-lib.so 0xe0] [e] 0x11e0:“添加x4,sp,#0x60”[libnative-lib.so 0xe4] [e] 0x11e4 :“添加 x5, sp, #0x50" [libnative-lib.so 0xe8] [e] 0x11e8: "添加 x6, sp, #0x40" [libnative-lib.so 0xec] [e7c1] 0x11ec: "添加 x7, sp, # 0x30" [libnative-lib.so 0xf0] [] 0x11f0: "mov x1, #-1" [libnative-lib.so 0xf4] [] 0x11f4: "mov w2, #0x40" [libnative-lib.so 0xf8] [ 5bfdff97] 0x11f8: "bl #0x" 在Arm汇编中,在调用函数之前,输入参数将被存储在x0,x1,x2...从这段代码中,我们可以看到地址0x11f8将调用0x函数并且传入的参数有7个,从x0到x7,虽然Unidbg的调试有点简陋,但是有了这样的神器,还需要什么?即遇到函数调用就进入,n单步执行,遇到函数调用则不进入函数。

c 继续执行 b 设置断点 r 取消当前断点 m 检查内存 首先 s s s 几次,单步到 0x11f8 代码语言:txt copy debugger break at: 0x11f8 @ Function64 address=0x,arguments=[unidbg@0xfffe[libandroid .so ]0x, 25, 58]>>> x0=0xbffff(-40) x1=0xffffffffffffffff x2=0x40 x3=0x12bb x4=0xbffff5d0 x5=0xbffff5c0 1 =0x0 x12=0x8 x13=0x8 x14=0x8LR=RX@0x11d4[libnative -lib.so]0x11d4SP=0xbffffPC=RX@0x11f8[libnative-lib.so]0x11f8nzcv: N=0, Z=1, C=1, V=0, EL0,使用 SP_EL0start + 0xb08=> *[libnative-lib .so*0xf8]*[5bfdff97]*0x11f8:*"bl #0x"这时候输入参数就准备好了,我们来看看这些输入。代码语言:txt复制mx7>-------------------------------------------------------- --- ----------------------------------<[10:40:26]x7=unidbg@0xbffff5a0 , md5= d6cca9ef57fc14e1bf,大小: : 35 41 37 35 37 34 33 44 00 B3 22 40 00 00 00 00 5A3D.."@....: 39 37 30 37 31 30 46 37 00 8D 09 40 00 00 0 0 00 10F7.. .@....:34 44 39 31 38 31 38 42 00 77 12 40 02 00 00 00 4D8B.w.@....:44 44 38 39 43 41 36 38 00 1B 17 40 02 00 00 00 DD89CA68 ...@....: 31 36 37 37 30 33 38 30 36 36 35 35 33 80 00 00 3...: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ………………:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………^---- -------------------------------------------------- -----------------------^可以看到,这次调用函数0x基本上就是组装最终的结果了。

生成的位置来分析最终结果是如何计算出来的,即Y→Z的过程。 4.跟踪内存读写 现在我们知道了结果Z的位置,下一步就是要知道Z是谁计算出来的。

我们需要用到Unidbg的一个强大的功能:内存读写监控。这次我们提前设置了调试断点,并在 sub_A3C 函数的开头处断掉。

代码语言:txt复制调试器断点处:0x0a3c @ Function64 address=0x,arguments=[unidbg@0xfffe[libandroid.so]0x, 25, 58]>>> x0=0xx1=0xbffffx2=0x0 x3=0x1 x4=0x0 x5 =0x1 x6=0x0 x7=0x0 x8=0xfffe0a70 x9=0xx10=0x0 x11=0x1 x12=0x3 x13=0xx14=0x>>> x15=0x1 x16=0xx17=0x0 x18=0x17 x19=0xfffex20=0xbffffx21=0x0 x22= 0x0 x23=0x0 x24=0x0 x25=0x0 x26=0x0 x27=0x0 x28=0x0 fp=0xbffff6f0LR=RX@0x[libnative-lib.so]0xSP=0xbffffPC=RX@0x0a3c[libnative-lib.so]0xa3cnzcv:N =0、Z=0、C=1、V=0、EL0,使用 SP_EL0start + 0x34c=> *[libnative-lib.so*0x00a3c]*[ffd1]*0x0a3c:*"sub sp, sp, #0x" traceWrite 0xbffff5d0 0xbffff5d8设置跟踪 0xbffff5d0->0xbffff5d8 内存写入成功。c[11:41:41 ] 内存写入 0xbffff5d8,数据大小 = 1,数据值 = 0x0,PC=RX@0x[libnative-lib.so]0x,LR =null[11:41:41 ] 内存写入位于 0xbffff5d0,数据大小 = 8,数据值 = 0x0,PC=RX@0xc[libnative-lib.so]0xc,LR=null[11:41:41 ] 内存写入在 0xbffff5d8 处,数据大小 = 1,数据值 =0x0, PC=RX@0xb48cc[libc.so]0xcc, LR=RX@0xb48c8[libc.so]0xc8traceWrite 是监听写内存命令。

看来0xbffff5d0的内存,DD89CA68数据写入的位置是:0xc 代码语言:txt 复制文本:C 14 00 00 90+ ADRL :C 21 01 80 52 MOV W1, #9.text:22 01 80 52 MOV W2, #9. 文本:E3 03 14 AA MOV X3, X20. 文本:FF A3 01 39 STRB WZR, [SP,#0x+ var_A8]. 文本:C FF 33 00 F9 STR XZR, [SP,#0x +var_B0].text:7D FD FF 97 BL sub_xc 的指令 STR XZR 写得正确,但看起来不像写数据。相反,地址 SP,#0x+var_B0 处的数据被清除。

那我们再试一次。 (Unidbg的优点是可以无限重放,比在真机上调试app方便很多倍。

) 这次再前进一点,在0xC处设置断点。断开连接后,每隔 s 步进检查一次 m0xbffff5d0。

最后发现运行0x后,0xbffff5d0内存的值变成了DD89CA68。这说明0xbffff5d0是由sub_函数写入的。

代码语言:txt复制调试器中断处:0x@ Function64地址=0x,arguments=[unidbg@0xfffe[libandroid.so]0x, 25, 58]>>> x0=0xbffff5d0(-32) x1=0x9 x2=0x9 x3 =0x12b8 x4=0xdd89ca68 x5=0xe6cd8e62 x6=0xx7=0x29b9cx8=0x40 x9=0xx10=0xbffff5e0 x11=0x40 x12=0x3d5ebb2b x13=0xcx14=0xfc63b7e7>>> x15=0x49ac16 b x16=0xac6afx17=0xf3db x18=0x18 x19=0x4cf3ax20= 0x12b8 x21=0x0 x22=0x68ca89dd x23=0x3d5a x24=0x72ebb x25=0xddf5ac1 x26=0xd0d5adc6 x27=0x8b4d x28=0xffp=0xbffffLR=nullSP=0xbffffPC=RX@0x[libnative-lib.so]0xnzc v:N=0,Z= 1 , C=1, V=0, EL0, 使用 SP_EL0start + 0xa80=> *[libnative-lib.so*0x0]*[7dfdff97]*0x:*"bl #0x" 但是返回0x,我们发现了一个字符串熟悉的数字x4=0xdd89ca68,那么,我们的问题就变成了如何计算x4的值? 3、总结:首先要习惯阅读Arm汇编,一步步调试,然后熟悉寄存器的变化。对一些关键数字要特别敏感。

掌握Unidbg的基本调试命令。熟悉常用的加密算法,并在开发环境中多次调试,熟悉其算法流程。

ffshow1: ffshow 多种方式区分时很容易区分对错;如果一味和谐,就分不清人我。提示: :本文的唯一目的是了解更多逆向技术和思路。

如果有人利用本文的技术进行非法经营并获取利益,法律责任将由经营者自行承担。与本文及作者无关。

本文涉及的代码项目可以从奋飞知识星球的朋友那里获取。欢迎加入知识星球,一起学习、讨论技术。

如果有什么问题请加我wx:fenfei讨论。

代码还原小测试(一):魔改MD5

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 科技部:国家高新技术企业数量突破20万家

    科技部:国家高新技术企业数量突破20万家

    科技部部长王志刚今天在国新办新闻发布会上表示,科技有力支撑产业升级,新能源汽车、新型显示技术跻身世界前列。 北斗导航卫星全球集团互联网,人工智能、生物医药、大数据、云计算等领域企业带动产业形成良好发展势头。 新增人工智能企业100多家,高新技术企业数量突破20万

    06-18

  • 「程天科技」宣布完成千万级A轮融资

    「程天科技」宣布完成千万级A轮融资

    杭州程天科技发展有限公司宣布完成千万级A轮融资。 本轮融资由兰驰创投独家投资,募集资金将用于“康复即服务”康复养老新模式的探索、市场推广、团队拓展及量产准备。 程天科技是一家在养老、康复领域提供智能康复装备、康复辅助产品及智能康复解决方案的外骨骼机器人科技公

    06-17

  • 投资界新闻 -普洛斯与中国人寿联合发起设立100亿元收益型基金

    投资界新闻 -普洛斯与中国人寿联合发起设立100亿元收益型基金

    投资社区(微信ID:pedaily)2月11日消息,普洛斯近日宣布与中国人寿共同发起设立普洛斯首只收益型基金基金在中国。 本次交易完成后,普洛斯的全球基金管理平台将扩大至1亿美元,自2018年以来年增长率达56%。   该基金承诺资本为1亿元人民币(约16亿美元),将用于收购中国

    06-18

  • 英特尔加码汽车芯片、芯片与变量

    英特尔加码汽车芯片、芯片与变量

    北京时间9月7日,英特尔CEO帕特基辛格发表了今年2月上任以来的首次现场演讲。 演讲的场合是慕尼黑车展。 帕特用这样一句话作为他演讲的开场白:“为什么一个做半导体的人会站在世界上最重要的车展的领奖台上?”帕特给出了两个答案:英特尔推出代工服务加速器计划,帮助汽车芯

    06-08

  • 55亿元精银超薄精密柔性薄膜封装基板项目开工建设

    55亿元精银超薄精密柔性薄膜封装基板项目开工建设

    丽水日报 据丽水日报报道,近日,浙江精银电子投资建设的超薄精密柔性薄膜封装基板生产线项目目前正在建设中的科技有限公司已开工建设。 据悉,该项目于今年2月在丽水经济开发区启动,3月举行开工仪式,4月取得施工许可证。 总投资55亿元,占地亩,建设超薄精密柔性薄膜封装

    06-06

  • 创维加入WiSA协会,继续引领电视行业

    创维加入WiSA协会,继续引领电视行业

    ——WiSA协会为电视行业打造领先的无线、多通道音频解决方案——7月22日,无线扬声器和音频协会(WiSA? LLC)成为由峰会无线技术公司(WISA)创立、由60多个领先消费电子品牌组成的行业协会今天宣布,创维集团有限公司成为其最新成员。 作为电视行业的领导者和中国最大的电视

    06-06

  • SK海力士与英特尔均考虑组团收购Arm

    SK海力士与英特尔均考虑组团收购Arm

    中国电子报、电子信息产业网 3月30日,SK海力士在京畿道利川总部召开例行股东大会时,SK海力士副总裁董事长朴正浩表示,SK海力士正在考虑与战略投资者组建财团,共同收购Arm。 Park Jung-ho表示:“Arm在国际半导体生态系统中发挥着非常重要的作用,这个生态系统不会让任何单

    06-06

  • SEMI 欢迎新董事会成员

    SEMI 欢迎新董事会成员

    资料硅半导体 SEMI 选举了四位新成员加入 SEMI 北美顾问委员会 (NAAB)。 新成员包括:Axcelis 总裁兼首席执行官 Russell Low 博士; Martin Elzingre,Edwards Vacuum 北美半导体部门副总裁兼总经理; Audrey Charles,泛林研究公司企业战略高级副总裁; Jeorge S. Hurtarte

    06-06

  • 中国科学家发明新型单晶体管逻辑结构

    中国科学家发明新型单晶体管逻辑结构

    复旦大学研究团队近日在集成电路基础研究领域取得突破。 他们发明了一种新的逻辑结构,可以让单个晶体管“做两个人的工作”,将晶体管面积减少了50%,进一步提高了存储和计算的同步性。 如果成功产业化,将推动集成电路向更轻、更快、更小、更低功耗方向发展。 相关研究成果已

    06-06

  • 一群中国科大校友做VC的高捷资本

    一群中国科大校友做VC的高捷资本

    今年的一级市场很平静,高捷资本却在一个月内迎来了两起IPO——5月21日,云从科技,其中之一AI四小虎,正式登陆公司高捷资本是投资者之一;随后,互联网医药平台药师邦向港交所提交IPO申请,拟在港交所主板上市。 “未来2-3年,我们将有近10个IPO项目。 ”高捷资本创始董事合

    06-17

  • 首次发布 -明都智云完成数亿元C轮融资,由深圳创投

    首次发布 -明都智云完成数亿元C轮融资,由深圳创投

    投资界(ID:pedaily)领投(ID:pedaily)2月29日消息,生活领域领先的数字化转型服务商明都智云(浙江)科技明都智云科技股份有限公司(简称“明都智云”)正式宣布完成数亿元C轮融资。 本轮融资由深创投领投,招商医疗跟投,指数资本担任独家财务顾问。 明都智云创始人、董

    06-18

  • 雷军出100亿造车,有多少米粉买得起?

    雷军出100亿造车,有多少米粉买得起?

    在12月28日这场提前充满宣传性和悬念的发布会上,雷军毫不客气地将小米汽车与最具标志性的两家车企——豪华保时捷和科技感进行了比较。 完全是特斯拉。 雷军在记者招待会前的表现可谓谦虚。 12月27日,雷军在多个城市布置了户外大屏广告牌,并发布多条微博,向比亚迪、蔚来、

    06-17