关键词:嵌套循环,杨辉三角。

这个题是32位ELF,先看主函数:

初始化了一个全局数组,我给它命名为 DwordArray ,因为根据后面对它的寻址可以知道这是一个4字节数组。然后循环 scanf 读取整数,直到读取到0为止。

接下来调用 Check1 ,参数是 DwordArray:

检查 Check1 的返回值,等于 -1 就表示输入错误,继续看下面的代码,发现必须返回 20 才行:

Check1 必须返回 20,后面还有一个 Check2 函数,但是说实话其实可以不用看了,把 Check1 分析明白了基本就能猜出密钥。接下来分析 Check1。

Check1 长这样,有嵌套循环,这种函数比较复杂,我做题的时候是一边逆向一边还原成C代码的,还原后用F5检查,如果基本一致就没问题了,如果有不一致的,就要仔细检查是代码还原有错还是F5的错。

外层循环了 0x400 次。

这是内层循环,观察 DwordArray 的寻址,有乘以4表示元素大小是4字节,下面给出我还原的代码:

基本上大同小异,接下来要看看能从 Check1 获取到什么信息。外层循环,每次循环对 result 加 1,最后返回时必须等于 20,我们写脚本的时候,要看看 result 什么时候等于 20。i 和 j 的值我们写脚本的时候是知道的,但是 DwordArray 的值不知道,所以只能假设。我们可以对照着还原的代码,写出这样一个脚本:

def Check1():result = 0  # 返回时必须等于20i = 0while i <= 1024:var_10 = 0j = 0if result == 20:print("现在 result %d 等于 20,如果 DwordArray[%d] 等于0,就可以正确返回 20" % (result, i))returnelse:print("现在 result %d 不等于 20" % (result))while j <= result:# 注意 这一步还没做print("var_10 += DwordArray[%d]" % (i + j))j += 1print("var_10 必须等于 ", 1 << result)result += 1i = (result + 1) * result / 2print("---------------------------------------")Check1()

我们从 Check1 能够获取的信息就是这些了,我们知道第0个元素是1,第一和第二个元素求和等于2,而它们不能是0,所以只能是两个1,然后3到5这3个元素求和是4,这个组合就无法确定了,可能是 1 1 2,1 2 1,2 1 1 。如果是 1 2 1 的话,感觉就很像杨辉三角了,杨辉三角每行的求和就是2的行数次方,所以大胆猜测密钥就是杨辉三角。下面只需要写一个脚本打印杨辉三角前20行的值就行了。

# 打印20层杨辉三角
def yanghui():n = 20m = 20arr = [[0 for i in range(n)] for j in range(m)]for i in range(20):for j in range(20):if j == 0 or i == j:arr[i][j] = 1for i in range(20)[1:]:for j in range(20)[1:]:arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]for i in range(20):for j in range(20):if arr[i][j] != 0:print(arr[i][j], end="")yanghui()

1111211331146411510105116152015611721353521711828567056288119368412612684369111045120210252210120451011115516533046246233016555111112662204957929247924952206612111378286715128717161716128771528678131114913641001200230033432300320021001364911411151054551365300350056435643550053003136545510515111612056018204368800811440128701144080084368182056012016111713668023806188123761944824310243101944812376618823806801361711181538163060856818564318244375848620437583182418564856830608161531811191719693876116282713250388755829237892378755825038827132116283876969171191

把这一长串拿去做md5,就能得到flag。提交发现是正确的,所以 Check2 就不用看了。


但实际做题的时候我一开始没猜到是杨辉三角,我把 Check2 也还原了,也是嵌套循环:

说实话还原完 Check1 和 Check2 我还是一脸懵逼,我做这题完全是靠猜的。但是问题不大,主要锻炼的还是逆向分析的能力嘛。。。

