首页
社区
课程
招聘
[原创]2019看雪CTF 第五题 丛林的秘密
2019-6-25 11:59 10168

[原创]2019看雪CTF 第五题 丛林的秘密

2019-6-25 11:59
10168

用jadx打开apk


很明显gogogoJNI.check_key()返回值为1是我们想要的

查看check_key(),是个native方法,需要分析so


其中sayHello()返回值为http://127.0.0.1:8000(分析so得到的)


IDA打开so,找到check_key


发现该函数只要输入值不为空,就返回1,明显是故意放出来,混肴我们视线的。


众所周知,so是先加载.init、init_array、JNI_OnLoad(),一个个查看分析


发现JNI_OnLoad()最终调用了inti_proc()

查看inti_proc(),socket和创建线程引起我的注意


进入nullsub_()函数


很明显,是个网页,mm0为关键

右击mm0,查找引用,发现inti_proc()一开始做了些事情


手动导出解密一下mm0处的数据,发现是个html。对其进行分析,发现关键点——check_key()


再仔细看了一下,呵,居然是披着html皮的WASM文件!

主要逻辑在WebAssembly中, 保存下来用wasm2c反编译成c代码,使用gcc编译获得中间文件dump.o,将dump.o拖入ida进行分析。

wasm2c链接:https://github.com/WebAssembly/wabt/releases

wasm2c dump.wasm -o dump.c


找到check_key(),代码如下:

__int64 check_key()
{
  int ret; 
   
  if ( ++wasm_rt_call_stack_depth > 0x1F4u )
    wasm_rt_trap(7);
  o(1024, 1025, 1026, 1027);
  oo(1028, 1029, 1030, 1031);
  ooo(1032, 1033, 1034, 1035);
  oooo(1036, 1037, 1038, 1039);
  ooooo(1040, 1041, 1042, 1043);
  oooooo(1044, 1045, 1046, 1047);
  ooooooo(1048, 1049, 1050, 1051);
  oooooooo(1052, 1053, 1054, 1055);
  ret = xxx();
  --wasm_rt_call_stack_depth;
  return ret;
}

几个o函数做了一些异或,xxx函数是解方程组,然后异或一下。

使用z3,整理一下得到答案:K9nXu3_2o1q2_w3bassembly_r3vers3


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 6266
活跃值: (1276)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xmhwws 2019-6-25 12:08
2
0
感谢版主大大们,帮忙移动了帖子。Thanks♪(・ω・)ノ
最后于 2019-6-25 22:13 被xmhwws编辑 ,原因: Thanks♪(・ω・)ノ
雪    币: 2663
活跃值: (5215)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
YenKoc 2 2020-12-11 13:16
3
0
大佬,请问下如何正确的将wasm源码换成wasm文件呢,我winhex打包出来,wasmc一直报错,0002b0a: error: unable to read u32 leb128: string length,求大佬解答,谢谢
游客
登录 | 注册 方可回帖
返回