一个ELF文件分析和逆向的过程

news2024/11/25 4:03:46

CrackMe1、2分析和逆向的过程

1. CrackMe1、2相关信息

CrackMe1

1、CrackMe1是一个ELF可执行文件,可在Android中独立执行

2、通过adb(Android SDK中默认带有adb工具)将CrackMe1 push到远程Android设备中,建议放在/data/local/tmp目录下

3、打开adb shell,执行su命令进入root权限的shell,使用“chmod 777 /data/local/tmp/CrackMe1”命令给予CrackMe1可执行权限

4、在shell中执行CrackMe1程序,提示"Input Your Answer"

5、输入正确字符串,回车,如果程序输出"True Answer"则表示通过,输出"Wrong Answer"则表示失败

CrackMe2(加壳反调试版本)

CrackMe2与CrackMe1相同,通过adb push到设备中输入正确的答案,如果程序输出"True Answer"则表示通过,输出"Wrong Answer"则表示失败,

CrackMe1

概述

本人首先是对该elf文件进行了简单的逆向分析,发现静态分析什么也看不出来,猜测应该是加了代码混淆,因此决定对该文件进行动态分析。

在配置好调试环境后,我使用ida对运行在安卓虚拟机上的CrackMe1进行动态调试。

在调试过程中,发现有另外的反调试程序阻止调试,以及有混淆密码。

最终通过修改反调试程序的代码以及加断点的方式。成功破解出正确的字符串为:GameSecurity,并成功通过程序测试。

image-20230213201241077

以下为详细的逆向分析过程。

CrackMe1逆向分析过程

静态分析

首先打开ida导入文件进行静态分析,发现main函数的反汇编结果逻辑并不清晰,应该是加了代码混淆。因此静态分析无法起到作用,应该进行动态调试。

image-20230213201409533

然后查看导入表中用到的函数

image-20230213201447533

推测程序可能是通过strncmp和strlen函数进行字符串判定的,因此准备在动态调试过程中为这两个函数下断点。

ida动态调试

在Android studio上安装arm架构的安卓虚拟机,然后在windows上配置adb,通过android_server作为桥梁进行远程调试,使用ida的Debugger的Attach to process功能附加到进程CrackMe1上进行远程调试。

image-20230213202104682

杀掉反调试程序

在调试过程中还有一个问题就是为上述推测的函数加断点后,在后续调试过程中程序会自动退出(有反调试程序),猜测是程序在运行时打开了某一程序进行反调试的检测。因此决定对linux下的open函数加断点(看是否在中间打开了某些进程)

open函数加断点

果然,程序继续运行后在open处断开,这时查看栈的参数,并查看对应的二进制代码,发现open函数确实调用了进程,也就是前面遇到的反调试程序

image-20230213202843204

可以看到open函数调用了proc/4821/status 程序阻止调试,因此在这里决定将其修改,以达到继续调试的目的。

将二进制代码随便做出修改,只要open函数无法调用即可。

image-20230213203035289

然后对strlen函数和strncmp函数加断点,继续运行程序。

strlen函数分析

首先程序在strlen函数处断开,查看相关寄存器的内容,看有没有疑似的可疑密码。

发现R4寄存器是我们输入的字符串111,R6寄存器是一串可疑的字符串。

R4

image-20230213203613063

R6

image-20230213203711759

然后在这里猜测是用strlen函数将这两个字符串长度做了对比,怀疑正确的字符串就是0wPBYEQGDjFOpeiKFxHqEQ== 。但是在验证后发现不对,因此只能再试一下strncmp函数。

strncmp函数分析

程序在strncmp处断开后,查看相应寄存器的内容。

发现R4寄存器中是我们输入的字符串111

image-20230213204206564

而R5寄存器中存放可疑字符串GameSecurity。

image-20230213204301542

于是猜测strncmp将这两个字符串进行比对,从而输出结果,因此猜测正确的字符串就是GameSecurity。

验证结果

在有了以上的判断之后,我重新打开程序,输入GameSecurity,这次果然验证通过。

正确的字符串就是GameSecurity。

image-20230213201241077

CrackMe2

概述

对于CrackMe2,分析起来并没有CrackMe1那么容易,在对其进行脱壳后,我用处理CrackMe1的方式处理CrackMe2。CrackMe2在脱壳后运行时会检测默认的23946端口进行反调试,在修改端口之后我按照CrackMe1的方式进行调试,发现除了CrackMe1的反调试程序之外,应该还有另外的手段进行反调试,导致我在输入字符串处和strncmp处所加断点无效,遗憾的是由于技术原因,我并没有找到另外的反调试手段,CrackMe2也没有破解出来,以下是我已经做出来的逆向分析过程。

CrackMe2逆向分析过程

脱壳

对于CrackMe2,首先我将CrackMe2在IDA中打开,对其进行静态分析,发现相较于CrackMe1, 静态分析结果缺少很多关键信息,例如导入表,因此猜测是进行了加壳处理。于是利用strings命令发现其确实加壳。

