0x01 前言(第一次用这种小标题(p≧w≦q))
怎么说呢。。。这次的题(理论题交给队友了没看)简单的一眼就能出,难的好几眼也出不来。。。。第一次CTF题做不完。。。<( _ _ )>
我不管~我的队友是最棒的!!!!!!!!(≧∇≦)ノ
0x02 WP主体
鉴于比赛环境已经关掉了,我把比赛题干内容附在文章里,文件链接在文末,需要自取昂~(*_*)
Question 1 猫里奥
题干:比赛不要紧张,放松一下,玩个游戏吧。通关了你就有flag,逆向可没有用,只能通关哦。
好的,这个题,无疑属于好几眼出不来的那种ヽ(*。>Д<)o゜
猫里奥嘛~虽然题目里说不能逆向,本着对出题人的不信任,查信息,IDA走一波( ̄▽ ̄)"


好的。。。这个代码量。。。第一题。。。我还是乖乖去玩游戏吧。(;′⌒`)
百度个攻略先~之后照着攻略玩♂游♂戏(咳咳,要正经要正经(默念))
结果每次都死在旗杆那里(跳不过去啊啊啊啊)。。。。。。(╯‵□′)╯︵┻━┻


于是这个题就交给队友了。不过队友也没有做出来。(但他们依然是最棒哒(傲娇))
PS:似乎比赛结束后听说通关了也没有flag。。。。。。ಥ_ಥ
PPS:后来又听说某个BGM是摩斯电码。。。_(:з」∠)_
PPPS:后来又听说通关的过程中建筑物上有字母。。。。(越来越离谱了啊喂(#`O′))
Question 2 你真的知道隐写术吗
下载附件,发现压缩包里是张图片~へ(゜∇、°)へ
那就先看看十六进制(我一看)0.0
果然发现了问题(•̀⌄•́)

