180308 逆向-Section加密(WhaleAndroid03)

54 篇文章 1 订阅

1625-5 王子昂 总结《2018年3月8日》 【连续第523天总结】
A. AndroidSection加密题目
B.
Android03

背景: 某企业反馈其员工专用手机上,被安装了一个间谍软件,该软件会不定期自动连接一个疑似黑客控制的服务器,服务器的连接密码内嵌在该软件中。
问题: 逆向分析此间谍软件,获取其服务器的连接密码。
FLAG格式为flag{xx}

首先反编译apk,观察整个程序框架
找到MainActivity的内部类的run

可以看到,连接的时候关键在于upload这个函数,其他都只是前端界面操作
于是找它,发现是native函数

private native int upload(String arg1) {
}

导入库是

static {
    System.loadLibrary("net");
}

解压apk得到libnet.so,拖入IDA进行反编译
发现一个提示

很关键,说明so文件的节区很可能被破坏了

反编译结果:

没有任何有用的东西,显然是加壳了
结合刚才的提示,搜索发现可能是section加密技术

它将加解密都放在.init_array段,这个最早执行的段中来初始化代码
不过无论加解密有多复杂,为了使Java层能够正常调用upload函数,都一定会出现这个字符串和函数,那么只需要动态调试就可以找到它啦

连接机器,下断,调试开始~

F9让程序跑起来以后
在Modules中搜索libnet即可找到需要的模块:
双击发现JNI_OnLoad

此时由于已经在运行中了,相关节区都已经是解密状态了
(然而dump下来并无法正确分析,猜测是ELF头被毁了)

于是只好在调试状态下进行分析咯:

一个FindClass,一个RegisterNatives,显然是动态注册的Native函数
查看该函数的说明

jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,
    jint nMethods)

正好对应,stru_5DF9911C就是JNINativeMetod结构体了
PS:刚开始IDA给我把它识别成一个函数sub_5DF9911C了,跳过去发现开头几个字符并不是常见汇编,于是undefine以后再导入结构体才正确识别

typedef struct {
    const char* name;
    const char* signature;
    void*       fnPtr;
} JNINativeMethod;


按照结构体可以发现,函数名为Upload,类型为(LjavaLangString;)I, 地址为sub_5E08230C+1

终于找到Natvie_Upload啦~快去分析吧
往下翻动过程中发现这里比较可疑

这种简单的异或加密大概率是字符串的处理
写一个简单的IDC将它们处理出来,得到几个字符串:

socket
hacker@China
pwn#Phone
connect
send
close

很明显,除了第2、3个以外都是API,应该是通过loadlibrary来导入函数,而第2、3个就是connect的参数–用户名和密码了

将第3个字符串输入,显示正确√

再往后有两段md5的内容,应该是在本地将用户名和密码哈希处理防止通过抓包泄露吧


C. 明日计划
android题目

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值