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); // 0x400d14int32_t v5 = v3 + 1; // 0x400d30if (*(char *)(v3 + (int32_t)&g2) != v4) {// 0x400d20exit(0);// UNREACHABLE}// 0x400d38if (v5 >= strlen((char *)v2)) {// break -> 0x400d58break;}v3 = v5;// continue -> 0x400cf4}

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

int32_t sub_400790(char * a1, int32_t a2) {char * v1 = (char *)(int32_t)a1; // 0x4007a0int32_t v2 = strlen(v1); // 0x4007b0int32_t v3 = v2 + 3; // 0x4007c4int32_t v4 = v2 & -0x7ffffffd; // 0x4007ecint32_t v5 = v4; // 0x400808if (v4 <= 0xffffffff) {// 0x4007f8v5 = (v3 | -4) + 1;// branch -> 0x400808}char * v6 = malloc(3 * (v2 > -1 ? v2 : v3) / 4 + 1 + v5); // 0x400814*(int32_t *)a2 = (int32_t)v6;// branch -> 0x400bbcwhile (true) {char * v7 = v1; // 0x400bbc10// branch -> 0x400bbcchar * v8;int32_t v9; // 0x400bc0char * v10; // 0x400bdcwhile (true) {char v11 = *v7; // 0x400bc0v9 = v11;v10 = (char *)((int32_t)v7 + 1);if (v11 == 0) {v8 = v6;// 0x400c00*v8 = 0;// branch -> 0x400c18// 0x400c18return (int32_t)v8 - a2;}// 0x400830if (isspace(v9) == 0) {// break -> 0x400844break;}v7 = v10;// continue -> 0x400bbc}unsigned char v12 = *(char *)(v9 + (int32_t)&g1); // 0x400864char * v13 = v10; // 0x40088cchar v14 = *v13; // 0x400890int32_t v15 = v14; // 0x400890char * v16 = (char *)((int32_t)v13 + 1); // 0x4008a4// branch -> 0x40088cwhile (isspace(v15) != 0) {// 0x40088cv13 = v16;v14 = *v13;v15 = v14;v16 = (char *)((int32_t)v13 + 1);// continue -> 0x40088c}// 0x4008bcif (v14 == 0) {// 0x400c18return -1;}int32_t v17 = (int32_t)*(char *)(v15 + (int32_t)&g1); // 0x4008d8*v6 = (char)((0x100000 * v17 | 0x4000000 * (int32_t)v12) / 0x1000000);char * v18 = v16; // 0x400940char v19 = *v18; // 0x400944int32_t v20 = v19; // 0x400944char * v21 = (char *)((int32_t)v18 + 1); // 0x400958// branch -> 0x400940while (isspace(v20) != 0) {// 0x400940v18 = v21;v19 = *v18;v20 = v19;v21 = (char *)((int32_t)v18 + 1);// continue -> 0x400940}int32_t v22 = (int32_t)v6; // 0x400928char * v23 = (char *)(v22 + 1); // 0x400938if (v19 == 61) {char * v24 = v21; // 0x400984char v25 = *v24; // 0x400988char * v26 = (char *)((int32_t)v24 + 1); // 0x40099cwhile (isspace((int32_t)v25) != 0) {// 0x400984v24 = v26;v25 = *v24;v26 = (char *)((int32_t)v24 + 1);// continue -> 0x400984}// 0x4009b4if (v25 == 61) {char * v27 = v26; // 0x4009d4char v28 = *v27; // 0x4009d8while (isspace((int32_t)v28) != 0) {// 0x4009d4v27 = (char *)((int32_t)v27 + 1);v28 = *v27;// continue -> 0x4009d4}// 0x400a04if (v28 == 0) {v8 = v23;// 0x400c00*v8 = 0;// branch -> 0x400c18// 0x400c18return (int32_t)v8 - a2;}}// 0x400c18return -1;}char v29 = *(char *)(v20 + (int32_t)&g1); // 0x400a3c*v23 = (char)((0x400000 * (int32_t)v29 | 0x10000000 * v17) / 0x1000000);char * v30 = v21; // 0x400aa4char v31 = *v30; // 0x400aa8int32_t v32 = v31; // 0x400aa8char * v33 = (char *)((int32_t)v30 + 1); // 0x400abc// branch -> 0x400aa4while (isspace(v32) != 0) {// 0x400aa4v30 = v33;v31 = *v30;v32 = v31;v33 = (char *)((int32_t)v30 + 1);// continue -> 0x400aa4}char * v34 = (char *)(v22 + 2); // 0x400a9cif (v31 == 61) {char * v35 = v33; // 0x400ae8char v36 = *v35; // 0x400aecwhile (isspace((int32_t)v36) != 0) {// 0x400ae8v35 = (char *)((int32_t)v35 + 1);v36 = *v35;// continue -> 0x400ae8}// 0x400b18if (v36 != 0) {// 0x400c18return -1;}v8 = v34;// 0x400c00*v8 = 0;// branch -> 0x400c18// 0x400c18return (int32_t)v8 - a2;}char v37 = *(char *)(v32 + (int32_t)&g1); // 0x400b50*v34 = v37 | 64 * v29;v1 = v33;v6 = (char *)(v22 + 3);// branch -> 0x400bbc}
}

基本上看不出什么内容,但是有一些特征还是可以辅助猜测的
在中间找到了61,即’=’的ascii
有很多结构类似的代码,通过一些判断来选择跳转

综合考虑比较符合base64_decode
于是回到IDA中找到两个字符串,进行解码,就出现了flag

