[Rev] Brutal Oldskull - Cpt.shao xp0int Posted on Oct 1 2018 Windows 下面的一道逆向题目,主界面如图,需要输入4个code,然后加上一个flag。 ![main](https://leanote.com/api/file/getImage?fileId=5bb1d16eab644132ff002881) 逆向可以发现主要逻辑并不复杂: ![fun1](https://leanote.com/api/file/getImage?fileId=5bb1d16eab644132ff002882) (省略部分代码) ![fun2](https://leanote.com/api/file/getImage?fileId=5bb1d16eab644132ff002883) 主要是从输入框提取16进制的值作为key,放到`process_input`里面进行处理,连续四次操作以后把最后的数据写到`oldskull_checker.exe`然后执行。 所以我们的任务就是找到4个key,让数据块正常解码然后得到正确的exe数据。 起初跟踪`process_input`会发现函数十分复杂,里面涉及许多按位进行的操作。上网找到ida的一个findcrypt插件脚本运行一下,就能发现一个MD5函数的初始值特征。再找到MD5加密算法的实现,对应下来就能确定`process_input`里面调用md5的地方。 ![process_input](https://leanote.com/api/file/getImage?fileId=5bb1d16eab644132ff002884) 到这里函数的逻辑就十分清晰了,首先会从数据块逐个字节取出数据->然后和key进行简单的运算->更新key->处理下一个字节。整个数据块处理完以后,去到倒数32位为止的数据进行md5运算,算出的结果和最后32位数据进行比较,一样的化就说明key是正确的。 一开始没发现md5算法一起还想用symbolic execution的工具来直接算flag,后来一看循环的次数和位操作的复杂性就觉得不可能了。然后还尝试直接用unicorn来包装调用process_input函数,结果发现效率太低,爆破太慢,最后还是写python脚本解决。python写这类脚本有个不好的地方就是按位操作不太舒服,包括说做乘法运算时候的溢出问题还要处理一下。 ```python from pwn import * import hashlib f = open('./data.txt', 'r') DATA = unhex(f.read()) + '\x00' print hexdump(DATA[:0x20]) def process_input(data, size, key): org_key = key print "[+] Trying {:#x}".format(key) encoded = "" for i in range(size): tmp = (ord(data[i]) ^ (key & 0xff)) - ((key & 0xff00) >> 8) encoded += chr(tmp & 0xff) key = (key * 0x62f3) & 0xffff md5_obj = hashlib.md5() md5_obj.update(encoded[:-32]) code1 = md5_obj.hexdigest()[:16] code2 = encoded[-32:][:16] print code1 print hexdump(code2) if code1 == code2: print "[+] Success at: {:#x}".format(org_key) return encoded else: return None # DATA1 = process_input(DATA, 0x4c8e, 0x5b42) # DATA2 = process_input(DATA1, 0x4c6e, 0x13cc) # DATA3 = process_input(DATA2, 0x4c4e, 0xf129) # DATA4 = process_input(DATA2, 0x4c2e, 0x62ac) data = None i = 0 while (data is None): data = process_input(DATA, 0x4c8e, i) i += 1 ``` 代码演示的是爆破第一个key时候的情形,爆破其他key的时候稍微修改参数即可。`data.txt`放的是`0x405020`处的数据块。恢复出来的checker程序逻辑也是异常简单。 ![checker](https://leanote.com/api/file/getImage?fileId=5bb1d16eab644132ff002880) 只需要提取数据逐个字节和0x8F异或就行了。 ``` data = "cbfde8e1dcf4d8eeeeeef6dbe0e0cad5aeaebef2203c40" result = '' for i in unhex(data): result += chr(ord(i) ^ 0x8f) print result ``` 得出结果DrgnS{WaaayTooEZ!!1} 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Web] 3NTERPRISE s0lution - LanceaKing [Pwn] Babyheap - Cpt.shao
没有帐号? 立即注册