首页
论坛
专栏
课程

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

2019-6-25 11:59 2742

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

2019-6-25 11:59
2742

用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



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (1)
xmhwws 2019-6-25 12:08
2
0
感谢版主大大们,帮忙移动了帖子。Thanks♪(・ω・)ノ
最后于 2019-6-25 22:13 被xmhwws编辑 ,原因: Thanks♪(・ω・)ノ
游客
登录 | 注册 方可回帖
返回