# 执行 strings CrackMe2

## 输出
UPX!
...//此处省略
...//此处省略
$Info: This file is packed with the UPX executable packer http://upx.sf.net $
$Id: UPX 3.95 Copyright (C) 1996-2018 the UPX Team. All Rights Reserved. $

可以看到其加了UPX 3.95的壳, 于是准备对其进行脱壳处理。

对文件进行脱壳处理

image-20230213193527912

静态分析

用ida打开脱壳后的文件,查看相应内容。

与1相同,其 main 函数仍然逻辑不太清晰,还是要进行动态调试

image-20230217231100358

查看其导入函数

image-20230217231135451

导入函数中多了popen 和 pclose函数 , 怀疑popen函数对该文件加了新的反调试。

IDA动态调试

android_server换端口

在按照CrackMe1中的方法用ida连接远程进程时,发现程序会自动退出,而如果不运行android_server进行连接,则程序正常。猜测是程序中有判断是否有远程连接的进程,因此决定修改android_server文件名,并修改监听端口。

我将push 到安卓虚拟机上的android_server文件改成server,并修改其监听端口为12345(原为23946),果然,程序正常运行,可以通过ida进行动态调试。

# 原来使用23946端口
adb forward tcp:23946 tcp:23946

#修改为12345端口
adb forward tcp:12345 tcp:12345

image-20230217232345820

在解决了这个问题后,我仍然像1中那样进行动态调试,在为open函数下断点,杀掉反调试程序后,我遇到一个跳不出来的死循环。

image-20230217233209612

在用IDA的F9跳出之后,程序直接退出,如果在printf函数、strncmp函数处下断点,程序直接跳到最后的printf函数,说明代码的逻辑直接跳过了strncmp函数,或者是根本没有用strncmp函数来比对。

于是我为scanf函数下断点,找到了存放输入的地址( 如下图 ),为该地址下断点,准备看是哪里用到了该地址,结果程序还是直接退出,并没有在该处断开,于是我判断是仍有反调试程序在阻止调试,我并没有完全杀掉反调试程序,在经过一番尝试后我还是没有找到继续调试的方法,于是CrackMe2只能到此为止。

image-20230220230706174

初步分析结果

相对CrackMe1,CrackMe2加了壳,并且在运行时会检测是否有远程调试(监听23946端口),并且相对于CrackMe1,除了使用open函数打开proc/4821/status 程序阻止调试外,应该还有另外的反调试程序,阻止动态调试,该程序在检测到有调试时会跳过strncmp的比较,导致我加断点并没有作用,并且我在输入的字符串处加的断点也没有作用。

有点遗憾,我并没有完成CrackMe2,不过还是尝试了一下,我觉得这个过程还是很有意义的。

时会检测是否有远程调试(监听23946端口),并且相对于CrackMe1,除了使用open函数打开proc/4821/status 程序阻止调试外,应该还有另外的反调试程序,阻止动态调试,该程序在检测到有调试时会跳过strncmp的比较,导致我加断点并没有作用,并且我在输入的字符串处加的断点也没有作用。

有点遗憾,我并没有完成CrackMe2,不过还是尝试了一下,我觉得这个过程还是很有意义的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、abort()R6010等故障模块排查及解决方法

一、常见故障介绍  最近在开发相机项目(项目细节由于公司保密就不介绍了),程序运行5个来月以来首次出现msvcr100.dll故障等问题,于是乎开始了分析之路,按照度娘上的一顿操作,期间也是出现了各种不一样的问…

Lombok常见用法总结