这个文件头明显是有问题的( '▿ ' )
并且。。。这问题。。。不是一般的大啊。。没有文件头。。IHDR区错误。。后面好像也不太对。。_(´□`」 ∠)_
于是找了一个PNG的格式解析。
以下内容摘自https://www.cnblogs.com/lidabo/p/3701197.html
为了实现更高级的应用,我们必须充分挖掘PNG的潜力。
PNG的文件结构
根据PNG文件的定义来说,其文件头位置总是由位固定的字节来描述的:
十进制数 | 137 80 78 71 13 10 26 10 |
---|---|
十六进制数 | 89 50 4E 47 0D 0A 1A 0A |
其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件来处理。文件中剩余的部分由3个以上的PNG的数据块(Chunk)按照特定的顺序组成,因此,一个标准的PNG文件结构应该如下:
PNG文件标志 | PNG数据块 | …… | PNG数据块 |
---|---|---|---|
PNG数据块(Chunk)
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
下表就是PNG中数据块的类别,其中,关键数据块部分我们使用深色背景加以区分。
PNG文件格式中的数据块 | ||||
---|---|---|---|---|
数据块符号 | 数据块名称 | 多数据块 | 可选否 | 位置限制 |
IHDR | 文件头数据块 | 否 | 否 | 第一块 |
cHRM | 基色和白色点数据块 | 否 | 是 | 在PLTE和IDAT之前 |
gAMA | 图像γ数据块 | 否 | 是 | 在PLTE和IDAT之前 |
sBIT | 样本有效位数据块 | 否 | 是 | 在PLTE和IDAT之前 |
PLTE | 调色板数据块 | 否 | 是 | 在IDAT之前 |
bKGD | 背景颜色数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
hIST | 图像直方图数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
tRNS | 图像透明数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
oFFs | (专用公共数据块) | 否 | 是 | 在IDAT之前 |
pHYs | 物理像素尺寸数据块 | 否 | 是 | 在IDAT之前 |
sCAL | (专用公共数据块) | 否 | 是 | 在IDAT之前 |
IDAT | 图像数据块 | 是 | 否 | 与其他IDAT连续 |
tIME | 图像最后修改时间数据块 | 否 | 是 | 无限制 |
tEXt | 文本信息数据块 | 是 | 是 | 无限制 |
zTXt | 压缩文本数据块 | 是 | 是 | 无限制 |
fRAc | (专用公共数据块) | 是 | 是 | 无限制 |
gIFg | (专用公共数据块) | 是 | 是 | 无限制 |
gIFt | (专用公共数据块) | 是 | 是 | 无限制 |
gIFx | (专用公共数据块) | 是 | 是 | 无限制 |
IEND | 图像结束数据 | 否 | 否 | 最后一个数据块 |
为了简单起见,我们假设在我们使用的PNG文件中,这4个数据块按以上先后顺序进行存储,并且都只出现一次。
数据块结构
PNG文件中,每个数据块由4个部分组成,如下:
名称 | 字节数 | 说明 |
---|---|---|
Length (长度) | 4字节 | 指定数据块中数据域的长度,其长度不超过(231-1)字节 |
Chunk Type Code (数据块类型码) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data (数据块数据) | 可变长度 | 存储按照Chunk Type Code指定的数据 |
CRC (循环冗余检测) | 4字节 | 存储用来检测是否有错误的循环冗余码 |
CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。CRC具体算法定义在ISO 3309和ITU-T V.42中,其值按下面的CRC码生成多项式进行计算:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
CRC: 一种校验算法。仅仅用来校验数据的正确性的
下面,我们依次来了解一下各个关键数据块的结构吧。
IHDR
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
文件头数据块由13字节组成,它的格式如下表所示。
域的名称 | 字节数 | 说明 |
---|---|---|
Width | 4 bytes | 图像宽度,以像素为单位 |
Height | 4 bytes | 图像高度,以像素为单位 |
Bit depth | 1 byte | 图像深度: 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:8或16 |
ColorType | 1 byte | 颜色类型: 0:灰度图像, 1,2,4,8或16 2:真彩色图像,8或16 3:索引彩色图像,1,2,4或8 4:带α通道数据的灰度图像,8或16 6:带α通道数据的真彩色图像,8或16 |
Compression method | 1 byte | 压缩方法(LZ77派生算法) |
Filter method | 1 byte | 滤波器方法 |
Interlace method | 1 byte | 隔行扫描方法: 0:非隔行扫描 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法) |
由于本文很多设计到了PNG在手机方面的应用,因此在此提出MIDP1.0对所使用PNG图片的要求:
- 在MIDP1.0中,只可以使用1.0版本的PNG图片。
- 文件大小:MIDP支持任意大小的PNG图片,然而实际上,如果一个图片过大,会由于内存耗尽而无法读取。
- 颜色类型:所有颜色类型都有被支持,虽然这些颜色的显示依赖于实际设备的显示能力。同时,MIDP也能支持alpha通道,但是,所有的alpha通道信息都会被忽略并且当作不透明的颜色对待。
- 色深:所有的色深都能被支持。
- 压缩方法:仅支持deflate压缩方式,这和jar文件的压缩方式完全相同,所以,PNG图片数据的解压和jar文件的解压可以使用相同的代码。
- 滤波器方法:在PNG中所有的5种方法都被支持。
- 隔行扫描:虽然MIDP支持0、1两种方式,然而,当使用隔行扫描时,MIDP却不会真正的使用隔行扫描方式来显示。
- PLTE chunk:支持
- IDAT chunk:图像信息必须使用5种过滤方式中的方式之一 (None, Sub, Up, Average, Paeth)
- IEND chunk:当IEND数据块被找到时,这个PNG图像才认为是合法的PNG图像。
- 可选数据块:MIDP可以支持下列辅助数据块,然而,这却不是必须的。
bKGD cHRM gAMA hIST iCCP iTXt pHYs
sBIT sPLT sRGB tEXt tIME tRNS zTXt
PLTE
调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
颜色 | 字节 | 意义 |
---|---|---|
Red | 1 byte | 0 = 黑色, 255 = 红 |
Green | 1 byte | 0 = 黑色, 255 = 绿色 |
Blue | 1 byte | 0 = 黑色, 255 = 蓝色 |
因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。
真彩色图像和带alpha通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
IDAT
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。
IEND
图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:
00 00 00 00 49 45 4E 44 AE 42 60 82
不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。
实例研究PNG
以下是由Fireworks生成的一幅图像,图像大小为8*8,
为了方便观看,将图像放大:
使用UltraEdit32打开该文件,如下:
00000000~00000007:
可以看到,选中的头8个字节即为PNG文件的标识。
接下来的地方就是IHDR数据块了:
00000008~00000020:
- 00 00 00 0D 说明IHDR头块长为13
- 49 48 44 52 IHDR标识
- 00 00 00 08 图像的宽,8像素
- 00 00 00 08 图像的高,8像素
- 04 色深,2^4=16,即这是一个16色的图像(也有可能颜色数不超过16,当然,如果颜色数不超过8,用03表示更合适)
- 03 颜色类型,索引图像
- 00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)
- 00 同上
- 00 非隔行扫描
- 36 21 A3 B8 CRC校验
00000021~0000002F:
可选数据块sBIT,颜色采样率,RGB都是256(2^8=256)
00000030~00000062:
这里是调色板信息
- 00 00 00 27 说明调色板数据长为39字节,既13个颜色数
- 50 4C 54 45 PLTE标识
- FF FF 00 颜色0
- FF ED 00 颜色1
- …… ……
- 09 00 B2 最后一个颜色,12
- 5F F5 BB DD CRC校验
00000063~000000C5:
这部分包含了pHYs、tExt两种类型的数据块共3块,由于并不太重要,因此也不再详细描述了。
000000C0~000000F8:
以上选中部分是IDAT数据块
- 00 00 00 27 数据长为39字节
- 49 44 41 54 IDAT标识
- 78 9C…… 压缩的数据,LZ77派生压缩方法
- DA 12 06 A5 CRC校验
IDAT中压缩数据部分在后面会有详细的介绍。
000000F9~00000104:
IEND数据块,这部分正如上所说,通常都应该是
00 00 00 00 49 45 4E 44 AE 42 60 82
至此,我们已经能够从一个PNG文件中识别出各个数据块了。由于PNG中规定除关键数据块外,其它的辅助数据块都为可选部分,因此,有了这个标准后,我们可以通过删除所有的辅助数据块来减少PNG文件的大小。(当然,需要注意的是,PNG格式可以保存图像中的层、文字等信息,一旦删除了这些辅助数据块后,图像将失去原来的可编辑性。)
删除了辅助数据块后的PNG文件,现在文件大小为147字节,原文件大小为261字节,文件大小减少后,并不影响图像的内容。
- 如上说过,IDAT数据块是使用了LZ77压缩算法生成的,由于受限于手机处理器
改了半天图片都不能正确显示,突然想到,IHDR块里的图片长宽好像是要通过CRC32爆破。。。于是乎找到了通用爆破脚本。▄█▀█●
import zlib
import struct
file = '222.png'
fr = open(file,'rb').read()
data = bytearray(fr[12:29])
#crc32key = eval(str(fr[29:33]).replace('\\x','').replace("b'",'0x').replace("'",''))
crc32key = 0xFB41C5BE
#data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00')
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
#print(data)
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print(width,height)
print(data)
newpic = bytearray(fr)
for x in range(4):
newpic[x+16] = width[x]
newpic[x+20] = height[x]
fw = open(file+'.png','wb')
fw.write(newpic)
fw.close
貌似长宽是最后爆破成功了。但是。。。为啥后面也需要修啊!咋修啊!(´ཀ`」 ∠)_
于是这个题也没做出来。。。。(但是接下来的好几道题都属于看一眼就能出的题。。。强烈吐槽组委会放置题目的顺序问题!!!(╯‵□′)╯︵┻━┻)
Question 3 excel破解
这个题貌似是要输入密码才能拿到flag,但是可以直接查看十六进制搜索到flag(或许直接查看十六进制是一种非预期解?!!!∑(°Д°ノ)ノ )

