18/10/05-5-BugKu-逆向-LittleRotatorGame(NJCTF)

0x00

题目链接:https://pan.baidu.com/s/1FLIaSN6EOe34qQNO_8yi-g
提取码:phou

0x01

native层分析

根据提示程序用了O-LLVM混淆,IDA分析ANativeActivity_onCreate函数,分析此处

1 v24 = flg((int)v67, &v89);
2                                           j___android_log_print(4, "an-activity", "The flag is:njctf{%s}", v24);
3                                           v4 = -681054051;
4                                           v25 = v2;
5                                           v66 = v2;
6                                           goto LABEL_214;

可看出flag与flg函数有关。

0x02

分析flg层函数。

 1 char *__fastcall flg(int a1, char *a2)
 2 {
 3   int v2; // ST0C_4
 4   int v3; // r4
 5   int v4; // r0
 6   char v5; // ST08_1
 7   int v6; // ST10_4
 8   int v7; // r0
 9   int v8; // r2
10   int v9; // r0
11   int v10; // r3
12   int v11; // r0
13
14   v2 = a1;
15   v3 = a1;
16   v4 = a1 % 10;
17   v5 = v4;
18   *a2 = 20 * v4;
19   v6 = v3 / 100 % 10;
20   v7 = 19 * v6 + 20 * v4;
21   a2[1] = v7;
22   a2[2] = v7 - 4;
23   v8 = v3 / 10 % 10;
24   a2[3] = v3 / 1000000 % 10 + 11 * v8;
25   v9 = v3 / 10000 % 10;
26   v10 = v3 / 1000 % 10;
27   a2[4] = 20 * v10 - v9;
28   a2[5] = (v8 + v5) * v10;
29   a2[6] = v8 * v10 * v9;
30   v11 = v2 / 100000 % 10;
31   a2[7] = 20 * v11 - v6;
32   a2[8] = 10 * v10 | 1;
33   a2[9] = (v8 + v5) * v11 - 1;
34   a2[10] = v5 * v8 * v6 * v6 - 4;
35   *(_WORD *)(a2 + 11) = (unsigned __int8)((v6 + v8) * v11 - 5);
36   return a2;
37 }

发现有/1000000,说明输入的数大于1000000,可以进行爆破。

0x03

写脚本进行爆破,从1000000到10000000。

cpp脚本

 1 #include<iostream>
 2 void check(int num);
 3 int ok(char);
 4 int main(void)
 5 {
 6     for(int i = 1000000; i < 10000000; i++)
 7     {
 8         check(i);
 9     }
10     return 0;
11 }
12 void check(int num)
13 {
14     int m = 1;
15
16     char flag[13];
17     int v4 = num % 10;
18     flag[0] = 20 * v4;
19     int v6 = num / 100 % 10;
20     int v7 = 19 * v6 + 20 * v4;
21     flag[1] = v7;
22     flag[2] = v7 - 4;
23     int v8 = num/10%10;
24     flag[3] = num / 1000000 % 10 + 11 * v8;
25     int v9 = num / 10000 % 10;
26     int v10 = num / 1000 % 10;
27     flag[4] = 20* v10 - v9;
28     flag[5] = (v8 + v4) * v10;
29     flag[6] = v8 * v10 * v9;
30     int v11 = num / 100000 % 10;
31     flag[7] = 20 * v11 - v6;
32     flag[8] = 10 * v10 | 1;
33     flag[9] = (v8 + v4) * v11 - 1;
34     flag[10] = v4 * v8 * v6 * v6 - 4;
35     flag[11] = (v6 + v8) * v11 - 5;
36     flag[12] = ‘\0‘;
37
38     for(int i = 0; i < 12; i++)
39     {
40         if(!((flag[i] >= ‘A‘ && flag[i] <= ‘Z‘) || (flag[i] >= ‘a‘ && flag[i] <= ‘z‘) || (flag[i] >= ‘0‘ && flag[i] <= ‘9‘) ))
41         {
42             m = 0;
43         }
44     }
45     if(m == 1)
46     printf("%s\n",flag);
47 }

python脚本

 1 def check1(num):
 2     flag = [0] * 12
 3     v4 = num % 10
 4     flag[0] = 20 * v4
 5     v6 = num / 100 % 10
 6     v7 = 19 * v6 + 20 * v4
 7     flag[1] = v7
 8     flag[2] = v7 - 4
 9     v8 = num / 10 % 10