目录一、下载和安装二、常见注释(一)Data(二)Getter和Setter(三)NonNull和NotNull(不常用)(四)ToString(不常用)(五&#…

一款丧心病狂的API测试工具:Apifox!

你好,我是测试开发工程师——凡哥。欢迎和我交流测试领域相关问题(测试入门、技术、python交流都可以) 我们平时在做接口测试的时候,对于一些常用的接口测试工具的使用应该都非常熟悉了: 接口文档:Swagge…

Databend 开源周报 第 83 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.com 。Whats New探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。Support for WebHDFSHDFS 是大数…

ArrayList集合底层原理

ArrayList集合底层原理ArrayList集合底层原理1.介绍2.底层实现3.构造方法3.1集合的属性4.扩容机制5.其他方法6.总结ArrayList集合底层原理 1.介绍 ​ ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在 内的所有元素。 每个 Array…

静态库和动态库的打包与使用

静态库和动态库 静态库和动态库的打包 生成可执行程序时链接使用 运行可执行程序时加载使用 提前声明,笔者示例的文件有mian.c/child.c/child.h。OK,我们先了解一下,库文件是什么?它其实就是打包了一堆实现常用功能的代码文件. ⭐…

Python之re库用法细讲

文章目录前言一、使用 re 模块的前期准备工作二、使用 re 模块匹配字符串1. 使用 match() 方法进行匹配2. 使用 search() 方法进行匹配3. 使用 findall() 方法进行匹配三、使用 re 模块替换字符串四、使用 re 模块分割字符串总结前言 在之前的博客中我们学习了【正则表达式】的…

C++ typedef用法详解

typedef的4种常见用法:给已定义的变量类型起个别名定义函数指针类型定义数组指针类型为复杂的声明定义一个新的简单的别名总结一句话:“加不加typedef,类型是一样的",这句话可以这样理解:没加typedef之前如果是个…

云原生架构设计原则及典型技术

云原生是面向云应用设计的一种思想理念,充分发挥云效能的最佳实践路径,帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升交付效率,降低运维复杂度。代表技术包括不可变基础设施、服务网格、声明式 API 及 Serverless 等…

Apk加固后多渠道打包

之前一直使用360加固宝进行apk的加固打包,可以一键加固并打多渠道打包。但是,现在360加固宝收费了,在进行加固,多渠道打包,就得一步一步自己操作了,会很繁琐。所以,本文使用 360加固美团Wallet …

c++11 标准模板(STL)(std::unordered_map)(五)

定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…

Java开发 - 单点登录初体验(Spring Security + JWT)

目录​​​​​​​ 前言 为什么要登录 登录的种类 Cookie-Session Cookie-Session-local storage JWT令牌 几种登陆总结 用户身份认证与授权 创建工程 添加依赖 启动项目 Bcrypt算法的工具 创建VO模型类 创建接口文件 创建XML文件 补充配置 添加依赖 添加配…

凭一部手机,7天赚20万?会剪辑的人有多吃香!

影视剪辑容易遇到哪些问题&#xff1a; 1、视频格式格式不对&#xff0c;剪辑软件不支持&#xff1b; 2、视频封面不会做&#xff1b; 3、PR导出视频时&#xff0c;没办法做其他事&#xff0c;效率不高&#xff1b; 4、自己配音不好听&#xff0c;配音软件又不好找&#xff1b;…

第14章 局部波动率模型

这学期会时不时更新一下伊曼纽尔德曼&#xff08;Emanuel Derman&#xff09; 教授与迈克尔B.米勒&#xff08;Michael B. Miller&#xff09;的《The Volatility Smile》这本书&#xff0c;本意是协助导师课程需要&#xff0c;发在这里有意的朋友们可以学习一下&#xff0c;思…

影响redis性能的一些潜在因素

影响 Redis 性能的 5 大方面的潜在因素&#xff0c;分别是&#xff1a; Redis 内部的阻塞式操作&#xff1b; CPU 核和 NUMA 架构的影响&#xff1b; Redis 关键系统配置&#xff1b; Redis 内存碎片&#xff1b; Redis 缓冲区。 先学习了解下 Redis 内部的阻塞式操作以及应对的…

【数据架构系列-03】数据仓库、大数据平台、数据中台... 我不太认同《DataFun数据智能知识地图》中的定义

关注DataFunTalk有2年多了&#xff0c;DataFun确实像创始人王大川讲的那样&#xff0c;践行选择、努力和利他原则&#xff0c;专注于大数据、人工智能技术应用的分享与交流&#xff0c;秉承着开源开放的精神&#xff0c;免费的共享了很多有营养的行业实践专业知识&#xff0c;对…

1.win10环境搭建Elasticsearch7.2.0环境

环境介绍jdk1.8安装Elasticsearch7.2.0下载安装包直接解压进入到bin目录&#xff0c;双击elasticsearch.bates启动成功访问http://localhost:9200/jdk版本1.8,很有可能因为jdk版本的问题es启动失败支持连接https://www.elastic.co/cn/support/matrix#matrix_jvm安装Kibana7.2.0…

云计算介绍,让你更了解云计算

同学们好&#xff01; 第一次接触IT行业吗&#xff1f;没关系&#xff0c;看完这篇文章肯定会让你不再陌生。给自己几分钟时间&#xff0c;认真看完哦&#xff01; 1、不知道什么是云计算&#xff1f; 网络计算云计算 官方定义是&#xff1a;通过网络提供可伸缩的分布式计算…

建立相关在线社群的3个简单步骤

在线社群管理和社交媒体营销通常被视为一回事。虽然社群管理确实是社交媒体营销的一个关键部分&#xff0c;但它的意义超越了社交媒体的内容发布。因此&#xff0c;在线社群对于企业的数字营销十分重要。创建、维护和发展社群不是一件容易的工作&#xff0c;也不是一个快速的过…

枚举学习贴

1. 概述 1.1 是什么 枚举对应英文(enumeration, 简写 enum)枚举是一组常量的集合。可以这里理解&#xff1a;枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 1.2 枚举的二种实现方式 自定义类实现枚举使用 enum 关键字实现枚举 1.3 什么时候用 存在有限…