macOS逆向-如何分析macOS软件
macOS逆向-如何分析macOS软件
0x00 前言:
完事开头难。许多希望学习逆向工程的朋友通常在网上翻看了许多相关的博客和教程之后仍会觉得无从下手,《macOS软件安全与逆向分析》上的第一章将会带我们从头开始搭建一个最简单的分析环境,引导你自己动手写一个简单的CrackMe并破解它。
0x01 分析环境搭建:
首先,我们需要一个编译器来编译代码, 目前在macOS系统上最流行的编译器自然是鼎鼎大名的Clang。
安装Clang
Clang是苹果公司开源项目LLVM中的一部分,是属于LLVM的一个前端,其中LLVM的官网为:http://www.llvm.org。
其实我们安装过Xcode的话,就已经自带了LLVM,你可以在命令行中运行clang -v查看是否有安装llvm。

假如,你还没有安装那么请在AppStore中安装Xcode即可。

安装Radare2
关于HT Editor
我这里和书本中的不同,书上写着是让你安装HT Editor,可是我实践下来发现HT Editor一点都不好用,可能作者写这本《macOS软件安全与逆向分析》书本的时候,年代还比较久远,可能那时候流行这个工具,反正结论就是HT Editor不好用,而且有Bug不支持显示中文。
什么是Radare2
什么是Radare2?
Radare2是一个命令行框架工具,他主要用于取证、逆向分析,他里面包含了很多其他的命令行小工具。
比如他可以进行反汇编、动态调试、Hash计算、Shellcode生成、文件格式查看、文件比较、字符串搜索等等。
Radare2的手动安装
radare2的官网是:https://www.radare.org/n/,官网上介绍的安装方式是让你从源码中构建。
git clone https://github.com/radareorg/radare2
cd radare2
sys/install.sh
#如果构建失败
sudo make purge
rm -rf shlr/capstone
git clean -xdf
git reset --hard @~50
sys/install.sh

测试radare2是否安装成功
Radare2 装好后,运行radare2 -h是否安装成功。

0x02 第一个macOS程序
目前我们已经安装好了编译环境,也装好了一个简单逆向分析的环境,那么接下来我们就要和CTF一样,来写一个简单的Crackme来实践了,源码非常简单是用纯C写的检测数字是否正确的程序。
#include <stdio.h>
int main()
{
int secret = 0;
printf("Please input the secret number:");
scanf("%d",&secret);
if(secret != 123)
{
printf("error secret number!\n");
return 0;
}
printf("Success!");
}
然后我们用clang crackme.c来进行编译,将程序编译成MachO可执行文件,程序运行后会提示你输入一个数字,如果输入的不是123就会提示你error secret number!,输入是123就会提示Success!。
clang crackme.c -o crackme
➜ ./crackme
Please input the secret number:1
error secret number!
0x03 破解Crackme
我们需要来破解这Crackme,当我们输入任何数的时候都显示Success!,所以我们需要将它逻辑修改掉。
这里我们就用Radare2来演示,而切入点就是字符串error secret number!,然后根据字符串再找到对应的判断逻辑的汇编代码,将汇编代码逻辑修改掉即可。具体Radare2的一些用法可以参考此篇文章:https://blog.csdn.net/qq_31507523/article/details/117200476
➜ r2 crackme
-- Are you still there?
[0x100003ed0]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for objc references (aao)
[x] Finding and parsing C++ vtables (avrr)
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information (aanr)
[x] Use -AA or aaaa to perform additional experimental analysis.
[0x100003ed0]> axt @@ str.* #这里的命令就是列出crackme里面的所有调用到的字符串。
[0x100003ed0]> s 0x100003f2a #跳转到调用Success这字符串的地址这
[0x100003f2a]> pdf #查看当前地址所在的汇编代码


从箭头处我们可以看到,他是从je 0x100003f2a,这一处汇编代码中跳过来的,他上面一句是cmp dword [var_8h],0x7b,对应的意思是比较var_8中输入的值是否等于123,如果是则跳转到Success!处,我们要破解的话就可以改成条件不成立也可以调过来即修改je 0x100003f2a -> jne 0x100003f2a。
打补丁
OK现在我们知道修改哪个地方0x100003f0a,修改成什么汇编代码jne 0x100003f2a,就能达到补丁的目的了,但是直接改汇编好像在IDA中用Keypatch插件可以实现,ps:(IDA后面会介绍,是一款很强大的反汇编、反编译、静态分析软件),那么目前我对radare2掌握还不是很熟悉,我目前只能通过修改OPCODE(机器码)的方式来达到打补丁的效果。
je->jne
je改成jne只需要将0x84修改成0x85即可,具体可以查看https://asmjit.com/asmgrid/ 该网站对应指令的opcode。


