h



Web

  • 谁吃了我的flag
    hint: 据当事人回忆,那个夜晚他正在用vim编写题目页面,似乎没有保存就关机睡觉去了,现在就是后悔,十分的后悔。

根据提示可以知道这和vim的缓存文件有关
vim会在编辑文件的时候生成一个.swp的缓存文件, 用于意外退出时恢复未保存的文件
目的很明确 下载这个文件
url后面加上/.index.html.swp下载.swp 用winhex打开即可找到flag

  • can u find me?

    几个web基础知识
    f12找到f12.php 需要post密码
    可以在头里找到password: woyaoflag
    用Hackbarpost一个password=woyaoflag
    把得到的链接下载下来得到flag

Re

  • brainfxxker

有点像一个vm 直接编译可以运行
随便输入一点东西会返回一堆连续的字符
尝试将指令整理一下 可以发现当最后需要操作的字符为0x00时会停止当前打印字符串的循环
尝试让其只循环一次 构造出几个方程 解方程可得flag

 

  • わかります

程序把输入分成了高低位两个数组
都是6 * 6的矩阵 低位和一个已知矩阵进行加运算 高位进行乘运算
最后进行明文对比
低位减回去 高位求个逆乘回去 然后重新组合一下即可求出flag

 

  • ShinyShot!

//ida里看到两个tls, 应该是反调试的, 但是似乎没起作用…
程序最后要满足一个strcmp
其中一个字符串来自程序最后0x20个字节
程序一共有两个输入 第一个是int 被传入了sub_401460 里面有两个 VirtualProtect
发现并不是SMC, 只是中间异或了401000某偏移的某一值
再往下程序fgets了一个长度为22的字符串 然后丢到sub_4014fa
进入sub_4014fa看起来像一个base64编码的过程
shift+F12查找到加密表, 显然不是标准的base64
sub_4014fa最后将编码出来的字符串前后异或了一下
这里似乎编码后的字符串没有用到, 开始动态分析
这里运行程序程序随便输入一个(无符号整)数(不大于131072) 和一个长22到字符串, 发现程序会崩溃

动态分析看看程序崩溃在了哪里
od依靠字符串定位到main函数 第一次同样随便输入一个数
往下步过到0x4018de的地方发现一个无条件跳转, 直接跳到了0x4018f5的call sub_4014fa //进入了base编码的函数
显然函数没有传参因此导致了崩溃
我们重新设置一下EIP, 程序成功得到了编码后的字符串, 并与程序二进制文件最后0x20个字符进行strcmp

这里先将已知的字符串xor回来

再对换表base解码//工具: RandomBase64 可以自定义密码表
得到flag前半部分
输入的整数要把0x4018df处的0x15修改成0x05
整数>>3后是偏移0x8df, 1 << (整数 & 7)是拿来和0x15异或的 所以得到整数是(0x8df<<3) + 4 //0x15^0x5== 0x10 ==1<<4 得到整数0x46fc == 18172

  • brainfxxker’s revenge

又是一个brainfxxk
足足上千个符号, 显然不可能一个个看懂的//当然也不可能个个都有意义
稍微读几个, 发现>和<, +和- 是互逆的操作, 所以删掉所有的<> >< +- -+这几个组合, 基本上化简了很多
运行程序发现程序需要输入很多的字符, 然后会有提示信息"wrong answer!" or "congratulations!"
在switch下个断点, 发现程序没有执行case '.': putchar(*ptr);这一句, 说明还有花代码
但是程序获取输入可以确定是 ' , ' 号, 但是一搜索发现足足有上千个//显然不会每个都执行
再观察最后输出反馈信息的语句, 发现判断了data一个标识位是否有值
在最后的default: putchar(*i);下个断点, 观察data数组
可以看见判断了data[0] 如果有值就输出"wrong answer!", 并且data[0]的值可能会随不同的输入变大或变小//能猜到如果输入正确则data[0]不加1///构造hgame开头的字符串可以验证
下断点稍微跟程序跑一下, 发现每一次输入主要依靠,>++...
在前面加个换行整理一下, 一共72行//正好就是data[0]的最大值, 也是输入的字符串长度
//其中[-]这个结构是用来归零循环标志位的
把没有进入的循环删除掉
再稍微整理一下得到

得到flag

misc

  • Try

得到一个数据包
筛选出http 找到包含zip的包, 选定media type的位置, 点击file->export selected Packet Bytes, 在弹出的框中将文件保存成二进制文件

一个password.txt和一个带密码的压缩包
掩码爆破hgame????????得到压缩包密码
解压出一张图片 binwalk可以发现有个压缩包 提取出来是伪加密 改一下标识位
得到.docx 把docx解压找到word文件夹 有个文件里有flag

 

Crypto

  • perfect_secrecy!

一个py脚本 flag和 poem.txt 未知
提示OTP(一次性密码)
题中多次用一个随机密码按位异或明文
因此密文相互异或就可以干掉一次性密码
然后分析出明文
git上找到脚本

这里只选用了11行密文进行修复
可以发现其中

能基本识别出正常含义
谷歌这句话 发现是一首由乔治·戈登·拜伦创作的诗歌《When We Two Parted》中的第一句话

When we two parted in silence and tears

那么一条明文出来了 把这句话和第一条密文按位异或 就可以推出随机的密钥了

最后拿密钥按位异或被加密的flag 得到flag