Question 4 来题简单的吧
题干:-- --- .-. ... . -.-. --- -.. .
直接上转换器。_(:з」∠)_

Question 5 低个头
题干:EWAZX RTY TGB IJN IO KL 请破解该密文
题目即为明显提示,键盘密码。_(:з」∠)_

Question 6 caesar
题干:gmbhjtdbftbs
题目即为明显提示,凯撒密码。_(:з」∠)_

Question 7 来题中等的吧
打开文件,发现是一个弱化了的音频隐写,直接转化为摩斯密码,转换即可。


Question 8 数据包分析
题干:如题,看着办吧
数据包的题嘛~简单的话导出个对象就好了(想歪的拖出去斩了吧)ε=ε=(怒°Д°)ノ


Question 9 送分题
题干:下载附件直接打开吧
为啥签到题会在这个位置啊!!!ε=ε=(怒°Д°)ノ
解压后有个3.txt,拉到最后即可。

Question 10 栅栏
题干:TEESCPEHRIAIHR
题目即为明显提示,栅栏密码。_(:з」∠)_

Question 11 回转
题干:请破译该密文 EzkuM0yGAzA2n3WbEaOJEHuOFmuOpN==
题目即为明显提示,ROT13密码。(好吧对于一些人并不是很明显。。以下摘自百科)_(:з」∠)_
ROT13(回转13位,rotateby13places,有时中间加了个减号称作ROT-13)是一种简易的置换暗码。它是一种在网路论坛用作隐藏八卦、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13被描述成“杂志字谜上下颠倒解答的Usenet对等体”ROT13也是过去在古罗马开发的凯撒加密的一种变体。ROT13是它自己本身的逆反;也就是说,要还原ROT13,套用加密同样的演算法即可得,故同样的操作可用再加密与解密。该演算法并没有提供真正的密码学上的保全,故它不应该被套用在需要保全的用途上。它常常被当作弱加密范例的典型。ROT13激励了广泛的线上书信撰写与字母游戏,且它常于新闻群组对话中被提及。