用radare2修改
在radare2下要打补丁一个程序,用-w参数打开程序即可。
➜ r2 -w crackme
-- When can we have an official anime mascot for radare2?
[0x100003ed0]>s 0x100003f0b #跳转需要打补丁出的地址
[0x100003f0b]>px 10 #用十六进制方式显示当前地址 10个字节数据
[0x100003f0b]>wx 85 #打补丁

修改前后对比:


0x04 验证crackme
最后运行crackme来验证下。

Pwn菜鸡学习小分队
欢迎来PWN菜鸡小分队闲聊:PWN、RE 或者摸鱼小技巧。

macOS逆向-如何分析macOS软件的更多相关文章
- 逆向与分析-WebBrowserPassView消息分析
逆向与分析-WebBrowserPassView消息分析 这个的源头是之前我写的一个博客: http://blog.csdn.net/u013761036/article/details/730427 ...
- 软件-分布式:Kylin (apache开源分布式分析引擎软件)
ylbtech-软件-分布式:Kylin (apache开源分布式分析引擎软件) Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以 ...
- 推荐一个MacOS苹果电脑系统解压缩软件
废话少说,直入主题: 连接:https://www.keka.io/en/ 开源免费好用(个人觉得比betterzip好用哈),附一张这货的图标:
- macOS免费的NTFS读写软件
Mounty for Mac brew cask install mounty
- CrackMe005-下篇 | 逆向破解分析 | 160个CrackMe(视频+图文)深度解析系列
作者:逆向驿站微信公众号:逆向驿站知乎:逆向驿站 CrackMe005,上篇说了具体方法,下篇来发逆向分析过程,看看老夫是如何得到上篇的具体方法的! 准备 [环境和工具] win7/xp虚拟机环境 C ...
- 如果将 macOS Mojave 降级为 macOS Sierra 或者更低版本
当前系统是10.14,我想装回10.11 办法: 1. 下载10.11, 我是从themacgo网站下载的 https://themacgo.com/macos-sierra-10-12-1-dmg- ...
- 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)
邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...
- android逆向代码分析截图
- ahp层次分析法软件
http://www.jz5u.com/Soft/trade/Other/58808.html 权重计算 归一化 本组当前数 - 本组最小 / 本组最大-本组最小 http://blog.csdn.n ...
随机推荐
- Redis小秘密
Redis小秘密 临渊羡鱼,不如退而织网. 一.Redis基本数据类型 想必很多人都能脱口而出String.List.Hash.Sorted Set和Set五种基本数据类型. 以及五大基本数据类型简要 ...
- 从.net开发做到云原生运维(零)——序
1. 为什么要写这个系列的文章 大家看到标题的时候肯定会感觉到困惑,这个标题里的两件事物好像并不是很搭.说到.net开发大家一般都会想到asp.net做网站,或者是wpf和winform这类桌面开发, ...
- 【转】浅谈 Integer 类
突然发现自己对Integer i = 10;这种语法不太明白,于是乎有了这篇文章,那么在讲解 Integer 之前,我们先看下面这段代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- 还在被数据分析报告折磨?Smartbi让你解放双手
数据分析报告贯穿了企业经营的时时刻刻,方方面面. 数据分析报告最常用于汇报分享:团队需要分享.沟通,数据分析师需要洞察数据.分析结果分享给企业领导.团队同事.大众媒体及更多的利益相关方. 数据分析报告 ...
- springMVC 调查问卷系统 record
Maven下的依赖包有两个 spring-web和springWebMVC springwebMVC包含spring-web依赖, 但是spring-web的等级大于Spring-webmvc 没有 ...
- 携程applo配置
1.官网文档 https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C% ...
- docker学习笔记(3)——联合文件系统与数据卷
参考资料: 1.官网教程:https://docs.docker.com/reference/ 2.视频教程:https://www.bilibili.com/video/BV1og4y1q7M4?t ...
- python刷剑指offer(21-40)(一刷)
21.输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- python hex转flaot
在使用树莓派 modbus-tk 读取寄存器值后,得到的4byte值存为了元组,想将该数据转化为float,习惯了c的用法,转到python时,数据转换这一块一头雾水,经过多次尝试最终实现.记录一下: ...
- Laravel-Auth认证
1.建立数据表 admins 2.找到config下的auth.php 文件,加入如下代码 <?php return [ /* |-------------------------------- ...