NJCTF (easycrack)
安装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)的更多相关文章
- NJCTF 极少部分wp
前沿:刚刚结束了NJCTF,做出来的题目很少. 1,----非常简单的misc , check QQ ,直接在QQ群可以看到发布的flag. 2,konck----hint:韩琛截获了一张纸条,突然记 ...
- NJCTF 2017 web pictures'wall(详解)
题目: 图片墙上有图片 url:http://218.2.197.235:23719/ writeup: 首先各种尝试登陆,发现任意用户及密码都可以登陆,但登陆后的页面提示的是“Root has pr ...
- BUGKU-逆向(reverse)-writeup
目录 入门逆向 Easy_vb Easy_Re 游戏过关 Timer(阿里CTF) 逆向入门 love LoopAndLoop(阿里CTF) easy-100(LCTF) SafeBox(NJCTF) ...
- 格式化字符串漏洞利用实战之 njctf-decoder
前言 格式化字符串漏洞也是一种比较常见的漏洞利用技术.ctf 中也经常出现. 本文以 njctf 线下赛的一道题为例进行实战. 题目链接:https://gitee.com/hac425/blog_d ...
- 4-[HTML]-body常用标签1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- web-ctf随机数安全
rand() 函数在产生随机数的时候没有调用 srand(),则产生的随机数是有规律可询的. 产生的随机数可以用下面这个公式预测 : state[i] = state[i-3] + state[i-3 ...
- CTF必备技能丨Linux Pwn入门教程——PIE与bypass思路
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- NCTF2019 小部分题解
前言 礼拜五领航杯打的比较累,做不出WEB,D3CTF没用,做了NJCTF的一些题目(懒,睡觉到12点起) Misc 第一次比赛先去做misc,以前一直做WEB,以后要WEB+MISC做.礼拜六下午做 ...
随机推荐
- poj1734 Sightseeing trip[最小环]
一个最小环裸题.最小环的两种求法dijkstra和Floyd直接参见这里我就是从这里学的,不想写了. 注意这里最重要的一个点是利用了Floyd的dp过程中路径上点不超过$k$这一性质,来枚举环上最大编 ...
- Hadoop-No.1之数据存储选型
文件格式 Hadoop支持多种面向数据存储的文件格式,包括纯文本和Hadoop特有的格式,如SequenceFile.还有一些更加复杂但功能更加丰富的格式可供选择,如Avro与Parquet.不同的格 ...
- 服务消费(LoadBalancerClient、Ribbon、Feign)
转自:https://www.jianshu.com/p/562045489d9d 4.1使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的与服务治理相 ...
- SparkSQL之UDF使用
package cn.piesat.test import org.apache.spark.sql.SparkSession import scala.collection.mutable.Arra ...
- luogu【模板】线性筛素数 (Miller-Rabin素数测试模板)
这个感觉还是挺好理解的,就是复杂度证明看不懂~ Code: #include <cstdio> #include <algorithm> #include <cstrin ...
- 6.Servlet、Filter过滤器以及监听器
Servlet 是运行在Web服务器端的Java程序,它使用Java语言编写,与Java程序的区别是Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持,在Jav ...
- 一步一步理解线段树——转载自JustDoIT
一步一步理解线段树 目录 一.概述 二.从一个例子理解线段树 创建线段树 线段树区间查询 单节点更新 区间更新 三.线段树实战 -------------------------- 一 概述 线段 ...
- Java的当中的泛型
Java当中的泛型 01 import java.util.ArrayList; import java.util.List; public class Demo{ public static voi ...
- 最大数maxnumber (HYSBZ 1012)(线段树区间查询和单点修改)(优雅的暴力)
Problem 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作 ...
- Codeforces 437D The Child and Zoo(并查集)
Codeforces 437D The Child and Zoo 题目大意: 有一张连通图,每个点有对应的值.定义从p点走向q点的其中一条路径的花费为途径点的最小值.定义f(p,q)为从点p走向点q ...