【攻防世界015】notsequence相关推荐

  1. 【攻防世界001】Guess-the-Number

    攻防世界之前刷了几十题了,没写wp,感觉很简单没啥意思.后来参加了几次比赛,发现有点干不动,决定还是老老实实刷题好了.这是第一篇wp,这题很简单,是个jar,用jd-gui可以得到java源码. 原来 ...

  2. 攻防世界(pwn)--Mary_Morton 利用格式化字符串+栈溢出破解Canary的保护机制

    ctf(pwn) canary保护机制讲解 与 破解方法介绍 程序执行流程 有三个选项,1是利用栈溢出,2是利用格式化字符串,3是退出;可连续输入多次; IDA分析 解题思路 程序存在canary保护 ...

  3. 攻防世界(Pwn) forgot---栈溢出;(方法二)

    攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...

  4. 攻防世界(Pwn) forgot---栈溢出;(方法一)

    攻防世界(Pwn) forgot-栈溢出:(方法二) 介绍 这道题表面看起来有点复杂,其实很简单,有两种方法可以来做这一道题; 方法一(精确打击) 文件运行流程是: 1.先输入名字 2. 输入一串字符 ...

  5. 攻防世界misc新手_[攻防世界]mobile新手练习区easy-apk

    [攻防世界]mobile新手练习区easy-apk easy-apk最佳Writeup由129师386旅独立团 • devi1提供 难度系数: 7.0 题目来源: 暂无 题目描述:无 题目场景: 暂无 ...

  6. 攻防世界 ——crypto

    目录 新手区部分题解: 1,easy_RSA 2,Normal_RSA 3, 幂数加密 4,easy_ECC 高手进阶区部分题题解 5, ENC 6,告诉你个秘密 7,Easy-one 8,说我作弊需 ...

  7. 攻防世界———MISC 高手区题解

    目录 1,base64stego 2,easycap 3,Avatar 4,What-is-this 5,签到题 6,Training-Stegano-1 7,Excaliflag 8,Get-the ...

  8. 攻防世界 web(二)

    这周接着刷攻防世界的web题( ̄︶ ̄)↗ 1.command_execution 看提示这题为命令执行漏洞(command_execution),关于命令执行漏洞,我前面有篇博客详细介绍了,大家不了解 ...

  9. misc高阶 攻防世界_攻防世界 Misc 进阶题(一)

    攻防世界 Misc 进阶题(一) 关于隐写术的思路或方法 转载: https://blog.csdn.net/a_small_rabbit/article/details/79644078     隐 ...

最新文章

  1. FFmpeg集成到GPU
  2. yapi-docker
  3. 【SICP练习】94 练习2.67
  4. MyEclipse:Available memory is low解决办法
  5. 电话光端机使用什么光纤网络比较好?
  6. 【征稿通知】CCF第37届中国计算机应用大会 CCF NCCA 2022
  7. 宁波海曙区服务器维修,宁波市海曙区第二医院关于服务器(备份一体机) 1套的在线询价公告...
  8. 关于STM32没有硬件浮点单元的纯经验之谈,是否可以在stm32上用float运算?
  9. tomcat配置线程参数maxThreads、acceptCount
  10. java获取当前服务器用户_从授权服务器获取资源服务器中的用户角色
  11. linux中如何复制文件并重命名_在 Linux 上复制和重命名文件
  12. 【Excel自动化办公Part5】:设置行高和列宽、合并单元格、取消合并单元格
  13. 面试经典必问:ReentrantLock 中CLH队列
  14. 码斗士的修炼之路 -- 如何保持并提升战斗力
  15. python获取arduino数据可视化_Arduino数据可视化在实验教学中的应用
  16. 网络维护工程师的要求是什么?
  17. 基础30讲 第11讲 多元函数微分学
  18. MFC CStdioFile简单用法
  19. smart-link monitor-link
  20. 老牌好用免费的数据恢复软件easyrecovery操作简单一键恢复

热门文章

  1. 成功解决Exception “unhandled ImportError“cannot import name ‘imread‘ from ‘scipy.misc‘
  2. 成功解决 raise RuntimeError(“The JPMML-SkLearn conversion application has failed. The Java executable
  3. Bug总结:python语言中出现的import error错误的解决思路
  4. Python的IDE之PyCharm:PyCharm的简介、安装、入门、使用方法之详细攻略
  5. docker 的mysql镜像使用手册 官网原文 日期2017-05-25
  6. 探秘Java中String、StringBuilder以及StringBuffer
  7. 奇奇怪怪的小姿势——关于UI的各种Position
  8. python+requests+re匹配抓取猫眼上映电影信息
  9. MATLAB在数学建模中的应用(三)
  10. 用jquery ajax做的select菜单,选中的效果