首先反编译apk,观察整个程序框架
找到MainActivity的内部类的run
西普CTF-520app3-以夕阳落款

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

private native int upload(String arg1) {
}
  • 1
  • 2
  • 3

导入库是

static {
    System.loadLibrary("net");
}
  • 1
  • 2
  • 3
  • 4

解压apk得到libnet.so,拖入IDA进行反编译
发现一个提示
西普CTF-520app3-以夕阳落款
很关键,说明so文件的节区很可能被破坏了

反编译结果:

西普CTF-520app3-以夕阳落款

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

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

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

F9让程序跑起来以后
在Modules中搜索libnet即可找到需要的模块:
双击发现JNI_OnLoad
西普CTF-520app3-以夕阳落款
此时由于已经在运行中了,相关节区都已经是解密状态了
(然而dump下来并无法正确分析,猜测是ELF头被毁了)

于是只好在调试状态下进行分析咯:
西普CTF-520app3-以夕阳落款
一个FindClass,一个RegisterNatives,显然是动态注册的Native函数
查看该函数的说明

jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,
    jint nMethods)
  • 1
  • 2
  • 3

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

typedef struct {
    const char* name;
    const char* signature;
    void*       fnPtr;
} JNINativeMethod;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

西普CTF-520app3-以夕阳落款
按照结构体可以发现,函数名为Upload,类型为(LjavaLangString;)I, 地址为sub_5E08230C+1

终于找到Natvie_Upload啦~快去分析吧
往下翻动过程中发现这里比较可疑
西普CTF-520app3-以夕阳落款
这种简单的异或加密大概率是字符串的处理
写一个简单的IDC将它们处理出来,得到几个字符串:

socket
hacker@China
pwn#Phone
connect
send
close

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

Flag:

温馨提示: 此处内容需要评论本文后刷新才能查看,支付2元即可直接查看所有Flag。

小广告:关于获取西普实验吧所有Writeup请点击这里查看索引

查看所有Flag需要付费,需要获取所有Flag的童鞋请访问这里成为付费用户,可以自助把自己的注册邮箱加入网站白名单,即可免回复看到本站所有Flag

Flag大全地址:所有Flag

PS:本站不是实验吧的官方站点,纯粹是个人博客,收取Flag费用仅是维持服务器费用,做站不易,且行窃珍惜,如果喜欢我的博客,愿意捐赠的,可以扫描下面的二维码

微信二维码:
支付宝二维码: