180821 逆向-周练babyre+Retdec配置

本文记录了一次使用Retdec逆向MIPS程序时遇到的问题及解决过程,包括Python模块安装、Windows环境下运行sh脚本的适配、ida插件依赖的环境配置以及反编译后的代码分析。最终通过调整环境和脚本,成功完成反编译并识别出关键函数,辅助解密得到flag。
摘要由CSDN通过智能技术生成

mips题目,看起来有点难受
想起来前几天defcon的时候刚好把retdec的环境搭起来,虽然还是有点小问题,但是正好借机解决一下嘛

首先看了binary ninja的插件,跑了一下python缺少模块,又找不到它内置的python在哪,查了一下可以在binary ninja的script console窗口中import pip来安装

import pip
pip.main([‘install’, ‘–quiet’, ‘packagename’])

装好以后直接打不开了- =
幸亏有一颗debug的心,把另一个插件generate_index.py移除以后就行了..有点神奇

然后跑一下,log窗口报错架构不支持,明明就是Mips啊╮(╯_╰)╭

去找了init.py来看

self.cmdline = [‘retdec-decompiler.sh’]
self.cmdline.append(‘-m’)
self.cmdline.append(‘raw’)

self.cmdline.append(‘-a’)
self.cmdline.append(self.arch)

self.cmdline.append(‘-e’)
self.cmdline.append(self.endianness)

self.cmdline.append(‘–backend-no-debug-comments’)
self.cmdline.append(‘–cleanup’)

p = Popen(self.cmdline, stdout=PIPE, stderr=PIPE)

我这windows怎么用管道跑sh啊?!
这适配简直了……无奈放弃

回头继续搞IDA的插件
它依赖于msys的mingw程序,以前搞gcc的时候也装过一个Mingw的程序,可以在win上运行sh脚本,包括strings\grep等等小程序

IDA这边可以看到log都打完了,Run Decompile已经完成了,最后却报了一个exit code -1

最尴尬的是IDA起的cmd窗口在错误以后直接消失,根本看不到最后出错的log
所以说log是非常重要的orz

还好IDA的报错窗口把idapython的命令 system(sh’xxxx’)显示出来,因此可以在Mingw中手动运行该命令

Running phase: emission of the target code [c] ( 0.11s )
Running phase: finalization ( 0.12s )
Running phase: cleanup ( 0.13s )
/usr/bin/env: ‘python3’: No such file or directory

`##### Done!

可以看到,最后一条python3未找到就是报错的原因了
去retdec-decompiler.sh中搜了一下一个python也没有
最后看到开头

`#!/usr/bin/env bash

哦~是某个文件要求用python3来解释失败了
其实也可以直接在env中写入一个python3的,然而我不太会玩这东西..

试了一下发现MingW里有个python3.6,那么只要令这里的对应关系修复就可以了
到文件夹里找一下,果然有个retdec-color-c.py打开一看,第一行就/是>`#!/usr/bin/env python3

把3去掉,再跑一遍终于成功√

然而IDA里还是报错orz
明天再调试吧

此时命令行跑起来以后,文件夹下已经出现了.c文件,可以勉强用啦~

反编译效果不是很好,但是对于循环和参数的识别帮助比较大
例如main函数中的这段就很明显可以看出是逐字符check

while (true) {
        char v4 = *(char *)(v2 + v3); // 0x400d14
        int32_t v5 = v3 + 1; // 0x400d30
        if (*(char *)(v3 + (int32_t)&g2) != v4) {
            // 0x400d20
            exit(0);
            // UNREACHABLE
        }
        // 0x400d38
        if (v5 >= strlen((char *)v2)) {
            // break -> 0x400d58
            break;
        }
        v3 = v5;
        // continue -> 0x400cf4
    }

关键内容在于这之前的变换sub_400790中
这个函数看起来就很蛋疼了

int32_t sub_400790(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值