171220 逆向-i春秋【迎圣诞】-NoExec

1625-5 王子昂 总结《2017年12月20日》 【连续第446天总结】
A. i春秋【迎圣诞】-
B.
后缀名写着exe , 却不能运行~
用打开分析一下
发现NT头有很明显的问题
应该是50 45 00 00,被改为了HA
【171220 逆向-i春秋【迎圣诞】-NoExec】后面一个HA很明显也是后加的,查询一下发现这里是,表示使用的处理器
正确的值应该为4C 01,即i386 - 332
修改以后发现还是不能运行 , 继续检查
想起来DOS头里有一个重要的值:,它表示了NE头的偏移
原值为00 01 00 00,很明显是错的 , 改正为10 01 00 00(0x110)
改完发现都能识别出来它是个MFC了
然而双击以后响应了一会儿还是没东西出来
拖入OD也在加载器中就跳入SEH了 , 估计加载的时候还有什么错误,当时没有发现
但是知道它是MFC就有地方可以操作了:
无壳,拖入IDA,发现函数里没有好辨认的东西,查找字符串也没有可读的部分╮(╯_╰)╭
于是开始考虑从资源下手

171220 逆向-i春秋【迎圣诞】-NoExec

文章插图
用查看控件ID,发现确认按钮的ID为1001
于是根据ID定位按钮函数,通过IDA的搜索立即数
(结构体自己导入)
171220 逆向-i春秋【迎圣诞】-NoExec

文章插图
这样就找到了函数:
结构很明显
171220 逆向-i春秋【迎圣诞】-NoExec

文章插图
查看check函数,发现先是通过下标的奇偶将字符串切成两个
171220 逆向-i春秋【迎圣诞】-NoExec

文章插图
然后分别将两个字符串,再连接起来
171220 逆向-i春秋【迎圣诞】-NoExec

文章插图
之后大段的代码太长不想看( 。
反正没有对v76操作的地方
最后可以看出来是和一个字符串比较
171220 逆向-i春秋【迎圣诞】-NoExec

文章插图
直接把它拖下来解b64发现不可见,说明中间还有操作
到这里就陷入了僵局
回头重新研究
发现当用IDA调试的时候会报start函数执行失败
这个提示让我茅塞顿开 , 节区属性的可执行属性被关闭了!
原来题目名““就给出提示了╮(╯_╰)╭奈何一直没get到
于是将代码所在节区.text的属性加上可执行(DWORD: 1)
171220 逆向-i春秋【迎圣诞】-NoExec

文章插图
就可以运行了!
在OD中对刚才分析的结果b64后的字符串下断 , 断到->中进行了操作
在IDA中大概看了一下,很复杂╮(╯_╰)╭
掏出密码学分析插件看一眼,哼,果然在这个函数里有对的调用
那这个就是DES没跑了
OD中对这个函数下断,发现它是每次截取8个字符进行DES,密钥通过对参数的观察发现是
6E 06 15 51 93 5B 07 EA
IDA中大概能看到是上面一堆复杂操作出来的….看不懂(望天
跑了一下发现这个密钥是不变的
解密出来由于是二进制值,所以还有一次转为可见字符
于是按照思路写出解密脚本:
from base64 import b64encode, b64decodefrom Cryptodome.Cipher import DESk2 = [0x6E, 0x06, 0x15, 0x51, 0x93, 0x5B, 0x07, 0xEA]key = bytes(k2)x = DES.new(key, DES.MODE_ECB)s = b"GcDk0SvnNA1tsmp5FCK1FpSDfUXZbhHBSPheZaixuMyzqyysOAPCPB/p7sMpmK1KZo+lPfhMZxw="c = b64decode(s)# 解密p = x.decrypt(c)# 还原奇偶字符x = b64decode(p)y = b64decode(p[28:-4])for i in range(37):if(i%2==0):print(chr(x[i//2]), end='')else:print(chr(y[i//2]), end='')
活动页面上写着难度为中下 , 不过这个题目着实难了我一会儿(:з」∠)
虽然复盘想想好像的确没有太复杂的东西,但是各种小细节还是挺麻烦的
学到和巩固了很多知识~感谢出题人和i春秋提供的题目(°?°)?
C. 明日计划
加密与解密/看雪题目