约宝妹解题尝试

##基础题
安全宝情人节一个活动,算是ctf相关吧。
Q1Q2略过
Q3:在源码的js中找到flag:wo ai anquanbao
Q4:值得一提

A picture
打开调试,有一个请求:
http://yuebaomei.com/show.php?p=dGlzaGkucG5n

参数p的值猜测由base64加密
dGlzaGkucG5n => tishi.png
yuehui.png => eXVlaHVpLnBuZw==

访问http://yuebaomei.com/show.php?p=eXVlaHVpLnBuZw==即可

##附加题

###A. Android通关

说起来真的是一波三折
首先这是一个搭积木的游戏,一共有100关,通过最后一关即可得到key

当时下载下来用apktool反编译失败,隐约觉得是版本低了,于是找新的版本,然后就没有然后了。
过了些时间用新版本重新反编译,然后在JoyStacker/assets/level/中xml文件全部用第一关的xml覆盖,这样所有关卡就变为同一个最简单的关卡了。

1
2
3
4
5
6
#! /bin/bash
content=`cat 1.xml`
for file in `ls *.xml`
do
echo $content > $file
done

然后重新打包,签名,安装,接下来就可以手动刷过了
为什么这么麻烦呢?
因为笔者使用 Linux(openSuSE 13.1) 虚拟机安装不成功,手机又不想 root,也看不到应用的文件夹(~_~)

参考 writeup 知道每一关的数据保存在 /data/data/com.rayx.stacker/shared_prefs/s.xml 中
用过第一关,然后用第一关的数据伪造其他关的内容即可。

但是。。。手机没 root 啊,adb push 没有权限,于是我就想办法,一查可以这样:run-as com.rayx.stacker
提示 run-as: Package 'com.rayx.stacker' is unknown

再一查,这是一个bug NDK debugging does not start: “package is unknown”, 无果。

###B. SQL注入

不会。。。。

###C. PHP代码审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$flag = "THIS IS FLAG";

if ("POST" == $_SERVER['REQUEST_METHOD']){
$password = $_POST['password'];
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)){
echo 'Wrong Format';
exit;
}

while (TRUE){
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr))
break;

$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower');
foreach ($ps as $pt){
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}

if ($c < 3) break;
if ("42" == $password) echo $flag;
else echo 'Wrong password';
exit;
}
}
?>

要求参数password的值

  1. 必须满足12位以上字符
  2. 必须是非空格非TAB之外的内容
  3. 然后是password要有大小写数字,字符,而且匹配到的次数要不小于6次
  4. 最后的考点是:if ("42" == $password) echo $flag;

这里考察PHP的弱类型匹配,可以想办法构造如下:

  • 42.00e+00000000000
  • +42.0000000000e0
  • 420.000000000e-1

参考链接:
安全宝「约宝妹」android通关CTF题解
约宝妹Android题破解思路
在非root android手机上访问/data/data/com.*目录
NDK debugging does not start: “package is unknown”