ddctf-android 2题
本帖最后由 红心J 于 2017-9-13 20:50 编辑注:题的链接在帖子最后
1,
一个apk程序,先装上看看。破解密码的,随便输试试。
拖入改之理看看
我们目标就是拿到藏在程序中的 flag,这个文件名就是 flagapp,在一看 smali 代码有个 Corret,打开java源码看看
java代码一看就非常清楚了。
我们想要的 flag 就是 arrayOfByte2 里面的内容,也就是private String i() 这个函数的返回值。
那么,下面就看 arrayOfByte2 是经过了怎样的变换。
只关心String i()函数, 一行一行的来看看
private String i()
{
int i = 0;
byte[] arrayOfByte1 = new byte; //创建byte数组,长度是 p 这个数组的长度。
for (int j = 0; j < arrayOfByte1.length; j++) {
arrayOfByte1 = ((byte)(byte)(p ^ q));// 把 p,q2个数组异或 ,再赋值给arrayOfByte1
}
int k = arrayOfByte1; // 取arrayOfByte1的第一个元素,赋给变量 k
for (j = 0; arrayOfByte1[(k + j)] != 0; j++) {} //这个for循环就是为了确定 j 的值
byte[] arrayOfByte2 = new byte; // 由上面确定的 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));
}
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;
for(int j=0; j < getArrayLen(p) ; j++)
{
arrayOfByte1 =(char)(p^q);
}
// cout <<getArrayLen(p)<<endl;
// cout <<arrayOfByte1<<endl;
int k = arrayOfByte1;
for (j = 0; arrayOfByte1[(k + j)] != 0; j++) {}
// cout << j <<endl; 确定 j 的值
char arrayOfByte2; // 写代码的时候不知道数组有多长,直接写大点就行了。
while (i < j)
{
arrayOfByte2 = arrayOfByte1[(k + i)];
i++;
}
string result;
result = arrayOfByte2;
cout << result <<endl;
return ;
}
flag 就是前面那串邮箱了。
-------------------------------------------------------------------------------------------
2,
DDCTF第4题
一个Apk文件,一个Readme.txt,没啥好看的,就是题目的要求。
下面开始做题。
拿到题先安装上看看,
拖入改之理进行反编译,然后搜索 Wrong
去到红框中的地方,然后打开 Java 源码看看。
mFlagEntryView.getText().toString().equals(stringFromJNI())
//获取我们的输入,变成字符串,然后与 stringFromJNI()函数的东西进行比较。
关键函数是 stringFromJNI(),在native层,调用了so库,下面就去分析相关的库。
把 文件后缀改成 rar,解压出来。
so库都放在lib文件里,打开它。
发现有这么多个文件,简单说一下。
上面这些文件夹里都存放着程序引入的第三方库,也就是 .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位
mips6464位
x86 IA-32位指令集
x86_6464位
-----------------------
我之前做的时候,分析了x86,和x86_64的,但是没有弄出来。然后去看的 armeabi 下的
直接把 hello-libs.so 拖入ida里,下面红框那个函数,就是我们要找的 stringFromJNI()
点过去,f5大法,看看ida翻译出的代码。
Int a1 这里改一下,应该是个JNI指针,修改为 JNIEnv *a1。
在来看一下。那么需要关注的地方,就是那个红框。返回的是 result,result 与 v4有关,那么关键的位置就是j_j_j__Z21__aeabi_wind_cpp_pr45Pc(&v4)
双击 j_j_j__Z21__aeabi_wind_cpp_pr45Pc(&v4) 这个函数,发现下面还有调用,在双击...一直跟进,去到最后的代码位置。
这里就是算法的代码。
看到有个长度为 184 的char型数组 v8
上面这个就是异或操作,放在 do while循环里面:byte_7A2 ^ byte_6EC,且都是182位的。
双击看看 byte_7A2 和 byte_6EC 数组
好了,下面不多说,贴一张我写的注释。
附上写的py代码:
b=
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)
测试一下,正确。
------------------------------------------------------------
题目:
1,
链接:http://pan.baidu.com/s/1o7EWNV0 密码:lzbp
2,
链接:http://pan.baidu.com/s/1c2xW0SC 密码:e7dh 本帖最后由 6767 于 2017-9-13 22:11 编辑
我记得有三道这样的题目的。。。
http://t.cn/RpOWmEp
丢上来了 学习一波。楼主辛苦 6767 发表于 2017-9-13 21:05
我记得有三道这样的题目的。。。
还有道~~我没题呀。朋友你发下吧 感谢分享 学习一波。 我得天还是看不懂
学习一下 感谢分享
页:
[1]