吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7471|回复: 8
收起左侧

[Android CTF] ddctf-android 2题

[复制链接]
红心J 发表于 2017-9-13 20:41
本帖最后由 红心J 于 2017-9-13 20:50 编辑

注:题的链接在帖子最后
1,
一个apk程序,先装上看看。破解密码的,随便输试试。

1.png
拖入改之理看看

2.png
我们目标就是拿到藏在程序中的 flag,这个文件名就是 flagapp,在一看 smali 代码有个 Corret,打开java源码看看

3.png

java代码一看就非常清楚了。
我们想要的 flag 就是 arrayOfByte2 里面的内容,也就是  private String i() 这个函数的返回值。
那么,下面就看 arrayOfByte2 是经过了怎样的变换。
只关心String i()函数, 一行一行的来看看

private String i()
  {
    int i = 0;
    byte[] arrayOfByte1 = new byte[p.length];  //创建byte数组,长度是 p 这个数组的长度。
    for (int j = 0; j < arrayOfByte1.length; j++) {   
      arrayOfByte1[j] = ((byte)(byte)(p[j] ^ q[j]));  // 把 p,q2个数组异或 ,再赋值给arrayOfByte1
    }
    int k = arrayOfByte1[0];                             // 取arrayOfByte1的第一个元素,赋给变量 k
    for (j = 0; arrayOfByte1[(k + j)] != 0; j++) {} //这个for循环就是为了确定 j 的值
    byte[] arrayOfByte2 = new byte[j];          // 由上面确定的 j 的值,来创建一个长度为 j 的数组。
    while (i < j)
    {
      arrayOfByte2 = ((byte)arrayOfByte1[(k + i)]);        //把 arrayOfByte1 特定部分赋值给 arrayOfByte2
      i++;
    }
    return new String(arrayOfByte2);
  }

差不多代码的执行过程清楚了,来写下我们的代码,直接顺着它的这个 String i()函数写就行,它里面的byte数组,我用char型数组代替了。下面附上自己的C++代码。

#include <iostream>
#include <string>
#include <math.h>

using namespace std;
template <class T>

int getArrayLen(T& array)

{//使用模板定义一 个函数getArrayLen,该函数将返回数组array的长度

return (sizeof(array) / sizeof(array[0]));

}
void main()
{

        char p[] = { -40, -62, 107, 66, -126, 103, -56, 77, 122, -107, -24, -127, 72, -63, -98, 64, -24, -5, -49, -26, 79, -70, -26, -81, 120, 25, 111, -100, -23, -9, 122, -35, 66, -50, -116, 3, -72, 102, -45, -85, 0, 126, -34, 62, 83, -34, 48, -111, 61, -9, -51, 114, 20, 81, -126, -18, 27, -115, -76, -116, -48, -118, -10, -102, -106, 113, -104, 98, -109, 74, 48, 47, -100, -88, 121, 22, -63, -32, -20, -41, -27, -20, -118, 100, -76, 70, -49, -39, -27, -106, -13, -108, 115, -87, -1, -22, -53, 21, -100, 124, -95, -40, 62, -69, 29, 56, -53, 85, -48, 25, 37, -78, 11, -110, -24, -120, -82, 6, -94, -101 };
        char q[] = { -57, -90, 53, -71, -117, 98, 62, 98, 101, -96, 36, 110, 77, -83, -121, 2, -48, 94, -106, -56, -49, -80, -1, 83, 75, 66, -44, 74, 2, -36, -42, -103, 6, -115, -40, 69, -107, 85, -78, -49, 54, 78, -26, 15, 98, -70, 8, -90, 94, -61, -84, 64, 112, 51, -29, -34, 126, -21, -126, -71, -31, -24, -60, -2, -81, 66, -84, 85, -91, 10, 84, 70, -8, -63, 26, 126, -76, -104, -123, -71, -126, -62, -23, 11, -39, 70, 14, 59, -101, -39, -124, 91, -109, 102, -49, 21, 105, 0, 37, -128, -57, 117, 110, -115, -86, 56, 25, -46, -55, 7, -125, 109, 76, 104, -15, 82, -53, 18, -28, -24 };


        int i = 0;

        char arrayOfByte1[120];
        for(int j=0; j < getArrayLen(p) ; j++)
        {
                arrayOfByte1[j] =(char)(p[j]^q[j]);
        }

//        cout <<getArrayLen(p)<<endl;
//        cout <<arrayOfByte1<<endl;

        int k = arrayOfByte1[0];
        for (j = 0; arrayOfByte1[(k + j)] != 0; j++) {}

//        cout << j <<endl;   确定 j 的值

        char arrayOfByte2[1000];   // 写代码的时候不知道数组有多长,直接写大点就行了。
        while (i < j)
    {
      arrayOfByte2 = arrayOfByte1[(k + i)];
      i++;
    }
        string result;
        result = arrayOfByte2;

        cout << result <<endl;

        return ;
}

