NJUST CTF 2018 Writeup

本文详细介绍了NJUST CTF 2018比赛中的多个挑战,包括Misc、Crypto、Reverse Engineering和Pwn等类别,涉及解码、密码学、图像分析和栈溢出等多个技术点,通过解密和分析,成功获取flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NJUST CTF 2018 Writeup

Supernova, Nanjing University frostwing98,Trap,Arcadia

MISC1 签到

by Arcadia

一路调戏ai之后(误)可以得到一串base64编码的字符串,在线解码得到flag

MISC2 GIF

by frostwing98

下载到gif,发现是不断闪烁的黑/白画面,第一考虑是莫尔斯电码。首先http://tu.sioe.cn/gj/fenjie/分解之。

发现间隔并不均匀,也不按照1:3:5的比例。因此考虑01串的可能性。

后来题目有调整,也分好了每一帧。

我们发现,总共有91个图片,如果是ASCII,应该是8的倍数才对。

我们应该知道,ASCII的可打印字符,高位始终不会大于7,也就是0111.因此最高位其实可以省略。为此我们又发现,91=7×13,进一步验证了这个猜想。

因此将13×7个bit,每7个一组,最高位加上0,就能够构成flag的13个字符。


MISC3 code

by Arcadia

纯编程题,利用在线文字识别工具获取图片中的每个数字,存放在文件中,用算法模拟贪吃蛇移动路线,用辗转相除法计算最大公约数跟最小公倍数,最后得到flag。

C++代码:

#include <iostream>
#include <fstream> 
#include <string>
#include <cmath>using namespace std;
​
int gcd(int a,int b){ return a%b==0?b:gcd(b,a%b);}
​
int main()
{
 
    int x=0,y=0;
    int p,q;
    int sum=25*25-1,value=0,temp,ans;
    int state=1;
    ifstream input
### 南京理工大学程序设计基础复习题 #### 后序遍历二叉树 对于给定的二叉树结构,后序遍历是一种重要的遍历方式。该方法先访问左子树,再访问右子树,最后访问根节点。 ```cpp void postOrder(BTPtr bt){ if(bt != NULL){ postOrder(bt->lchild); postOrder(bt->rchild); printf("%c\t",bt->data); } return; } ``` 这段代码展示了如何实现二叉树的后序遍历[^3]。通过递归调用函数本身来完成对左右子树的操作,在最终打印当前节点的数据之前确保所有的子节点已经被处理过。 #### 符号表示法及其意义 在算法复杂度分析中,常用到一些特定符号来描述时间复杂度: - \( t(n)\in\theta(g(n)) \) 表达的是当输入规模 n 趋向于无穷大时,\( t(n) \) 和 \( g(n) \) 的增长速度基本一致; - \( t(n)\in\Omega(g(n)) \),意味着存在常数 c 及正整数 N ,使得对于所有大于等于 N 的 n 值都有 \( ct(n)>=g(n) \) 成立; - \( t(n)\in O(g(n)) \),则表明无论取何正值 ε ,总能找到一个足够大的自然数 M ,只要 n>M 就有不等式 \( |f(x)|<=ε|g(x)| \) 对一切实数 x 满足条件成立; 这些概念有助于理解不同算法之间的效率差异以及它们随数据量变化的趋势[^2]。 #### 分治法的应用场景 分治法适用于能够被分解成若干独立且相似的小问题的大问题求解场合。这类问题通常具备以下几个特点: 1. 一个问题可以划分成多个更小规模相同的子问题; 2. 子问题是相互独立互不影响; 3. 解决方案可以通过组合各个子问题的结果获得整个原问题解答。 此方法不仅提高了计算效率还简化了解决思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值