notsequence 攻防世界

工具

DIE+IDA+杨辉三角

思路展开
1.查壳和位数

无壳32位

2.IDA启动check

整体逻辑简单,输入有两个check函数来检验,flag是md5加密输入。
首先介绍一波杨辉三角

[1] #0 /1 |2^0=1
[1, 1] #1 /2 |2^1=2
[1, 2, 1] #3 /3 |2^2=4
[1, 3, 3, 1] #6 /4 |2^3=8
[1, 4, 6, 4, 1] #10 /5 |2^4=16
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]

有4种描述方式
(1)最左边代表行号,1就是第1行。
(2)第1个字符在数组中的位置,#后的数字。
(3)一行的有几个数字 /后的内容。
(4)整行的和。|后的内容

check1check1

小细节:*(_DWORD *)(4 * i + a1)–>a1[i]

check1里的i的给法是等差数列,就感觉不对劲,i是等差序列的取法,这也不是遍历或者有规律的遍历(每次检查第四个)
如何看出是杨辉三角:
1.每次开头取的位置是等差数列符合4种描述中的(2)
2.每次把后面k个数(这里是用数组方式取得,所以若包括最开头的那个数,一共取了k+1个数的和),k+1数的和等于2`k,符合4种描述中的(3)(4)

check2check2

可以看作[0]—[k-1]行的[j]列求和等于[k]行的[i]
杨辉三角的特征之一(下面的示意图)
1+1=2
1+3=4
演示
现在思路明确20行的杨辉三角的数,再md5加密就是flag

3.脚本
def YHsj(row):
    result = [1]
    n = 0
    while n < row:
        if n < 1:
            yield result
        else:
            a = 1
            t = tuple(x for x in result)
            result = [1, 1]
            while a < n:
                result.insert(a, t[a-1]+t[a])
                a += 1
            yield result
        n += 1
 
 
g = YHsj(20)
x=''
for t in g:
    x+=''.join(map(str,t))
print(x)

打印20行的杨辉三角
flag
RCTF{37894beff1c632010dd6d524aa9604db}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值