whklhh 发表于 2017-9-29 20:25

【Reversing.kr】Ransomware

本帖最后由 whklhh 于 2017-10-17 12:04 编辑

Reversing.kr是韩国的一个逆向题目网站
有分国度的排行榜,还是挺有意思的
本题即来自于第八关Ransomware
http://reversing.kr/challenge.php可以下载到文件

readme提示要解密文件
运行一堆乱码,估计可能是韩文吧


查壳发现有UPX
以前很少手脱,正好用这个比较常见的壳试一下…

ESP定律比较轻松的搞下来了,运行一下居然正常的,以前总是要修复甚至拖回xp系统才行

拖入IDA发现main函数块巨大,反编译会一直等待
拖入OD进行跟踪,发现在exit前,位于44ab75的call会飞
跟进去以后是大片的花指令:
http://img.blog.csdn.net/20170929192809597?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

源程序只有10K,OD拖下来就高达10MB了,本来以为UPX压缩效率惊人到这个地步,原来都是这花指令再捣鬼
(PS:用UPXShell拖下来只有300K,代码倒是没少啥,不过似乎有一些对空余地方的去除,希望有懂的师傅指导一下QAQ)

估计这就是妨碍IDA反编译的东西了
先往下跟,发现在0044A775的地方开始正常代码
printf和scanf的前后大量调用了sub_401000,而这个函数跟进去也同样是大片的花指令
长度高达0x10000左右,为了防止中间加载有效操作,将反汇编代码复制出来进行清洗,发现啥都没剩╮(╯_╰)╭
就是个空函数大概流程是得到输入,然后open提供的file文件进行操作

试着重新建立了一个file文件,在其中写入00000等试验文本,随便输入一个key,待程序运行完成后再打开发现已经变成乱码了……
居然是直接对源文件操作的,那我之前乱输的key不就直接让file文件乱掉了吗!
不备份真是恶劣……还好rar中可以再找回来

那么先看看IDA的反编译吧
为了使IDA正常工作,我们把这两段花指令NOP掉
从下到上全部NOP,然后在401000处写入C3(retn)使sub_401000能正常返回

保存以后拖入IDA会报库函数未识别的错,把相应的地方修改HEX糊弄过去先,得到整体框架再说:
我这边反编译出的代码缺陷很大,不过依靠文件名字符串识别出scanf和输入字符串的位置,就可以找到下边的关键代码了:
http://img.blog.csdn.net/20170929193630512?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
可以看出来,解密操作是将input逐个与二进制流异或,然后取反不过没有提供密钥,所以有点懵逼参考了一下别人的WriteUp,发现这个加密文件其实是个PE格式的EXE
提示在readme里:Decrypt File (EXE)
我靠我以为EXE的意思是用EXE解密呢……原来是告诉我们File本来是个EXE啊(╯‵□′)╯︵┻━┻

既然这样的话,通过PE文件的特定格式就能找到一些端倪了
比方说magicnumber,不过它有些短,所以当密钥太长的话就无能为力了
PE头中有一个dos stub程序,一般情况下运行会显示”this program cannot be run in the dos mode”
这个字符串就足够长,可以用来破译了
还可以使用在程序末尾出现的00,它们足够长,而且源码相同易于识别:

http://img.blog.csdn.net/20170929194820280?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

我选中的部分即为循环节,将它们dump下来取反再与0异或即可得到密钥的循环:
s =
for i in s:
    print(chr((~i ^ 0)%256), end='')
essletsplaychessletsplaychessletsplaychessletsplaychessletsplaychessletsplayches

可以从中看到”letsplaychess”这个有意义的英文句子
如果密钥无意义的话就只能循环密钥来爆破了

接下来直接通过EXE解密也行,自己写脚本也可以了:
key = "letsplaychess"
f = open("ransomware/file", "rb")
data = f.read()
exe = []
for n in range(len(data)):
    exe.append(((~data ^ ord(key)) % 256))
f.close()

f = open("ransomware/file_de.exe", "wb")
f.write(bytes(exe))
f.close()
运行生成的程序就能得到flag