4.png
flag 就是前面那串邮箱了。

5.png
-------------------------------------------------------------------------------------------
2,
DDCTF第4题
一个Apk文件,一个Readme.txt,没啥好看的,就是题目的要求。

1.png
下面开始做题。
拿到题先安装上看看,
2.png

拖入改之理进行反编译,然后搜索 Wrong

3.png
去到红框中的地方,然后打开 Java 源码看看。

4.png
mFlagEntryView.getText().toString().equals(stringFromJNI())
//获取我们的输入,变成字符串,然后与 stringFromJNI()函数的东西进行比较。


关键函数是 stringFromJNI(),在native层,调用了so库,下面就去分析相关的库。
把 文件后缀改成 rar,解压出来。
5.png

so库都放在lib文件里,打开它。

6.png
发现有这么多个文件,简单说一下。
上面这些文件夹里都存放着程序引入的第三方库,也就是 .so 文件。
mips、armeabi、armeabi-v7a和x86都表示CPU的类型。一般的手机或平板都是用arm的cpu。不同的cpu的特性不一样。
armeabi  是针对普通的或旧的arm v5 cpu,32位
armeabi-v7a 是针对有浮点运算或高级扩展功能的arm v7 cpu,32位
arm64-v8a 针对64位的
mips  是一种采取精简指令集(RISC)的处理器架构,32位
mips64  64位
x86   IA-32位指令集
x86_64  64位
-----------------------
我之前做的时候,分析了x86,和x86_64的,但是没有弄出来。然后去看的 armeabi 下的

7.png
直接把 hello-libs.so 拖入IDA里,下面红框那个函数,就是我们要找的 stringFromJNI()

8.png
点过去,f5大法,看看ida翻译出的代码。

9.png
Int a1 这里改一下,应该是个JNI指针,修改为 JNIEnv *a1。

10.png
在来看一下。那么需要关注的地方,就是那个红框。返回的是 result,result 与 v4有关,那么关键的位置就是j_j_j__Z21__aeabi_wind_cpp_pr45Pc(&v4)

11.png

双击 j_j_j__Z21__aeabi_wind_cpp_pr45Pc(&v4)    这个函数,发现下面还有调用,在双击...一直跟进,去到最后的代码位置。

12.png
这里就是算法的代码。
看到有个长度为 184 的char型数组 v8
13.png
上面这个就是异或操作,放在 do while循环里面:byte_7A2 ^ byte_6EC,且都是182位的。
双击看看 byte_7A2 和 byte_6EC 数组

14.png 15.png

好了,下面不多说,贴一张我写的注释。
16.png

附上写的py代码:
b=[0xE1, 0xA1, 1, 0xE4, 0x82, 0x56, 0x9D, 0x70, 0xD9,
0xF5, 8, 0x10, 0x22, 0xA7, 0x2D, 0x2B, 0x41, 0xF0,
0xBD, 0xA4, 0x67, 0x3D, 0x9A, 0x20, 0xB9, 0xFB, 0x11,
0xD3, 0xAD, 0xB3, 0x39, 0x89, 4, 0xE3, 0xBF, 0x3A,
0x8F, 7, 0xEA, 0x9B, 0x61, 0x4D, 0xEC, 8, 0x64, 0xE8,
4, 0xA0, 0xB, 0xC2, 0xF5, 0x10, 0x76, 0x32, 0xBB, 0xD9,
0x2E, 0xBE, 0x86, 0xBA, 0xE7, 0xBA, 0xC6, 0xFC, 0xA2,
0x13, 0xD8, 6, 0xFA, 0x2E, 0x59, 0x4C, 0xF4, 0xDD,
1, 0x7F, 0xAF, 0x87, 0xC2, 0xB4, 0x8A, 0x81, 0x8A,
0xF2, 0xB6, 0x60, 0x9A, 0x13, 0x52, 0xC0, 0x6D, 0x9E,
0x5A, 0x52, 0xB5, 0x8F, 0x47, 0x5E, 0xE6, 0x41, 0xAD,
0xF5, 0xBB, 0xA9, 0x7A, 0x6C, 0xA1, 0x4C, 0x38, 0x60,
0xF2, 0x4B, 0x5C, 0xE8, 0x5B, 0xE5, 0xE3, 0xBA, 0x46,
0x70, 0x33, 4, 0xA7, 0x58, 0x19, 0x10, 0x49, 0x20,
0x1D, 0x51, 0x48, 0x9D, 0x78, 0xF9, 0xB4, 0x2E, 0x66,
0x58, 0x1B, 0xE8, 0xEE, 0x51, 9, 0x21, 0x80, 0xBC,
0xC8, 0x7B, 0xF5, 0x4E, 0x99, 0xFD, 0xFC, 0x9A, 0xFD,
0x65, 0x20, 0x13, 0x57, 0xD1, 0x83, 0x4D, 0xF6, 0x2C,
0xAF, 0x25, 0x3C, 0x12, 0xF0, 0x7C, 0x16, 0x66, 0x97,
0x7F, 0x6A, 2, 0xBC, 0x98, 0x52, 0xD7, 0xE3, 0x56]

