notsequence

这题目,挺简单的,首先无壳,直接拖进ida,然后查看了一下伪代码

轻易发现只需要满足三点就行

  • sub_80486CD((int)&unk_8049BE0)
  • (unsigned __int8)sub_8048783((int)&unk_8049BE0, v2) ^ 1
  • v2 == 20

第一个满足条件

sub_80486CD((int)&unk_8049BE0)

伪代码

signed int __cdecl sub_80486CD(int a1)
{int j; // [sp+0h] [bp-14h]@4int v3; // [sp+4h] [bp-10h]@4int i; // [sp+8h] [bp-Ch]@1int v5; // [sp+Ch] [bp-8h]@1v5 = 0;for ( i = 0; i <= 1024 && *(_DWORD *)(4 * i + a1); i = v5 * (v5 + 1) / 2 ){v3 = 0;for ( j = 0; j <= v5; ++j )v3 += *(_DWORD *)(4 * (j + i) + a1);if ( 1 << v5 != v3 )return -1;++v5;}return v5;
}

c++核心代码

v5=0;
for(int i =0;i<=1024 && a[i];i=v5*(v5+1)/2)
{v3=0;for(j=0;j<=v5;++j)v3+=a[i+j];  //if(1<<v5 != v3)//满足2的v5次方==v3return -1;++v5;
}

解释

  • v5取值0,1,2,3,4,5,6,7……
  • v5决定了for循环依次得执行1,2,3,4,5,6,7,8次……(即依次取输入数组第i项后1,2,3,4,5,6,7,8个元素)
  • i取值为0,1,3,6,10,15,21,28………………
    v3依次为输入数组的第i项之后v5+1个数之和

举个例子:

v5=0 i=0 for循环执行一次
v3就为 a[0]

v5=1 i=1 for循环执行两次
v3就为 a[1]+a[2]

v5=2 i=3 for循环执行三次
v3就为 a[3]+a[4]+a[5]

v5=3 i=6 for循环执行四次
v3就为 a[6]+a[7]+a[8]+a[9]

………………

a[0]
a[1]+a[2]
a[3]+a[4]+a[5]
a[6]+a[7]+a[8]+a[9]
…………………………………………

特别注意这个关系

v5=行号-1

代表着 每一行值的和必须等于2的(行号-1)次方

第二个满足条件

sub_8048783

伪代码

signed int __cdecl sub_8048783(int a1, signed int a2)
{int v3; // [sp+10h] [bp-10h]@2int v4; // [sp+14h] [bp-Ch]@2signed int i; // [sp+18h] [bp-8h]@1int v6; // [sp+1Ch] [bp-4h]@1v6 = 0;for ( i = 1; i < a2; ++i ){v4 = 0;v3 = i - 1;if ( !*(_DWORD *)(4 * i + a1) )return 0;while ( a2 - 1 > v3 ){v4 += *(_DWORD *)(4 * (v3 * (v3 + 1) / 2 + v6) + a1);++v3;}if ( *(_DWORD *)(4 * (v3 * (v3 + 1) / 2 + i) + a1) != v4 )return 0;++v6;}return 1;
}

c++核心代码


int v6 =0;
for(int i=1;i<a2;++i){v4=0;v3=i-1;if(!a[i])return 0;while(a2-1>v3){v4+=a1[v3*(v3+1)/2+v6];++v3;}if(a1[v3*(v3+1)/2+i]!=v4)return 0;++v6;
}
return 1;

仔细观察了一下,就感觉这个下标v3*(v3+1)/2+i和上面的下标v3*(v3+1)/2+v6所对应的元素值和v4之间的关系挺重要的,用vs加点东西输出一下试试