另外在去花指令的环节,参考得知
还可以用IDAPython脚本
或者直接Python读二进制来去除
data = open(‘run.exe’,’rb’).read()
data = data.replace(‘\x60\x61\x90\x50\x58\x53\x5b’,’\x90\x90\x90\x90\x90\x90\x90’)
open(‘run_dejunk.exe’,’wb’).write(data)
(去除代码出自http://www.tuicool.com/articles/fqAZfe6)

==============================
在讨论过程中又想起来一种方法
目标是帮助IDA绕过对花指令的F5
除了直接去掉花指令以外,还可以告诉IDA不要识别这个部分
F5的功能是对当前选中的Function进行反编译,那么我们把花指令的部分排除Function就可以达到目的了:

按ALT+P,或者右击Edit Function,将_main函数的起始部分改到花指令以后
再F5就行了

可能需要修复一下堆栈,在Option中勾上Stack pointer查看哪里的堆栈不平衡,用ALT+K对函数操作即可

whyida 发表于 2017-10-17 07:28

你的exe解密脚本编译不能通过,必须要把列表改成字符串才行。
key = "letsplaychess"
f = open("file", "rb")
data = f.read()
exe = ''
for i in range(len(data)):
    exe+=(chr(((~ord(data)) ^ (ord(key))) % 256))
f.close()

f = open("file_de.exe", "wb")
f.write(bytes(exe))
f.close()

whklhh 发表于 2017-9-30 00:19

6767 发表于 2017-9-29 23:17
昨天也看到这个了,这题的key point 在于去除花指令,怎么样快速有效的去花,解密倒是小意思。
可以用upx...

xor以外还有一个取反呀,所以不太好分析吧
花指令一共有两块,sub_401000作为空函数
还有4135e0-44a775这一块只经过一次,就是_main前面的那一段
但是F5分析这个起来都会很慢啊,其实慢慢等上几十分钟应该也能出来

6767 发表于 2017-9-29 23:17

本帖最后由 6767 于 2017-9-29 23:19 编辑

昨天也看到这个了,这题的key point 在于去除花指令,怎么样快速有效的去花,解密倒是小意思。
可以用upx -d 解包
不过我也没有看到是exe文件,讲道理xor这样的加密是无法抵抗统计分析的
印象中_main开头还有一堆花指令直接jump了,所以我的F5好像还是挺正常的

chenjingyes 发表于 2017-9-30 00:21

难点应该就是去花指令把

whklhh 发表于 2017-9-30 00:47

6767 发表于 2017-9-29 23:17
昨天也看到这个了,这题的key point 在于去除花指令,怎么样快速有效的去花,解密倒是小意思。
可以用upx...

我那个不正常好像是msvcr100d.dll的符号链接表没找到_(:з」∠)_
研究了一下也没明白怎么加 囧

whklhh 发表于 2017-9-30 01:03

chenjingyes 发表于 2017-9-30 00:21
难点应该就是去花指令把

还有找key……因为readme的提示实在是太难理解了囧

6767 发表于 2017-9-30 01:20

whklhh 发表于 2017-9-30 00:47
我那个不正常好像是msvcr100d.dll的符号链接表没找到_(:з」∠)_
研究了一下也没明白怎么加 囧

那是脱壳的时候iat给弄坏了吧///
用脱壳机就好了

whklhh 发表于 2017-9-30 01:23

本帖最后由 whklhh 于 2017-9-30 01:24 编辑

6767 发表于 2017-9-30 01:20
那是脱壳的时候iat给弄坏了吧///
用脱壳机就好了
我用脱壳机了,IDA仍然识别不到msvcr100.dll……
参考了一堆如何链接符号表都没能成功_(:з」∠)_跪了

本来应该是调用msvcr100中的函数的,IDA只作为dword来看了,然后F5的时候就报错
我就只能把这个call给NOP掉,然后勉强F5出来的也是乱七八糟没识别出库函数的样子

6767 发表于 2017-9-30 01:50

whklhh 发表于 2017-9-30 01:23
我用脱壳机了,IDA仍然识别不到msvcr100.dll……
参考了一堆如何链接符号表都没能成功_(:з」∠)_跪了
...

检查一下exe里的iat有没有存在,也可能是ida的问题
这个是我用upx -d直接脱壳的

whklhh 发表于 2017-9-30 01:55

6767 发表于 2017-9-30 01:20
那是脱壳的时候iat给弄坏了吧///
用脱壳机就好了
最后重新做了msvcr100的sig文件链接进去了……终于识别出来啦
不过还是想请教一下,看你的截图,是怎么把我选中的那一块合成一个变量的呢?
页: [1] 2 3
查看完整版本: 【Reversing.kr】Ransomware