安装app查看。一个输入框,输入随便输入显示Try again.

放入JEB反编译。

关于输入框监听是第一次见,具体可以看看这个博客https://www.jianshu.com/p/f976c677189a

函数的作用是,如果字符串s变动,将会执行具体的实现。这里是调用了native层的parseText函数。

接下来反编译apk,用IDA打开位于lib文件夹中的so文件,如下图所示。

具体关于JNI,可以看这个博客,https://blog.csdn.net/smbroe/article/details/44133741

jni方法有两种映射:

动态注册的native方法,必须实现JNI_OnLoad方法,同时实现一个JNINativeMethod[]数组, 实现Java方法与native方法的映射绑定 
静态注册的native方法,必须是以Java+类完整路径+方法名的格式来命名native方法。

这里是静态注册的,首先要选中这里的a1,按Y,改成下图所示,这样IDA才能够正确分析。

返回Java层,查看messageMe函数。函数很简单,直接赋值java包的名字,复制黏贴代码到java编译器中跑出即可。

 public class easycrack100 {
public static void main(String[] args) {
String v3 = "";
int v4 = 51;
String[] v1 = "com.njctf.mobile.easycrack".split("\\.");
/*1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
2、如果用“|”作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
“.”和“|”都是转义字符,必须得加"\\";*/
char[] v6 = v1[v1.length - 1].toCharArray();
int v7 = v6.length;
int v5;
for(v5 = 0; v5 < v7; ++v5) {
v4 ^= v6[v5];
v3 += ((char)v4);
}
System.out.println(v3);
}
}

message='V7D=^,M.E'

返回IDA继续分析。

这个循环也容易理解,异或后的字符串放入了v23。再往下。

打开init函数。

稍微改一下放到c编译器中得到key数组。

#include<stdio.h>
using namespace std;
int main()
{
string a2 = "I_am_the_key";
string v11 = a2;
int res[];
int v3 = ;
int v14[];
int *v8;
int v4 = ;
int v5 = ;
int *v7;
int i = ;
do
{
res[v5] = v5;
v14[v5++] = v11[i];
i++;
i%=;
}
while ( v5 != );
v7=v14;
v8 = res;
int v9;
do
{
v9 = *v8;
v4 = (v9 + v4 + *v7) % ;
*v8 = res[v4];
res[v4] = v9;
--v3;
++v7;
++v8;
}
while ( v3 );
for(int i=;i<;i++) printf("0x%02x,",res[i]);
return ;
}

再往下,将得到key和异或后的字符串进行加密。

因为我们要逆向得到正确的输入(即flag),所以需要知道经过整个加密过程后的对比字符串。

这里双击compare就能看到了。这是一串十六进制。

在它的上面,还有一步,就是把经过crypt后的字符串转成16进制,如下图。

下面画个流程图,梳理一下思路。

最后跟据crypt函数写出脚本即可。

#include<iostream>
using namespace std;
int main()
{
int a3 = ;
int v3 = ;
int v4 = ;
int v5;
int i = ;
int a2[] = {0xC8,0xE4,0xEF,0x0E,0x4D,0xCC,0xA6,0x83,0x08,0x81,0x34,0xF8,0x63,0x5E,0x97,0x0E,0xEA,0xD9,0xE2,0x77,0xF3,0x14,0x86,0x9F,0x7E,0xF5,0x19,0x8A,0x2A,0xA4};
int result[] = {0x39,0xa9,0x72,0x2d,0xe8,0x58,0x26,0x32,0x81,0xd,0xac,0x49,0xbb,0x10,0x46,0x65,0xb3,0x92,0xf,0x84,0xb8,0xbf,0xf2,0x52,0xe3,0x5b,0xfc,0xd5,0x59,0x6a,0xf0,0x5d,0x60,0x69,0x16,0x8e,0xfb,0x94,0x48,0xbc,0x71,0x36,0x57,0xad,0x44,0x7c,0x95,0xda,0xb7,0x47,0xdb,0x35,0x3c,0xd2,0x23,0xc5,0xa8,0xb,0x9f,0x31,0xd8,0x1f,0x3f,0xb0,0x2e,0xe1,0x5a,0x4a,0xf9,0x1,0x54,0xa7,0xa5,0xee,0x8,0x99,0x63,0x9b,0x50,0xbd,0x5,0xf7,0xcb,0xab,0x22,0xc2,0x8a,0x38,0x7d,0x6,0xb1,0xc0,0x4e,0x74,0x3a,0xe5,0x67,0x2b,0xa3,0x73,0x89,0x9e,0xba,0x88,0x3d,0x28,0x62,0x8f,0xfd,0x43,0x98,0x4d,0x56,0xb2,0xc,0x29,0x6e,0x78,0x25,0xe0,0xe9,0xf6,0x9c,0x13,0xed,0xf8,0xc4,0x20,0x87,0x2,0x7b,0xf1,0x6d,0xc7,0x8c,0x9d,0x86,0x3b,0x66,0xfa,0xb6,0x42,0x6f,0x14,0xd0,0x19,0xaf,0x11,0x21,0x96,0x85,0x91,0xb5,0xa0,0x1b,0x18,0xa6,0xa2,0x4b,0x40,0xd4,0x8d,0x2a,0x8b,0x5c,0x2c,0xe6,0xfe,0xa4,0x30,0xe7,0xff,0xc8,0x5f,0xe2,0x1c,0xdf,0xae,0x7f,0xc3,0x61,0xef,0x90,0x6c,0x51,0x2f,0xec,0x12,0x7a,0xaa,0xdd,0x77,0xf5,0x4,0xd9,0x83,0x33,0xeb,0x80,0x27,0x3,0xb4,0x9,0x37,0x6b,0x41,0x4f,0x7e,0xf3,0x24,0xf4,0xc9,0x7,0xd1,0x45,0x70,0xa1,0xd7,0x34,0x93,0x15,0xca,0x4c,0xcd,0x97,0xb9,0xea,0x0,0x5e,0x1a,0x9a,0xcf,0x79,0xa,0x3e,0x82,0xd3,0x68,0x75,0x64,0xce,0x55,0xe,0xbe,0x1d,0xe4,0xc1,0xc6,0xde,0xcc,0x1e,0x17,0xd6,0xdc,0x53,0x76};
do
{
v3 = (v3 + ) % ;
v5 = *(int *)(result + v3);
v4 = (v5 + v4) % ;
*(int *)(result + v3) = *(int *)(result + v4);
*(int *)(result + v4) = v5;
a2[i] ^= *(int *)(result + ((*(int *)(result + v3) + v5) & 0xFF));
--a3;
++i;
}
while ( a3 );
string ss="V7D=^,M.E";
string flag="";
for(int i=;i<;i++)
{
int j=i%;
flag+=ss[j]^a2[i];
}
cout << flag;
return ;
}