10     flag[3] = num / 1000000 % 10 + 11 * v8
11     v9 = num / 10000 % 10
12     v10 = num / 1000 % 10
13     flag[4] = 20 * v10 - v9
14     flag[5] = (v8 + v4) * v10
15     flag[6] = v8 * v10 * v9
16     v11 = num / 100000 % 10
17     flag[7] = 20 * v11 - v6
18     flag[8] = 10 * v10 | 1
19     flag[9] = (v8 + v4) * v11 - 1
20     flag[10] = v4 * v8 * v6 * v6 - 4
21     flag[11] = (v6 + v8) * v11 - 5
22     m = 1
23     for i in flag:
24         if(check2(i)):
25             m = 0
26     if (m == 1):
27         str = ‘‘
28         for i in flag:
29             str += chr(i)
30         print str
31
32
33 def check2(num):
34     if ((num >= ord(‘A‘)) & (num <= ord(‘Z‘))):
35         return 0
36     if ((num >= ord(‘a‘)) & (num <= ord(‘z‘))):
37         return 0
38     if ((num >= ord(‘0‘)) & (num <= ord(‘9‘))):
39         return 0
40     return 1
41
42
43 for i in range(1000000,10000000):
44     check1(i)

python跑得会比较慢,在输出结果中有一个即是flag。

原文地址:https://www.cnblogs.com/Fingerprint/p/9744619.html

时间: 2024-10-08 07:19:16

18/10/05-5-BugKu-逆向-LittleRotatorGame(NJCTF)的相关文章

[CareerCup] 18.10 Word Transform 单词转换

18.10 Given two words of equal length that are in a dictionary, write a method to transform one word into another word by changing only one letter at a time. The new word you get in each step must be in the dictionary. 这道题让我们将一个单词转换成另一个单词,每次只能改变一个字母,

18.6 负载均衡集群介绍;18.7 LVS介绍;18.9 LVS NAT模式搭建(上);18.10 LVS NAT模式搭建(下)

扩展: lvs 三种模式详解 http://www.it165.net/admin/html/201401/2248.html lvs几种算法 http://www.aminglinux.com/bbs/thread-7407-1-1.html 关于arp_ignore和 arp_announce http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html lvs原理相关的   http://blog.csdn.net/pi9nc/

18.6 负载均衡集群介绍 18.7 LVS介绍 18.8 LVS调度算法 18.9/18.10 L

18.6 负载均衡集群介绍18.7 LVS介绍 18.8 LVS调度算法 18.9/18.10 LVS NAT模式搭建 原文地址:http://blog.51cto.com/13227377/2149682

掌上电脑设备可以使用Ubuntu MATE 18.10 Linux映像了

就在几天前,Ubuntu 18.10发布了.操作系统被称为"Cosmic Cuttlefish",有多种版本可供选择,除了常见的GNOME -- Xfce (Xbuntu), KDE (Kubuntu)等,还有有几种不同的桌面环境. 其中一个变种Ubuntu MATE 18.10因其低系统要求而受到欢迎 - 它在简单的硬件上运行良好.为了突出操作系统的适应性,GPD Pocket和GPD Pocket 2已经发布了一个特殊的镜像.如果您不熟悉这些迷你笔记本电脑,请知道它们本质上是以前被

18.10 汇编语句

18.10.1 汇编语句中.equ的作用 1.定义静态符号 虽然数据段主要用于定义变量数据,但是也可以在这里声明静态数据符号. .equ命令用于把常量值设置为可以在文本段中使用的符号. 如: 01 .equ MEM_CTL_BASE, 0x48000000 02 .equ SDRAM_BASE, 0x30000000 经过设置之后,数据符号值是不能在程序中改动的. .equ命令可以出现在数据段中任何位置,但是好代码习惯,最好在定义其他数据之前或之后集中定义所有数据符号. 如: 01 ldr r2

inux开发环境配置1 :thinkpad x1 extreme ubuntu18.04 /18.10 安装

首先说明x1 安装 ubuntu desktop 版本最大的问题是显卡.这个问题搞定基本安装就顺利了. 18.10解决大部分安装问题!!!不要无谓尝试18.04了!! 安装过程参考了这篇文章,有些地方做了相应的修改. https://zhuanlan.zhihu.com/p/52486576 文中正确部分我就不写了 主要写有问题部分 1.原文:U盘启动之后会有四个选项,光标默认在第一个选项“try ubuntu without installation”,这时候按E键进入编辑模式,不然之后log

Ubuntu 18.04/18.10快速开启Google BBR的方法

说明:Ubuntu 18.04改变挺大的,内核直接升到了正式版4.15,而BBR内核要求为4.9,也就是说满足了,所以我们不需要换内核就可以很快的开启BBR,这里简单说下方法. 提示:Ubuntu 18.10依然可以用该方法开启BBR,而对于19.04.貌似官方直接给你开启了BBR,不需要重复开启了. 方法 1.修改系统变量 echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tc

java 18 - 10 Collections工具类的常用方法

Collections:是针对集合进行操作的工具类,都是静态方法. 要知道的方法 A:public static <T> void sort(List<T> list):排序 默认情况下是自然顺序. B:public static <T> int binarySearch(List<?> list,T key):二分查找 C:public static <T> T max(Collection<?> coll):最大值 D:publi

18.03.05 codevs1068 乌龟棋

题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. …… 1 2 3 4 5 ……N 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型 的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡 片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行