jeb 分析程序逻辑。
根据 Manifest
找到程序的 主要逻辑的地方。 在 Main2Activity
里面
找到 按键 监听的 逻辑。
先更具 id 找到对应的 名字。
先看到 new Intent
发现这里 我们之间看看 s.class 是干什么的。
发现在 s.class 的类中 也有一个按键监听,这里实现的功能是 连接上 sctf.db
数据库。将里面的内容 写入到 v4_1 数组中。
解压 apk 文件 在对面 目录得到 sctf.db 在利用 工具打开 发现 s1 = hello s2 = sctf
然后 程序 进入 d类
d类
中的关键函数, 又一次调用了 几个函数 我们依次分析
在 b类
中 又依次调用了 d方法。
d方法
调用了 q类
中的 get 函数 连接 hellosctf 然后返回进入 a方法
然后 得到的 "hellosctf" 字符串 进行了 md5 加密。
最后调用了 c类
中的 a函数 加密, arg12 = 我们的输入, arg13 为字符串 md5 加密后的值。
最后 调用 s类
中的g函数进行比较。 根据这个 id
先在 资源类中找到名字 再在value 中找到值
最后 加密结构进行 比较, 注意 函数中,对应的 大小写转换。
知道了 关键的 加密函数, 可以写脚本 进行 逆向。
public class Notepad
{
public static void main(String[] args)
{
byte[] enctob = new byte[]{-62, -117, -61, -99, -61, -90, -62, -125, -62, -77, -61, -99, -62, -109, -62, -119, -62, -72, -61, -70, -62, -98, -61, -96, -61, -89, -62, -102, 22, 84, -61, -81, 40, -61, -95, -62, -79, 33, 91, 83};
String bs = new String(enctob);
char[] flagenc = bs.toCharArray();
char[] out = new char[bs.length()];
int[] S = new int[256];
byte[] wtf = new byte[256];
int i,j,k;
String key = "E7E64BF658BAB14A25C9D67A054CEBE5";
for (i = 0; i < 256; i++ )
{
S[i] = i;
wtf[i] = (byte)(key.charAt(i % 32));
}
i = 0;
j = 0;
for(i = 0,j = 0;i < 256; i++ )
{
j = (S[i] + j + wtf[i]) % 256;
k = S[i];
S[i] = S[j];
S[j] = k;
}
for (i = 0,j = 0,k = 0; i < bs.length(); i++ )
{
k = (k + 1) % 256;
j = (S[k] + j) % 256;
int temp = S[k];
S[k] = S[j];
S[j] = temp;
out[i] = (char)((flagenc[i] ^ S[(S[k] + S[k] % 256) % 256]) + k);
System.out.println(out);
}
}
}
// sctf{IT_IS_A_NICE_SONG}