本帖最后由 whklhh 于 2017-10-18 01:20 编辑
Reversing.kr是韩国的一个逆向题目网站
有分国度的排行榜,还是挺有意思的
本题即来自于第二十关CSharp
http://reversing.kr/challenge.php可以下载到文件
标题很明显能看出来是C#,
.NET程序EXEINFOIE和PEiD对.NET的查壳不太好使
运行看看,就是一个输入框和按钮
直接拖入ILSpy中:
Click事件获取输入框的文本,调用MetMetMet
MetMetMet中的流程虽然有点凌乱,但是大体上还是能理清的:
先b64加密,存在bytes中
然后创建了一个数组,array[0]=1
接着通过method调用了MetM方法,参数分别是array和bytes
最后判断array,也就是返回值了
那么关键判断流程就在于MetM方法中了,直接查看发现被加密了:
试了一下de4dot等脱壳工具和查壳工具都没有结果,最后发现在这里
窗体初始化的时候提取MetMett方法,然后进行解密
最简单的方法就是直接动态调,断下来该方法解密后的值然后再分析
不过找了一下ILSpy和.NET Reflector虽然都有动态调试的插件,但是都没法看到十六进制的内存(:з」∠)
也可能是我不会玩儿吧
解密方法倒是不太难,手动的话就是IDA中把源数据Dump下来,处理过后再复制回去文件中即可
[Python] 纯文本查看 复制代码 b = 0
for i in range(len(bb)):
bb += 1
bb = bb % 256
b += bb
bb[18] = (b - 38)%256
bb[35] = (b - 3)%256
bb[52] = (b ^ 39)%256
bb[69] = (b - 21)%256
bb[87] = (71 - b)%256
bb[124] = (b ^ 114)%256
bb[141] = (b ^ 80)%256
bb[159] = (235 - b)%256
bb[179] = (106 + b)%256
bb[200] = (36 - b)%256
bb[220] = (b - 3)%256
for i in bb:
print("%02x"% i, end=' ')
注意数据以字节为单位,范围只有0-255,刚开始没注意这点的时候出了好几次错(:з」∠)
数据复制下来通过winhex之类的编辑器覆盖方法即可(如果不会计算RVA→RAW偏移的话,直接搜索开头的数值就可以了)
覆盖以后再通过ILSpy分析:
就是很简单的异或验证了,清洗下代码就能得到flag:
[Python] 纯文本查看 复制代码 import base64
bt = [0 for i in range(12)]
bt[0] = 16 ^ 74
bt[3] = 51 ^ 70
bt[1] = 17 ^ 87
bt[2] = 33 ^ 77
bt[11] = 17 ^ 44
bt[8] = 144 ^ 241
bt[4] = 68 ^ 29
bt[5] = 102 ^ 49
bt[9] = 181 ^ 226
bt[7] = 160 ^ 238
bt[10] = 238 ^ 163
bt[6] = 51 ^ 117
flag = ''
for i in bt:
flag+=(chr(i))
print(base64.b64decode(flag))
直接动态调试的方法,参考了一下http://www.mottoin.com/88578.html的WP,使用dnSpy更加方便,这个反编译器拥有更丰富的动态调试组件,比如监视器、修改内存 等等
下断后查看监视器
将0x000000EA处的值复制下来,粘贴到MetM方法处保存,再重新打开即可
这题的难点在于.NET的动态调试和代码加密,还是挺有收获的 |