NJCTF (easycrack)的更多相关文章

  1. NJCTF 极少部分wp

    前沿:刚刚结束了NJCTF,做出来的题目很少. 1,----非常简单的misc , check QQ ,直接在QQ群可以看到发布的flag. 2,konck----hint:韩琛截获了一张纸条,突然记 ...

  2. NJCTF 2017 web pictures'wall(详解)

    题目: 图片墙上有图片 url:http://218.2.197.235:23719/ writeup: 首先各种尝试登陆,发现任意用户及密码都可以登陆,但登陆后的页面提示的是“Root has pr ...

  3. BUGKU-逆向(reverse)-writeup

    目录 入门逆向 Easy_vb Easy_Re 游戏过关 Timer(阿里CTF) 逆向入门 love LoopAndLoop(阿里CTF) easy-100(LCTF) SafeBox(NJCTF) ...

  4. 格式化字符串漏洞利用实战之 njctf-decoder

    前言 格式化字符串漏洞也是一种比较常见的漏洞利用技术.ctf 中也经常出现. 本文以 njctf 线下赛的一道题为例进行实战. 题目链接:https://gitee.com/hac425/blog_d ...

  5. 4-[HTML]-body常用标签1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. web-ctf随机数安全

    rand() 函数在产生随机数的时候没有调用 srand(),则产生的随机数是有规律可询的. 产生的随机数可以用下面这个公式预测 : state[i] = state[i-3] + state[i-3 ...

  7. CTF必备技能丨Linux Pwn入门教程——PIE与bypass思路

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  8. NCTF2019 小部分题解

    前言 礼拜五领航杯打的比较累,做不出WEB,D3CTF没用,做了NJCTF的一些题目(懒,睡觉到12点起) Misc 第一次比赛先去做misc,以前一直做WEB,以后要WEB+MISC做.礼拜六下午做 ...

随机推荐

  1. 报表开发神器!DevExpress Reporting v19.1:WinForms平台新功能

    行业领先的.NET界面控件DevExpress Reporting全新发布了v19.1版本,本文主要为大家介绍WinForms.ASP.Net Core平台.Visual Studio报表设计器中发布 ...

  2. 消金ABS

    对于持牌消金公司来说,发行ABS需满足至少3年经营期限的硬性规定,目前已开业的24家消金公司里,有15家符合此项规定. 2019年下半年以来,个人消费金融领域共发行了15个资产证券化产品,发行规模达4 ...

  3. Codeforces Round #446 Div1 E

    题目大意 有n个数,进行k轮操作:随机一个i,让\(a_i\)减1,然后ans加上\(\Pi_{j\neq i}a_i\). 求ans的期望. 分析 发现,造成的伤害就是原来的ai的积减去k轮操作后的 ...

  4. MySQL_(Java)分页查询MySQL中的数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...

  5. 2.6.2 XML配置:使用testNG进行并发多浏览器测试

    测试类 1 @Parameters("browser") 定义browser参数. 在测试执行过程中,browser参数具体值由XML文件进行传递. 1 2 3 4 5 6 7 8 ...

  6. git上传项目已经删除文件,但是Jenkins中没有删除

    jenkins 缓存造成的,需要清理工作空间

  7. (十二)C语言之循环结构

  8. 文字和符号组合成图 Banner

    springboot 启动 logo.... 文字符号组合成的图. <<< | /\\\ /--\\\ / \\\\ <*| /________\\\\ | ___ | | | ...

  9. H264编码原理以及I帧、B和P帧详解, H264码流结构分析

    H264码流结构分析 http://blog.csdn.net/chenchong_219/article/details/37990541 1.码流总体结构: h264的功能分为两层,视频编码层(V ...

  10. 只需体验三分钟,你就会跟我一样,爱上这款Toast

    只需体验三分钟,你就会跟我一样,爱上这款Toast https://www.jianshu.com/p/9b174ee2c571