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