Category Archives: reverse engnieering

Solve the White Rabbit CrackMe

Crackme文件可以从此处下载: White Rabbit crackme! 因为crackme里稍微使用了混淆和一些像恶意程序的把戏, 所以可能会被一些杀毒软件标记为恶意程序, 所以也建议在虚拟机下运行. 这个crackme运行的截图如下: OK, 首先要做的第一件事就是将其载入到IDA中(我这里使用的是刚刚发布的IDA 7的免费版本). 通过搜索字符串Password#1来看它的交叉引用以及前后都发生了些什么. 就这了! 我们可以看到它被sub_4034D0所引用. 现在我们将跟随到引用处, 来看看接下来发生什么 在sub_403D90中有一些初始化操作, 随后在sub_404150的结果与可疑值0x57585384的比较后又一个分支跳转. 子分支中的sub_403990输出了一些提示语以及后续一些有关接受用户输入的内容. 我们首先来看初始化部分(sub_403D90): 函数取了两个参数, 内容看上去也非常清楚: 通过给出的标识符查找资源文件, 加载资源文件, 确定它的文件大小, 然后申请内存空间并将资源文件的数据复制进去. 该函数返回那个新申请的内存空间的指针, 并将资源文件的大小存储在第一个参数中. 现在我们唯一需要注意的就是图中的sub_406A70, 它取了3个参数(target pointer, source pointer 以及 data size)并且看起来非常像是memcpy(或memmove, 是哪个不重要, 因为内存区域没有重叠). 但是函数内的代码却包含有大量的分支, 难以分析. … Continue reading

Posted in reverse engnieering | Leave a comment

Intro to unicorn engine

什么是Unicorn引擎 Unicorn是一个轻量级, 多平台, 多架构的CPU模拟器框架. 我们可以更好地关注CPU操作, 忽略机器设备的差异. 想象一下, 我们可以将其应用于这些情景: 比如我们单纯只是需要模拟代码的执行而非需要一个真的CPU去完成那些操作, 又或者想要更安全地分析恶意代码, 检测病毒特征, 或者想要在逆向过程中验证某些代码的含义. 使用CPU模拟器可以很好地帮助我们提供便捷. 它的亮点(这也归功于Unicorn是基于qemu而开发的)有: 支持多种架构: Arm, Arm64 (Armv8), M68K, Mips, Sparc, & X86 (include X86_64). 对Windows和*nix系统(已确认包含Mac OSX, Linux, *BSD & Solaris)的原生支持 具有平台独立且简洁易于使用的API 使用JIT编译技术, 性能表现优异 你可以在Black Hat USA 2015获悉有关Unicorn引擎的更多技术细节. Github项目主页: unicorn … Continue reading

Posted in reverse engnieering | Leave a comment

The structure of .pyc files

原文链接: The structure of .pyc files 简单来说, 一个pyc文件包含以下三块 * 一个4字节的魔数(magic number) * 一个4直接的修改时间戳(modification timestamp) * 一个编排过的代码对象 对于各个版本的python解释器, magic number都各不相同, 对于python 2.5则是b3f20d0a 修改时间戳则是源文件生成.pyc文件的Unix修改时间戳, 当源文件改变的时候, 该值也会变化 整个文件剩下的部分则是在编译源文件产生的代码对象编排后的输出. marshal跟python的pickle类似, 它对python对象进行序列化操作. 不过marshal和pickle的目标不同. pickle目的在于产生一个持久的独立于版本的序列化, 而marshal则是为了短暂地序列化对象, 因此它的表示会随着python版本二改变. 而且, pickle被设计用于适用用户定义的类型, 而marshal这时用于处理python内部类型的复杂结构 marshal的特性给出了pyc文件的重要特征: 它对平台独立, 但依赖于python版本. 一个2.4版本的pyc文件不能在2.5版本下执行, 但是它可以很好地移植到不同操作系统里. 接下来的部分也简单: … Continue reading

