Skip to content

Latest commit

 

History

History
155 lines (67 loc) · 9.07 KB

README.md

File metadata and controls

155 lines (67 loc) · 9.07 KB

write-up

Silver_Bullets 邓龙

黑曜石浏览器

前面的题中花时间最长的一道,初看题显然是要改HTTP头的UA(计网刚学的这点知识还挺有用),但是试了很多种都没成。

于是真的去Google黑曜石浏览器,发现了一个疑似官网的页面,可是下载也要黑曜石浏览器注册。由于没想到flag真的放在外网上,就以为该网站只是出题人的恶作剧,右键点不动也没在意,简单的加了“view-source:”看了看html,没看出什么特别的,就回去继续构造UA了(还在官网上看到v0.0.2版本发布以为是版本号)。

第二天走投无路又回网站上看,手动进入开发者工具,发现疯狂刷新就觉得有了。点调试暂停看到代码,里面有UA(只是把某个Chrome版本的UA中Chrome改成了HEICORE),利用该UA访问得到flag。

回到过去

题目文件是古老电脑使用ed键盘记录,Ubuntu直接由ed,直接输入实验一下,大致知道什么意思。可惜有个不明字符ESC,查了查ed好像也没有ESC开头的用法。想到是电脑的用法,又查了查题目中的VT 100,也没找到。然后查到ESC原本是escape,也就是转义字符的开头,查escape C找到的……原来是清空屏幕,无视两个字符得到正确答案。

我是谁

网页中询问:Can you tell me **who I am**?

输入who I am,失败。

输入I,失败。

返回的网页中有:I am not really sure whether your answer is right.

输入rightright.is right,均失败。

下一行有:You should probably try again.

输入againagain.,仍然失败。

只能说出题人不按套路来。

其实用curl看了看返回的HTTP头,就能看到“I'm a teapot.”(我会说我其实起码第十遍看的时候才看到吗),输入teapot,得到第一个flag。

第一个flag的页面指向另一个链接,要就用other methods 访问,学习一下HTTP知识,发现原来的method是GET,于是改成POST实验,提示POST不推荐,并要求查看RFC 7168。看后是一个恶搞协议HTCPCP-TEA,用于控制茶壶,有新方法BREW,再实验,提示HTTP头少了东西。然后就是痛苦的阅读英文协议时间,许久过后,发现需加上fieldContent-Type: message/teapot,返回信息中有选择茶的类型(貌似只有black_tea),再按要求发送请求得到flag。

她的诗

给的脚本使用UUdecode解码,搜索uucode编码的格式,每行第一个字符表示总长度,稍微改大一些得到隐藏内容。

她的礼物

做出的三道逆向中的最后一道。

逆向题,读汇编读不动,在Ubuntu下用ida free反汇编后,在到windows下用盗版ida pro反编译。

全是蜜汁跳转和蜜汁常数,只看到主循环是循环23333次歌词,但是中间有sleep,而直接运行也只看到一次歌词,于是感觉跟时间有关。看了一天直叫f**k,总之看到最后的错误代码是在响铃的handler中出现的,于是知道阻止响铃就行了。开始改了if的跳转,让其不跳到响铃的分支,似乎太naive了破坏了程序结构,跑完也没输出什么……重新开始后只是把所有call alarm都nop掉,(还有朝tty5输出\acall system,当然sleep也要去掉,否则可以等一年)。运行程序重定向输出到文件,最后输出了100+MB的文件,用python在文件中找到flag(似乎是在最后,不过文件太大了gedit拉不到底)。

C语言作业

稍微反汇编查看代码,其实啥都没看就看到有个字符串,大意是程序崩溃,你可以运行一条指令。这好啊,让程序崩溃就行,可惜除以0被判断了。

一年前hjy和我提到过关于tmin的另一个崩溃方法,实验了一下tmin/-1也会崩溃。进服务器,崩溃后ls看到根目录下有flag文件。各种cat不成,又回去看代码,发现禁用了sh,以为需要用什么方法绕过strstr函数运行sh。期间尝试过s\h这样的奇葩方式,都没用。

只好再回去看代码,发现用%10s读取的程序名执行,所以空格也没用,而且大概是bin中的某个程序。

bin中没有参数还能输出的程序不多,某天晚上就想到了vi。本地实验成功,结果服务器上失败了。改成vim成功进入vim(为什么有vim没vi),依次查看flag文件和-文件得到flag。

猫咪克星