#include <iostream>
using namespace std;
int main()
{int a1[2000] = { 0 };int a2 = 20;int v6 = 0;for (int i = 1; i < a2; ++i) {int v4 = 0;int v3 = i - 1;if (!a1[i])//return 0;while (a2 - 1 > v3) {v4 += a1[v3 * (v3 + 1) / 2 + v6];cout << v3 * (v3 + 1) / 2 + v6 << endl;++v3;}cout <<"这个下标为:" <<(v3 * (v3 + 1) / 2 + i)<<endl;if (a1[v3 * (v3 + 1) / 2 + i] != v4);++v6;}}



首先提醒一下,我们这里输出的全是输入数组的下标,我们把它们合并一下,看看情况如何:


0
1   2
3   4   5
6   7   8   9
10  11  12  13  14
15  16  17  18  19  20
21  22  23  24  25  26  27
28  29  30  31  32  33  34  35
36  37  38  39  40  41  42  43  44
45  46  47  48  49  50  51  52  53  54
55  56  57  58  59  60  61  62  63  64  65
66  67  68  69  70  71  72  73  74  75  76  77
78  79  80  81  82  83  84  85  86  87  88  89  90
91  92  93  94  95  95  96  97  98  99  100 101 102 103
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209

特别注意这个关系

仔细观察代码和下标关系

每一列的和等于一列中最后一行斜下角(后一列,后一行)那个数字

综上所述

需要满足条件为:

  1. 每一行值的和必须等于2的(行号-1)次方
  2. 每一列的和等于一列中最后一行斜下角(后一列,后一行)那个数字

好家伙,搞了半天,不就是杨辉三角嘛。。。。
自行查看(第11条和第12条):
https://baike.baidu.com/item/%E6%9D%A8%E8%BE%89%E4%B8%89%E8%A7%92/215098?fr=aladdin

11.第n行数字的和为2(n-1)。1=2(1-1),1+1=2(2-1),1+2+1=2(3-1),1+3+3+1=2(4-1),1+4+6+4+1=2(5-1),1+5+10+10+5+1=2(6-1)
这个对应的不就是第一条嘛

12.斜线上数字的和等于其向左(从左上方到右下方的斜线)或向右拐弯(从右上方到左下方的斜线),拐角上的数字。1+1=2,1+1+1=3,1+1+1+1=4,1+2=3,1+2+3=6,1+2+3+4=10,1+3=4,1+3+6=10,1+4=5。


对照来看,不就是一个对齐了,方便看,一个没对齐嘛,体谅一下,我输完挺难的。。。

第三个满足条件

v2==20的条件也就是杨辉三角的层数等于20

GAMEOVER(上代码)

输入20层的杨辉三角的c++代码

#include <iostream>
using namespace std;
int main()
{int a[30][30] = { 0 };int j = 1;for (int i = 1; i <= 20; i++)a[i][1] = 1;for (int i = 2; i <= 20; i++)for (int j = 1; j <= i; j++)a[i][j] = a[i - 1][j - 1] + a[i - 1][j];for (int i = 1; i <= 20; i++)for (int j = 1; j <= i; j++)cout << a[i][j];}

1111211331146411510105116152015611721353521711828567056288119368412612684369111045120210252210120451011115516533046246233016555111112662204957929247924952206612111378286715128717161716128771528678131114913641001200230033432300320021001364911411151054551365300350056435643550053003136545510515111612056018204368800811440128701144080084368182056012016111713668023806188123761944824310243101944812376618823806801361711181538163060856818564318244375848620437583182418564856830608161531811191719693876116282713250388755829237892378755825038827132116283876969171191

然后再去md5网站进行加密一下,包上RCTF{},即得到flag:

flag:RCTF{37894beff1c632010dd6d524aa9604db}

notsequence 寒假逆向生涯(9/100)相关推荐

  1. easyre-153 testre寒假逆向生涯(13/100)

    easyre-153 简单题目,流程走起,首先查壳, 脱壳 upx壳,利用工具把它脱掉 ida静态分析 int __cdecl main(int argc, const char **argv, co ...

  2. secret-galaxy-300 Replace(印象深刻) 寒假逆向生涯(8/100)

    secret-galaxy-300 脑洞题,直接没说法,就以后别碰这种脑洞题就行,,,,没任何帮助 显示界面 OD打开后,显示这个鬼东西.然后就没了. ida静态分析 看到上方输出框有字符串,所以我们 ...

  3. IgniteMe debug 寒假逆向生涯(2/100)

    IgniteMe 声明 这是道超级简单的题目,就不重复啰嗦了,找到需要加密的关键代码后,直接一步到位. memset(&v4, 0xCCu, 0xF4u);if ( strlen(a1) &g ...

  4. HWS计划 decryption 寒假逆向生涯(17/100)

    decryption 前奏 没法搞,直接拖ida 全局 首先输入flag,然后一个if判断一下长度是否符合,不符合直接结束 然后再new处一个数组,接着一个加密函数,把加密后的存放在new出来的数组里 ...

  5. easy_Maze 梅津美治郎 寒假逆向生涯(16/100)

    easy_Maze 这个题简单,迷宫题目,需要动调,或者不用动调也行,可以自己算出地图,我用的是动调. 生成地图的两个函数 只需要动调到这两个函数的下一步后,找到储存矩阵的空间的地址, 把这个地址转到 ...

  6. babymips(下) 寒假逆向生涯(14/100)

    babymips上 主要核心代码 var_10= -0x10 var_8= -8 var_4= -4 arg_0= 0addiu $sp, -0x28 sw $ra, 0x28+var_4($sp) ...

  7. babymips(上) 寒假逆向生涯(14/100)

    babymips 这题呢,看名字就知道,不出所料,还是mips指令,挺简单的,懒得找插件,直接分析吧,锻炼锻炼自己 开战 lui $v0, 0x40 addiu $a0, $v0, (aGiveMeY ...

  8. deedeedee crazy 寒假逆向生涯(11/100)

    deedeedee 这题没说法...直接用notepad++打开第二个文件,然后就看到了flag....人傻了... flag{t3mplat3_met4pr0gramming_is_gr8_4_3v ...

  9. re-for-50-plz-50 寒假逆向生涯(6/100)

    re-for-50-plz-50 这题目属实没法看伪代码(当然,可以下载插件进行一系列帮助),在这里呢,我直接读mips的指令集,因为涉及到的指令挺简单的 MIPS32指令集对照 全部指令 .text ...

最新文章

  1. android 把assets 里面的图片文件输出到SD卡
  2. 专访.NET平台上类RoR开源项目Castle[转载]
  3. RNFL视网膜神经纤维层报告(青光眼检测)解读
  4. java与java ee_使用Java EE的ManagedExecutorService异步执行事务
  5. 泛型类有什么作用_3 分钟带你彻底搞懂 Java 泛型背后的秘密
  6. 我的MyGeneration
  7. ip对应的区域查询(asp.net版)
  8. 使用 SqlDataSource 控件查询数据47
  9. BOJ 2773 第K个与m互质的数
  10. VC++之MFC教程
  11. 十大最热门人工智能技术
  12. C++实现推箱子游戏
  13. 关于 Unicode 每个程序员应该知道的 5 件事
  14. 如何成为一个优秀的数据分析师?
  15. 鸿蒙之至始于衣冠,学坊之声/Class Story | 孝老爱亲,我们这样做——双语303班蚂蚁学坊亲子活动...
  16. 购买亚马逊保险前,卖家须注意的问题值得你收藏!
  17. linux 进程 ssl 状态,Linux进程状态与信号
  18. 计算机日期函数公式大全,常用的Excel日期函数大全
  19. 75个顶级开源安全应用(1)
  20. android 中怎么实现点击了对话框的按钮以后对话框不会消失,android 中怎么实现点击了对话框的按钮以后对话框不会消失...

热门文章

  1. c mysql转sqlite_SqliteToMysql
  2. ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测
  3. 成功解决sklearn\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 i
  4. TF之DD:利用Inception模型+GD算法生成带背景的大尺寸、高质量的Deep Dream图片
  5. IDE之Jupyter:交互式文档Jupyter Notebook简介、安装、使用方法详细攻略
  6. L1,L2正则化分析
  7. HaoheDI让ETL变得简单
  8. eclipse创建spring boot项目加载不到application.properties配置文件
  9. HDU2199,HDU2899,HDU1969,HDU2141--(简单二分)
  10. 数据库范式的思考以及数据库的设计