Posted in reverse engnieering | Leave a comment

使用WinAppDbg解决Flareon第3题

本文已发表在看雪论坛, 详情可见: https://bbs.pediy.com/thread-223525.htm 文章作者: Parsia’s Den 博客地址: https://parsiya.net/ 原文链接: WinAppDbg – Part 4 – Bruteforcing FlareOn 2017 – Challenge 3 翻译前言: 这是解决Flareon4第3题的第4种方法, 也是这个系列翻译的完结篇. 作者用的WinAppDbg跟ODScript有类似的感觉, 虽然不及之前2篇让人耳目一新, 但这是作者对于WinAppDbg写的简易教程的第4篇, 如果感兴趣可以点击原文链接从其它3篇WinAppDbg的教程开始阅读. 文中分析的程序你可以点击此处下载: greek_to_me.zip, 解压密码: www.pediy.com 如果朋友想看我之前翻译的用其他3种全新的方法解决该题的文章, 可以点击以下链接: Flareon challenge 4 第3题 使用libPeConv来解决Flareon4题目3 使用Angr解决Flareon4题目3 侦查 … Continue reading

Posted in reverse engnieering | Leave a comment

使用Angr解决Flareon4题目3

本文已发表在看雪论坛, 详情可见: https://bbs.pediy.com/thread-223512.htm 文章作者: XOR Hex 博客地址: https://blog.xorhex.com/ 原文链接: Flare-On 2017: Challenge 3 翻译前言: 这是解决Flareon4第3题的第3种方法. 文章中使用angr编写python脚本来获得flag, 对比之前我翻译的使用Unicorn框架的文章里的代码, 对于刚接触Angr或Unicorn的朋友会有不少帮助. 文中分析的程序你可以点击此处下载: greek_to_me.zip, 解压密码: www.pediy.com 准备 我们用IDA打开文件并调到入口点, 入口点简单地调用了函数sub_401008 我们打开这个函数看看, 向下滚动我们可以看到看起来像成功提示的文本字符串, 接下来的标准流程就是找寻成功的分支. 从字符串往回分析, 我们发现一个在0x40105E处的比较, eax跟值0xFB5E进行比较. 如果eax匹配成功, 那么随后程序就会继续执行成功分支. 所以我们该如何满足这个匹配呢? 来看看sub_4011E6函数内部. 我们看到一堆的mov,add,shl和shr指令, 这可能是某种形式的混淆. 让我们看看传入进函数的参数: .text:00401047 mov … Continue reading

Posted in reverse engnieering | Leave a comment

使用libPeConv来解决Flareon4第3题

本文已发表在看雪论坛, 详情可见: https://bbs.pediy.com/thread-223494.htm 文章作者: hasherezade(@hasherezade) 原文链接: Import all the things! Solving FlareOn4 Challenge 3 with libPeConv 翻译前言: 虽然依旧是Flareon4第3题的分析,但是一道题的解决方法多种多样,这次给大家分享如何使用libPeConv来解决问题,又可以get到新姿势啦 libPeConv: 是作者hasherezade开发的用于加载和转换PE文件的库,github仓库地址是:libpeconv 文中分析的程序你可以点击此处下载: greek_to_me.zip, 解压密码: www.pediy.com 总览 题目greek_to_me.exe是一个32位PE文件, 程序已经剔除了重定位信息. 我们以下就简称该程序为crackme 我们运行crackme, 只有一个空白的控制台程序, 并且没有从标准输入中读取任何数据, 所以我们可以推断程序是使用了一些其他方式来读取用户的password 我们使用IDA静态分析, crackme结构非常简洁并没有混淆过. 我们可以在代码开头看见程序创建了一个socket并等待着输入 socket监听着本地2222端口 在建立连接后, crackme从用户输入中取前4字节读入到缓冲区中: 读入4字节后, crackme开始处理输入并用来解码已加密的缓冲区数据 … Continue reading

Posted in reverse engnieering | Leave a comment