whklhh 发表于 2017-12-10 02:24

【JarvisOJ】软件密码破解(2)

本帖最后由 whklhh 于 2017-12-10 02:26 编辑

题目来源于JarvisOJ-软件密码破解(2),原题为CFF2016的re300
机制挺有意思的,分享一下

运行发现是个CUI程序,随便输入会进入死循环
拖入IDA反编译,主函数结构很简单:
http://img.blog.csdn.net/20171201152753549?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
很简单的接收,于是跟入查看关键函数check:
http://img.blog.csdn.net/20171201153005937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
进行了一大堆进程操作,总结下来就是将输入的内容作为参数重新开启了一个子进程,然后等待它返回

由于调试事件会被最上层的调试器接收掉,所以父进程好像不太好接收到事件的消息了……
从这个角度上来看,动态调试就有点困难了

于是重新开启一个进程,加入参数进行调试
发现它在main的时候有一个判断,当有参数的时候就跳到另一个流程了
单步跟发现在这里有一个INT3会断下来交给父进程
http://img.blog.csdn.net/20171201153419010?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
那么很明显,父进程的WriteProcess就是在这里起作用的

将父进程的v22-v25写入003E1145,注意小端序哦
http://img.blog.csdn.net/20171201153722882?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
跟下来可以发现它与“elcome to EEF test!”进行逐字符异或,然后再将结果全部+1
最后通过OutputDebugString将结果传回父进程
然后父进程通过ReadProcessMemory接收,与硬编码进行比较

算法还是比较简单的,这个传递消息的子进程机制很有意思
写出注册机
s = 0x2B5C5C25.to_bytes(4, "little") + 0x36195D2F.to_bytes(4, "little") + 0x7672642C.to_bytes(4, "little") + 0x524E6680.to_bytes(4, "little")
p = b"elcome to CFF test!"
for i in range(16):
    print(chr((s-1)^p), end='')

yunfeng 发表于 2017-12-10 07:22

好文章,谢谢楼主分享

404607073 发表于 2017-12-10 07:29

学习了...我i努力了啊

疯狂醉虎 发表于 2017-12-10 08:19

感谢分享!谢谢!

tnndks 发表于 2017-12-10 09:35

学习下!谢谢无私的分享了{:1_918:}

某些人 发表于 2017-12-10 09:46

谢谢分享。。。

lsch123 发表于 2017-12-10 13:30

楼主,一个字“牛”!

Eagle徐 发表于 2017-12-10 13:42

感谢楼主分享这么好的教程!

3683057 发表于 2017-12-10 14:25

再学习中 谢谢

linclon 发表于 2017-12-10 15:12

厉害厉害,感谢楼主分享
页: [1] 2 3 4
查看完整版本: 【JarvisOJ】软件密码破解(2)