要求模仿python,想法当然是用eval执行返回啦,结果总是莫名卡死,把运行的指令输出出来,发现有sleep,解决掉后居然还有print和exit,太可恶了。事实上我甚至不知道exit的返回值是啥(都结束了还返回个啥)。尝试把奇怪的函数简单地字符串替换成None,成功。

猫咪电路

进入mc发现只是一个与或非异或门构成的电路,基本四个四个一组,甚至不需要明白什么意思,反正每四个答案唯一的那种搭配就一定是对的(否则flag就不唯一了)。最后8个互相有关联,稍微分析一下就好。

加密算法和解密算法

本来想手动翻译化简,太难了……

精心搜索后在 https://zhuanlan.zhihu.com/p/42721066 中发现一个工具 https://www.nayuki.io/page/optimizing-brainfuck-compiler ,将brainfuck翻译且用神奇的算法化简成C语言。

化简后的程序看上去就是把读入的数的某些倍数加到答案某位上,手动画了第一个数字,发现是矩阵乘法嘛。分析一下,大概是以下形式

y = x*A + 8*x*B

其中x,y是(1,10)的向量,A,B是(10,10)的矩阵

由分配率

C = A + 8*B
y = x * C 

似乎求出C的逆就行。

……

果然没有那么简单,原来brainfuck还有每个单元mod 256的自然溢出,最后的结果还是mod 64的结果。本来想是不是可能有限暴力枚举一下,算了一下时间根本不可接受。

于是百度(没错,就是百度)“逆矩阵 模意义”什么的,学习了一下,原来如果模意义下行列式与模数M有逆元,则矩阵有逆,而且还是伴随矩阵*行列式的形式。

自己试着写了一下,貌似错了……(马上就要acm了连这种代码都写不对)

继续查找相关资料,Google上找到一篇课件 http://math.ecnu.edu.cn/~jypan/Teaching/SciComp/lect04A.pdf ,知道这种密码叫Hill加密,然后在某乎上找到一份python代码 https://www.zhihu.com/question/32675322 ,有些小错误,改改试着一跑,的确有模意义逆矩阵,成了。

对了,由于最后MOD 64,直接当模数是64就行,自然溢出MOD 256正好是64的倍数,可以无视。

困惑的flxg小程序

做出的第一题逆向(不算C语言作业,那题没什么逆向的工作)

直接运行会出现假的flxg,在IDA里简单看看发现参数要正好60个,随便输59个参数(包括程序名本身正好60个),进入一个看起来是判断flxg对不对的地方。然而和在IDA里调试运行跑的结果不同,IDA里直接进入了异常,单步运行会到某些int 3卡组调试器……总之搞了一整天没搞懂是什么情况。

最后直接找到输出flxg的函数翻译,用了一个大大的数组,所有变量都用数组里面的某段来存,搞得非常乱七八糟。

手动慢慢分析了一下,除了一段从参数复制进来的字符串意义不明,剩下的大概就是把字符串经过一个神秘函数加密,之后反转,第i位异或i和内存里的数据比较。

显然猜测参数进来的字符串是输入了。对内存里那段数据反着做一遍到加密后的部分,得到一串全是字母的字符串,看起来就像base64(因为fake flxg用的也是base64),丢进网站解码得flxg。

数理基础扎实的发烧友

做出这题是不是说明我的数理基础还可以……

给了一个图片文件和一个exe。看图是个信号处理,看上去是某种模数转换,对着发呆了一下没看懂,开始就把这题扔了。

过了几天回来看,直接搜索大大的DSD得DSD,知道是用ΔΣ调制搞的某种信号处理。用途是把PCM转换成PWM。

学习暂到此为止,回去尝试运行和反汇编那个程序,程序里函数名都是好的,全drwav啥的,在网上找到这个库dr_wav,原来是个处理wav的库,大概读一下,就能知道程序读入一个wav文件,经过线性插值(看函数名知道的)拓展成原来64倍长,然后经过一个奇怪函数(稍微研究知道是图上的处理过程)处理后,存在图片的每字节最后一位中。

于是倒过来解码只有吧处理过的部分还原回去一个问题,到wiki上看图参悟了一下。知道1的频率越高原来的值越大。直接每64位算算1的比例映射到(-1,1)即可。

用别的wav文件试了试的确能正确还原,还原题目图片得到一个电话拨号声,有去年题目熟悉的经验很快能做出来,比如丢进这里在线工具