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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 948|回复: 8

[Android 原创] ddctf-android 2题

[复制链接]
发表于 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 已答复!

查看全部评分

本帖被以下淘专辑推荐:

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-9-13 21:05 | 显示全部楼层
本帖最后由 6767 于 2017-9-13 22:11 编辑

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

http://t.cn/RpOWmEp


丢上来了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-9-13 21:17 | 显示全部楼层

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

 楼主| 发表于 2017-9-13 21:44 | 显示全部楼层
6767 发表于 2017-9-13 21:05
我记得有三道这样的题目的。。。

还有道~~我没题呀。朋友你发下吧

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-9-13 23:14 | 显示全部楼层
感谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-9-15 15:16 | 显示全部楼层
学习一波。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-9-15 21:40 | 显示全部楼层
我得天  还是看不懂

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-9-15 23:36 | 显示全部楼层
学习一下 感谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-11-10 15:08 | 显示全部楼层
谢谢您嘞、新技能GET

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则


免责声明:
吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:Service@52PoJie.Cn

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

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

GMT+8, 2017-11-24 21:08

Powered by Discuz!

© 2001-2017 Comsenz Inc.

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