>>> a = b""
>>> for i in [142, 238, 109, 251, 137, 244, 182, 23, 171, 249, 182, 172, 123, 174, 62, 198, 138, 254, 34, 121, 254, 154, 42, 108]:
...     a += bytes((i,))
...
>>> a
b'\x8e\xeem\xfb\x89\xf4\xb6\x17\xab\xf9\xb6\xac{\xae>\xc6\x8a\xfe"y\xfe\x9a*l'
>>> import base64
>>> base64.b64encode(a)
b'ju5t+4n0ther+base64+xor+Inn+mips'

就是之前杭州安恒总决赛的mips题目~
当时依靠提示得到了这段字符串,但是由于格式提交失败了

这次终于独立做出来了=-=也算不虚折腾半天

retdec的反编译效果比IDA差的很大,基本无法单独阅读,主要还是靠汇编吧
不过jeb其实也差不多23333

180821 逆向-周练babyre+Retdec配置相关推荐

  1. 2018安恒杯10月月赛REamp;amp;MISC周周练

    十月月赛反正我是错过了,这次周周练有四道题来看看,菜鸡就该多学习 1.easytree 拖进linux,发现跑不起来,eng? file一下,结果发现是exe PEID查一下 upx壳,直接脱,拖进I ...

  2. 牛客算法周周练2 B Music Problem(DP,抽屉原理,二进制拆分)

    链接:https://ac.nowcoder.com/acm/contest/5203/B 来源:牛客网 题目描述 Listening to the music is relax, but for o ...

  3. 安恒赛php_安恒11月月赛周周练writeup

    前言 11月月赛 完美错过时间,正好有周周练,基本都是一样月赛的web,记录下write up 手速要快 这题是10月月赛中的一题,直接看我上次的writeup:安恒月赛(十)web-2题writeu ...

  4. App逆向 Frida - 夜神模拟器安装配置 基本使用

    App逆向 Frida - 夜神模拟器安装配置 基本使用 文章目录 App逆向 Frida - 夜神模拟器安装配置 基本使用 前言 一.Frida简单介绍? 1.Frida是什么 2.Frida原理( ...

  5. 崩坏3抽奖模拟html5,崩坏3崩坏周周练5月18日答案大全 夜隐重霞崩坏周周练答案汇总...

    崩坏3 大小: 角色养成 崩坏3崩坏周周练5月18日答案是什么?崩坏3在今天更新了崩坏周周练的题库,本期题目都围绕这"夜隐重霞"这个角色,对她不了解的玩家估计很难获得高分.下面就是 ...

  6. 组装一台多媒体计算机必须的部件,计算机基础知识试题8周周周练.doc

    计算机基础知识试题8周周周练.doc (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 城关中学对口升学班"计算机文化基础& ...

  7. 【C4D学习周练作业081-090】和吃的有关的东西渲染一定不能脏

    苦七君周练群作业展示 第81份作业 作者:Echo58o 练习练习 谢谢各位大佬的指导 barbiebo:椅子这个毛毛感觉加上反而差了一点点 张礼:光影不错,就是这桌椅素材有点简陋 sin30:构图可 ...

  8. 【C4D学习周练作业091-100】学了三个多月了 发现要学的越来越多-。-

    苦七君学习C4D周练群作业展示 第91份作业 作者:学3D的点点 汽车练习 3ds max+corona 背景是背板合成 标题 张礼:輪廓光啊,一定要亮起來啊~ヾ(⌐ ■_■) 苦七君:视角太远了看不 ...

  9. 2021-HUASACM第二周周练题解

    前言 新年快乐~ 这次是我们精心为你们准备的题目,题目难度没有很难.周练的目的是为了在学到一点知识的同时也让寒假在家对编程不那么陌生.好好享受吧~. A: abc-ABC 签到题,判断字符串是不是&q ...

最新文章

  1. Exchange Server 2016管理系列课件39.新建本地移动请求
  2. php oracle 删除 数据,oracle怎么清空表数据
  3. UEFI---(NT32)的第一个代码
  4. 对于已经做“大”了的企业,最需要什么?
  5. MySQL主从配置实战笔记
  6. LeetCode: Minimum Time Difference
  7. floquet端口x极化入射波_hfss和cst电磁媒质色散曲线dispersiondiagram研究方法.pdf
  8. 【教学类-07-02】20220330 5以内加减法不重复题 及生成word打印docx纸(方法二)(Python VS)
  9. 软件测试报告模板excel,测试报告模板,excel.docx
  10. 计算机软件工程专业大学排名专科,2020软件工程专业大学排名一览表
  11. python统计元音字母出现的次数,python统计元音字母个数 python输出元音字母
  12. 直播 | SDCC 2017 人工智能技术实战线上峰会
  13. 学习OpenCV3:创建一张空白的图片并画线
  14. 多维数组存储的两种方式
  15. 计算机c盘是内存还是外存,rom是内存还是外存?
  16. 从键盘读入学生成绩,找出最高分,并输出学生成绩等级,Java
  17. 【技术邻】搞热仿真离不开热电偶
  18. 基于深度卷积神经网络分割的飞机类型识别
  19. 外汇天眼:什么是外汇动量交易?新手指南
  20. Java 实现阿里云直播

热门文章

  1. 服务器错误数字(代码)对照表
  2. 百度鹰眼轨迹和虎鲸数据平台之浅谈
  3. 使用Python的Cufflinks库创建三维散点图
  4. python的math库函数汇总
  5. Java jcmd内存远大于top_Java堆外内存排查小结
  6. 通过Java生成.pfx(.p12)证书文件
  7. 家用电信光猫更换教程+设置路由模式
  8. Android-Glide使用
  9. 【Jmeter-脚本录制】
  10. Solidity基础教程2——Safemath