Question 12 有点简单的逆向
打开附件还是一波操作查信息丢IDAF5大法o(* ̄▽ ̄*)ブ


发现引入了很多数据,转化为字符,发现以下信息。!!!∑(°Д°ノ)ノ

猜测为字符串逆转函数,拼接即可~(这明明就是一道杂项题!)(▼ヘ▼#)
Question 13 磁盘取证
这也是一个我做了很长时间的题。。。虽然最后其实很简单,但我又相当于复习了一遍内存取证应用的使用,所以要好好说一说~(✿◡‿◡)
首先拿到这个文件看了一眼十六进制,排除了是VMDK取证的可能性。接下来尝试使用vol来取证,首先探测镜像类型,发现居然探测失败了。/(ㄒoㄒ)/~~

于是尝试将镜像挂载到mnt目录下,发现了TODO.me文件,怀疑是磁盘取证中的文件恢复,又因为存在lost+found文件夹,于是猜测flag可恢复,但是接下来又陷入了僵局。。。。(。•́︿•̀。)
tool@ubuntu:~/Desktop$ sudo mount 附件6 -o loop /mnt
tool@ubuntu:~/Desktop$ cd /mnt
tool@ubuntu:/mnt$ ls
lost+found TODO.me
tool@ubuntu:/mnt$ cat TODO.me
- 下班后一定要记得要给花浇水
- 家里的熊孩子总是乱删我电脑里的文件,愁死了,有时间了得想个办法。
- 去邻居家里取下快递
tool@ubuntu:/mnt$
尝试使用autopsy恢复文件,经过镜像挂载,确实发现了文件删除记录。(☆▽☆)

但是实在找不到恢复文件的方法,就在我鼓捣文件恢复的时候。。。我的队友说在十六进制下可以直接查到flag,简直是小天使有木有!!!!( ̄▽ ̄)"

但是我这一番苦功算是白瞎了。。。_(:з」∠)_
十六进制下直接查到flag应该是非预期解没跑了。。。。。等待官方WP给我一个胶带.jpg
Question 14 后门查杀
题干:我居然被留了后门,怎么办?
这个应该也是取证类的题,先挂载一下试试,顺便用vol扫一下试试。
挂载结果:
tool@ubuntu:~/Desktop$ sudo mount rootfs -o loop /mnt
tool@ubuntu:~/Desktop$ cd /mnt
tool@ubuntu:/mnt$ ls
bin dev etc lib lost+found mnt overlay proc rom root sbin sys tmp usr var www
tool@ubuntu:/mnt$

目录下这么多文件。。。flag应该在某个文件里。。。一通找。。。实在找不到了。。。。放弃。。。等一波官方WP。
2018-8-7 更新:
目标文件在于

Question 15 git
题干:这个提示已经很多了。
解压压缩包发现是图片,但是提示是git,看十六进制又很乱,于是尝试用binwalk提取。

发现提取出了文件夹,使用 git log 命令查询增改,发现flag。(话说这是个错的flag,需要带着错的flag去py出题人获取正确的flag)

Question 16 高级数据分析
题干:下载附件分析把吧。
(题干里的本来就是错字。。。但是我实在是想改掉。。。)
数据包的题嘛~简单的话导出个对象就好了(想歪的拖出去斩了吧)ε=ε=(怒°Д°)ノ (没错我就是从上面复制的,你能拿我怎么样(挺))

发现是SQL手工注入过程,首先确定flag所在表名,接下来过滤应答包长度只留下正确应答包,按顺序十进制转ascii码即可。


Question 17 crackme
这个貌似是需要动态调试的,静态调试的话函数太多了一点。。。。等待官方WPing。。。。
2018-7-29更新:突然会做了。。。。
说到动态调试,那么把程序载入到OD中

首先搜索“Please input your key:”位置

下断点

尝试输入123456,观察变换过程。F8步进至关键函数。

发现在这里将“main”放在了EAX寄存器中

随着步进,发现取出了第一个字母放在cl中,取出输入的123456中的‘1’放在al中。异或得到‘\’,替代‘1’。

继续查看,发现EAX寄存器中“main”首字母被删除,留下了“ain”,再次取出了第一个字母放在cl中,取出上一部产生的的‘‘\’’放在al中。异或得到‘=’,替代‘1’。


那么猜测输入的123456每一位都将与main的每一位依次异或。类似于以下过程:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str_1="123456";
string str_2="main";
for(int i=0;i<str_1.length();++i)
for(int j=0;j<str_2.length();++j)
{
cout<<str_1[i]<<" ^ "<<str_2[j]<<":\"";
cout<<str_1<<"\""<<endl;
str_1[i] = str_1[i] ^ str_2[j];
}
cout<<"Finally:"<<"\""<<str_1<<"\""<<endl;
return 0;
}
=============================================================
结果:
1 ^ m:"123456"
\ ^ a:"\23456"
= ^ i:"=23456"
T ^ n:"T23456"
2 ^ m:":23456"
_ ^ a:":_3456"
> ^ i:":>3456"
W ^ n:":W3456"
3 ^ m:":93456"
^ ^ a:":9^456"
? ^ i:":9?456"
V ^ n:":9V456"
4 ^ m:":98456"
Y ^ a:":98Y56"
8 ^ i:":98856"
Q ^ n:":98Q56"
5 ^ m:":98?56"
X ^ a:":98?X6"
9 ^ i:":98?96"
P ^ n:":98?P6"
6 ^ m:":98?>6"
[ ^ a:":98?>["
: ^ i:":98?>:"
S ^ n:":98?>S"
Finally:":98?>="
--------------------------------
Process exited with return value 0
Press any key to continue . . .
依次步进,果然如此。

接着步进,发现EAX中装入了base64字串,猜测是对变换后的字符串进行了base64编码,与装入的base64字串比较。那么,逆向后程序应为base64解密后的字符与niam异或,即得flag。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str_1="mgjlpO8F?Ts:R?T|?Ex^Bv";
string str_2="niam";
for(int i=0;i<str_1.length();++i)
for(int j=0;j<str_2.length();++j)
{
cout<<str_1[i]<<" ^ "<<str_2[j]<<":\"";
cout<<str_1<<"\""<<endl;
str_1[i] = str_1[i] ^ str_2[j];
}
cout<<"Finally:"<<"\""<<str_1<<"\""<<endl;
return 0;
}
======================================================
结果:
m ^ n:"mgjlpO8F?Ts:R?T|?Ex^Bv"
� ^ i:"�gjlpO8F?Ts:R?T|?Ex^Bv"
j ^ a:"jgjlpO8F?Ts:R?T|?Ex^Bv"
� ^ m:"�gjlpO8F?Ts:R?T|?Ex^Bv"
g ^ n:"fgjlpO8F?Ts:R?T|?Ex^Bv"
^ i:"f jlpO8F?Ts:R?T|?Ex^Bv"
` ^ a:"f`jlpO8F?Ts:R?T|?Ex^Bv"
� ^ m:"f�jlpO8F?Ts:R?T|?Ex^Bv"
j ^ n:"fljlpO8F?Ts:R?T|?Ex^Bv"
� ^ i:"fl�lpO8F?Ts:R?T|?Ex^Bv"
m ^ a:"flmlpO8F?Ts:R?T|?Ex^Bv"
^ m:"fllpO8F?Ts:R?T|?Ex^Bv"
l ^ n:"flalpO8F?Ts:R?T|?Ex^Bv"
� ^ i:"fla�pO8F?Ts:R?T|?Ex^Bv"
k ^ a:"flakpO8F?Ts:R?T|?Ex^Bv"
^ m:"fla
pO8F?Ts:R?T|?Ex^Bv"
p ^ n:"flagpO8F?Ts:R?T|?Ex^Bv"
� ^ i:"flag�O8F?Ts:R?T|?Ex^Bv"
w ^ a:"flagwO8F?Ts:R?T|?Ex^Bv"
� ^ m:"flag�O8F?Ts:R?T|?Ex^Bv"
O ^ n:"flag{O8F?Ts:R?T|?Ex^Bv"
! ^ i:"flag{!8F?Ts:R?T|?Ex^Bv"
H ^ a:"flag{H8F?Ts:R?T|?Ex^Bv"
) ^ m:"flag{)8F?Ts:R?T|?Ex^Bv"
8 ^ n:"flag{D8F?Ts:R?T|?Ex^Bv"
V ^ i:"flag{DVF?Ts:R?T|?Ex^Bv"
? ^ a:"flag{D?F?Ts:R?T|?Ex^Bv"
^ ^ m:"flag{D^F?Ts:R?T|?Ex^Bv"
F ^ n:"flag{D3F?Ts:R?T|?Ex^Bv"
( ^ i:"flag{D3(?Ts:R?T|?Ex^Bv"
A ^ a:"flag{D3A?Ts:R?T|?Ex^Bv"
^ m:"flag{D3 ?Ts:R?T|?Ex^Bv"
? ^ n:"flag{D3M?Ts:R?T|?Ex^Bv"
Q ^ i:"flag{D3MQTs:R?T|?Ex^Bv"
8 ^ a:"flag{D3M8Ts:R?T|?Ex^Bv"
Y ^ m:"flag{D3MYTs:R?T|?Ex^Bv"
T ^ n:"flag{D3M4Ts:R?T|?Ex^Bv"
: ^ i:"flag{D3M4:s:R?T|?Ex^Bv"
S ^ a:"flag{D3M4Ss:R?T|?Ex^Bv"
2 ^ m:"flag{D3M42s:R?T|?Ex^Bv"
s ^ n:"flag{D3M4_s:R?T|?Ex^Bv"
� ^ i:"flag{D3M4_�:R?T|?Ex^Bv"
t ^ a:"flag{D3M4_t:R?T|?Ex^Bv"
� ^ m:"flag{D3M4_�:R?T|?Ex^Bv"
: ^ n:"flag{D3M4_x:R?T|?Ex^Bv"
T ^ i:"flag{D3M4_xTR?T|?Ex^Bv"
= ^ a:"flag{D3M4_x=R?T|?Ex^Bv"
\ ^ m:"flag{D3M4_x\R?T|?Ex^Bv"
R ^ n:"flag{D3M4_x1R?T|?Ex^Bv"
< ^ i:"flag{D3M4_x1<?T|?Ex^Bv"
U ^ a:"flag{D3M4_x1U?T|?Ex^Bv"
4 ^ m:"flag{D3M4_x14?T|?Ex^Bv"
? ^ n:"flag{D3M4_x1Y?T|?Ex^Bv"
Q ^ i:"flag{D3M4_x1YQT|?Ex^Bv"
8 ^ a:"flag{D3M4_x1Y8T|?Ex^Bv"
Y ^ m:"flag{D3M4_x1YYT|?Ex^Bv"
T ^ n:"flag{D3M4_x1Y4T|?Ex^Bv"
: ^ i:"flag{D3M4_x1Y4:|?Ex^Bv"
S ^ a:"flag{D3M4_x1Y4S|?Ex^Bv"
2 ^ m:"flag{D3M4_x1Y42|?Ex^Bv"
| ^ n:"flag{D3M4_x1Y4_|?Ex^Bv"
� ^ i:"flag{D3M4_x1Y4_�?Ex^Bv"
{ ^ a:"flag{D3M4_x1Y4_{?Ex^Bv"
� ^ m:"flag{D3M4_x1Y4_�?Ex^Bv"
? ^ n:"flag{D3M4_x1Y4_w?Ex^Bv"
Q ^ i:"flag{D3M4_x1Y4_wQEx^Bv"
8 ^ a:"flag{D3M4_x1Y4_w8Ex^Bv"
Y ^ m:"flag{D3M4_x1Y4_wYEx^Bv"
E ^ n:"flag{D3M4_x1Y4_w4Ex^Bv"
+ ^ i:"flag{D3M4_x1Y4_w4+x^Bv"
B ^ a:"flag{D3M4_x1Y4_w4Bx^Bv"
# ^ m:"flag{D3M4_x1Y4_w4#x^Bv"
x ^ n:"flag{D3M4_x1Y4_w4Nx^Bv"
� ^ i:"flag{D3M4_x1Y4_w4N�^Bv"
� ^ a:"flag{D3M4_x1Y4_w4N�^Bv"
� ^ m:"flag{D3M4_x1Y4_w4N�^Bv"
^ ^ n:"flag{D3M4_x1Y4_w4Ns^Bv"
0 ^ i:"flag{D3M4_x1Y4_w4Ns0Bv"
Y ^ a:"flag{D3M4_x1Y4_w4NsYBv"
8 ^ m:"flag{D3M4_x1Y4_w4Ns8Bv"
B ^ n:"flag{D3M4_x1Y4_w4NsUBv"
, ^ i:"flag{D3M4_x1Y4_w4NsU,v"
E ^ a:"flag{D3M4_x1Y4_w4NsUEv"
$ ^ m:"flag{D3M4_x1Y4_w4NsU$v"
v ^ n:"flag{D3M4_x1Y4_w4NsUIv"
� ^ i:"flag{D3M4_x1Y4_w4NsUI�"
q ^ a:"flag{D3M4_x1Y4_w4NsUIq"
� ^ m:"flag{D3M4_x1Y4_w4NsUI�"
Finally:"flag{D3M4_x1Y4_w4NsUI}"
测试,成功。

Question 18 密码破解
题干:如题,下载附件获取flag
直接下载,发现文件名为misc.exe于是试着看看十六进制,拿到加密的flag,容易看出flag内部内容也为16进制,复制出来,在文本区即可拿到flag。(>人<;)

Question 19 hackpdf
题干:明天就是2019年了。
这个题拿到压缩包里的文件,没有扩展名,查看十六进制。(*▽*)

发现是ZIP叠加PDF,那么先把扩展名改为ZIP,查看Tips.txt。拿到提示“明天就是2019年了”。

接下来删掉十六进制中ZIP的数据部分,保存文件并将文件扩展名改为pdf。打开发现pdf需要密码才能查看内容,结合提示“明天就是2019年了”,猜测密码为20181231。输入,发现密码正确。


Question 20 对象
题干:分析数据包获取flag
数据包的题嘛~简单的话导出个对象就好了(想歪的拖出去斩了吧)ε=ε=(怒°Д°)ノ (没错我就是从上面复制的,你能拿我怎么样(挺))

这次倒是没那么简单了,没有明显分组提示了,但是发现有一个对象长得特别奇怪,于是查看分组,果然看到flag


0x03 后记
没什么后记好写的。。。。。那就最后强调一下!我的队友们是最棒哒~
网友评论