a=[
0xD8, 0xC2, 0x6B, 0x42, 0x82, 0x67, 0xC8, 0x4D, 0x7A,
0x95, 0xE8, 0x81, 0x48, 0xC1, 0x9E, 0x40, 0xE8, 0xFB,
0xCF, 0xE6, 0x4F, 0xBA, 0xE6, 0xAF, 0x78, 0x19, 0x6F,
0x9C, 0xE9, 0xF7, 0x7A, 0xDD, 0x42, 0xCE, 0x8C, 3,
0xB8, 0x66, 0xD3, 0xAB, 0, 0x7E, 0xDE, 0x3E, 0x53,
0xDE, 0x30, 0x91, 0x3D, 0xF7, 0xCD, 0x72, 0x14, 0x51,
0x82, 0xEE, 0x1B, 0x8D, 0xB4, 0x8C, 0xD0, 0x8A, 0xF6,
0x9A, 0x96, 0x71, 0x98, 0x62, 0x93, 0x4A, 0x30, 0x2F,
0x9C, 0xA8, 0x79, 0x16, 0xC1, 0xE0, 0xEC, 0xD7, 0xE5,
0xEC, 0x8A, 0x64, 0xB4, 0x46, 0xCF, 0xD9, 0xE5, 0x96,
0xF3, 0x94, 0x73, 0xA9, 0xFF, 0xEA, 0xCB, 0x15, 0x9C,
0x7C, 0xA1, 0xD8, 0x3E, 0xBB, 0x1D, 0x38, 0xCB, 0x55,
0xD0, 0x19, 0x25, 0xB2, 0xB, 0x92, 0xE8, 0x88, 0xAE,
6, 0xA2, 0x9B, 0x93, 0x64, 0x5E, 0xFB, 9, 5, 0xF6,
0x2F, 0x1F, 0x35, 0xCC, 0xEF, 5, 0x6C, 0x19, 0x42,
0x38, 0xA5, 0x59, 0x2E, 0x80, 0xA, 0x19, 0xFC, 0x33,
0x5B, 0xBB, 0xD6, 0xEB, 0x2B, 0xAC, 0xF7, 0xE, 0xAD,
0xD8, 0x57, 0x40, 0x98, 0x71, 0x2C, 0x78, 0x68, 0x91,
0x82, 0x4F, 0x5B, 0xD6, 0x40, 0x8F, 3, 0xBD, 0x55,
0xB, 0x47, 0x3D, 0xF4, 0x5A, 0x49, 0x5B, 0xF2, 0xA2,0x9
]
c=[]
d=''
for i in range(182):
    c.append(a^b)

for i in range(182):
    if c == 0:
        print(c)
        print(i)

for i in c:
    d+=chr(i)
print(d[28:28+54])
17.png

测试一下,正确。
18.png
------------------------------------------------------------
题目:
1,
链接:http://pan.baidu.com/s/1o7EWNV0 密码:lzbp
2,
链接:http://pan.baidu.com/s/1c2xW0SC 密码:e7dh

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
安卓逆向一切 + 1 + 1 已答复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

6767 发表于 2017-9-13 21:05
本帖最后由 6767 于 2017-9-13 22:11 编辑

QQ拼音截图未命名.png
我记得有三道这样的题目的。。。

http://t.cn/RpOWmEp


丢上来了
都同学 发表于 2017-9-13 21:17
 楼主| 红心J 发表于 2017-9-13 21:44
6767 发表于 2017-9-13 21:05
我记得有三道这样的题目的。。。

还有道~~我没题呀。朋友你发下吧
mayl8822 发表于 2017-9-13 23:14
感谢分享
Javajsc 发表于 2017-9-15 15:16
学习一波。
安卓逆向一切 发表于 2017-9-15 21:40
我得天  还是看不懂
Wester 发表于 2017-9-15 23:36
学习一下 感谢分享
头像被屏蔽
爱蜂玩爱疯玩 发表于 2017-11-10 15:08
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 18:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表