加油!冲刺!
这是一道逆向题目,虽然很简单,但不清楚为什么出现在Misc的部分,也没发现什么捷径,这里用最简单的方式讲一下解题过程。首先下载题目文件,是个exe的可执行文件。直接打开IDA Pro,工具是付费的,条件不允许的可以使用Ghidra,也是一款逆向分析工具,并且是开源免费产品。
这里用IDA Pro打开该exe文件,shift+F12打开程序的字符列表,可以发现有两个特别的字符串。
双击字符串会出现该字符串的出处,这里出现数据来源(下图红色框内)后双击,然后按F5就可以查看伪代码。
这里的伪代码比较简单,首先进行了一个if条件判断,判断成功后会输出flag。这里有两个思路,一个是找出判断的具体值,然后运行程序输入判断值,二是直接计算flag,不通过程序运行。
首先v4是一个数字,是122,后面三个是ASCII字符,120、121、122分别代表xyz。所以if条件判断的就是输入的字符串是否为122xyz。我们可以运行程序尝试一下,出现了一个password输入框,这个框应该就是执行if的条件判断,输入122xyz后出现了flag。
另外我们也可以直接通过伪代码拼接flag。这里仔细看一下函数体,flag的结果是“flag”+“{”+Source+"_"+“Buff3r_0v3rf|0w”+“}”,其中前面定义了Source的值是v4加1,所以Source就是123。拼接在一起也能得到答案。
类型 | 逆向 |
---|---|
工具 | IDA Pro |
Flag | flag{123_Buff3r_0v3rf|0w} |
下载题目文件,就是个简单文本文件,其中包含一串编码。
a2FuYmJyZ2doamx7emJfX19ffXZ0bGFsbg==
一看就是base64编码,放进CyberChef看一下原文,发现又是一个字符串。我们已知最终flag的形式肯定是某个表示CTF的词加上花括号内的flag值。这里有花括号了,但是字母和位置是错的,怀疑是flag经过了换位加密和替换加密。
这两个解密过程没有顺序之分,但肯定先解决换位再判断替换比较容易,CTF常见的换位都试试后发现是栅栏密码,并且不是解密而是W型加密。工具使用这个在线网站。因为我们需要找的目标是类似“XXX{XXXXX}”的格式,解密中找不到相同格式的,但是在W型加密的枚举中找到了。
kzna{blnl_abj_lbh_trg_vg}
接着需要找出用的替换算法,最简单的就是凯撒密码,以及衍生出的ROT加密,这里尝试了一下发现就是ROT13。放进在线工具直接跑就能得到答案。
类型 | 字符编码、加密解密 |
---|---|
工具 | CyberChef、在线工具 |
Flag | flag{oyay_now_you_get_it} |
下载题目文件,是一个包含了很多小压缩包的压缩包,这些压缩包的数量很大,但是单独的压缩包大小很小,且每一个小压缩包都需要密码。这个一看就是需要CRC爆破,是一种非常常见的与压缩包相关的CTF题目类型,本质其实是在碰撞正确的内容而不是密码,相关原理和实现可以参考这篇文章。
这里我直接给出依据这道题目的CRC爆破脚本,该脚本需要放在这堆小压缩文件的同目录下运行,运行后会在同目录生成out.txt文本文件。
#!/usr/bin/python3
import zipfile
import string
import binascii
from itertools import product
def CrackCrc(crc):
for combination in product(dic, repeat=4):
s = ''.join(combination)
if crc == binascii.crc32(s.encode()):
f.write(s)
return
def CrackZip():
total_files = 68
for i in range(total_files):
file = f'out{i}.zip'
with zipfile.ZipFile(file, 'r') as zf:
crc = zf.getinfo('data.txt').CRC
CrackCrc(crc)
print(f'\rLoading: {((i+1)/total_files)*100:.2f}%', end='', flush=True)
if __name__ == '__main__':
dic = string.ascii_letters + string.digits + '+/='
with open('out.txt', 'w') as f:
print("\nCRC32 begin")
CrackZip()
print("\nCRC32 finished")
这个结果是个base64编码格式,放进CyberChef中得到原文,发现似乎是某个损坏的文件,这里没有文件头标识,怀疑是文件头被删除或者修改了。为了识别文件格式,把数据以hex形式输出,发现末尾是C4 3D 7B 00 40 07 00,而这正是rar压缩文件的标准文件尾。rar的标准文件头是52 61 72 21 1A 07 00,我们把这一串hex加在前面,成功修复了文件。
我们要的flag就在该rar文件的注释内。
类型 | zipCRC爆破、字符编码、文件修复 |
---|---|
工具 | CyberChef |
Flag | flag{nev3r_enc0de_t00_sm4ll_fil3_w1th_zip} |
下载题目文件,是个wav音频文件,直接听,发现声音是拨号的声音,应该是DTMF信号。这里即便不知道DTMF,在搜索引擎中搜索“拨号、加密、CTF”等关键词也很快能找到。这里直接用在线网站解析就行,DTMF解码的在线网站很多,这里推荐一个我觉得速度最快的。(https://dtmf.netlify.app/)
最终解码的解码结果是一串数字和“*”符号组成的字符串,其中“*”号应该是分隔符。通过看数字的规律,发现有点像是手机上的9格键盘。举例来说,777就是7号键上第3个字母,因此我们可以给出翻译,结果去除“*”符号并全部小写就是答案。
999*666*88*2*777*33*6*99*4*444*777*555*333*777*444*33*66*3*7777
Y*O*U*A*R*E*M*Y*G*I*R*L*F*R*I*E*N*D*S
YOUAREMYGIRLFRIENDS
youaremygirlfriends
类型 | DTMF |
---|---|
工具 | DTMF Decoder |
Flag | flag{youaremygirlfriends} |
下载题目文件,是个pcapng的日志文件,下载后放进wireshark中分析。这道题就不能和之前一样通过追踪流一个个看了,太多了看不过来。但大多数请求都是404,有点像在路径扫描和爆破,这里只需要查看实际请求到的HTTP列表文件就行。左上角按下图步骤导出HTTP文件到本地。
导出后发现除去一部分网站配置文件外,有很多包含login.php的文件,随便打开一个,好像是在做登录接口的爆破。
这里就想到可能我们的目标flag就在某个登录爆破流量上的“password“字段上,也是常见的CTF套路了。把文件全部放进kali,在同目录下通过grep搜索关键词,最后发现flag就在其中。(后面发现其实直接搜索SUCTF会快得多)
grep -r "password="
类型 | 日志分析 |
---|---|
工具 | wireshark、grep |
Flag | flag{password_is_not_weak} |
开始看到这个标题以为是考察颜文字加密,可惜不是。题目文件是个可以直接查看的文本文件,内容如下。
(究~↓~ㄘ究舟 拋岩拋
50pt
(究~↓~ㄘ究舟 拋岩拋
d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9b2b2e1e2b9b9b7b4e1b4b7e3e4b3b2b2e3e6b4b3e2b5b0b6b1b0e6e1e5e1b5fd
前面的就先不管了,直接看最后一行的字符串,这里感觉像是十六进制,放进CyberChef看一下,发现不是可读字符。
转换成十进制看一下,发现每一位的十进制数都超过了128但都小于256。标准的ASCII是按照7个二进制位表示字符,也就是说最大编码值是127(0 - 127,共128种字符),这里怀疑是把原本的编码全部加了一个128。
为了验证这个猜想,写了一个脚本,把所有十进制位减去一个128,然后再转换为ASCII。最后转换的结果就是答案。
numbers = [212, 232, 225, 244, 160, 247, 225, 243, 160, 230, 225, 243, 244, 161, 160,
212, 232, 229, 160, 230, 236, 225, 231, 160, 233, 243, 186, 160, 196, 196,
195, 212, 198, 251, 185, 178, 178, 225, 226, 185, 185, 183, 180, 225, 180,
183, 227, 228, 179, 178, 178, 227, 230, 180, 179, 226, 181, 176, 182, 177,
176, 230, 225, 229, 225, 181, 253]
result = [num - 128 for num in numbers]
print("原始数字:", numbers)
print("减去128后的结果:", result)
characters = [chr(num - 128) for num in numbers]
print("对应的ASCII字符:", ''.join(characters))
类型 | 字符编码 |
---|---|
工具 | CyberChef、Python |
Flag | flag{922ab9974a47cd322cf43b50610faea5} |
这道题我好像是歪打正着做出来的,后续看了别的师傅的WP好像和我做法不太一样。先下载题目文件,是个pcapng日志文件,放进wireshark开始分析。流量很大,追踪流一个个分析不现实,尝试搜索一下字符串,结果搜索flag直接搜到了,虽然只有一部分。这里左上角要选择分组字节流,搜索“flag”后就出现了一半flag。
flag{ae58d0408e26e8f
这里也是卡壳了一会,因为我并不知道flag下半部分的任何关键词。我这里尝试分析这一段数据包的特点,然后尝试寻找相同的数据包。仔细看这些数据会发现这串flag像是某个图片的注释,因为出现了adobe的字样。所以我想尝试找到其它的图片注释,说不定就有另外一部分flag。因为没有下半部分flag的关键词,只能用“http://ns.adobe.com”作为关键词搜索。
结果发现整个流量日志只有两个包可以搜索到“http://ns.adobe.com”,一个是flag的前半部分,另外一个正是后半部分。拼接在一起就是答案。
我这道题好像是误打误撞做出来的,因为我做完也没懂题目中说好多壁纸是指什么,想着这里不就两张图片吗,结果看了其它wp才发现是通过导出HTTP文件,然后搜索exiftool结果的注释做的。
类型 | 日志分析 |
---|---|
工具 | wireshark |
Flag | flag{ae58d0408e26e8f26a3c0589d23edeec} |
下载题目文件,是个压缩文件,注释如下。应该是需要我们写一个脚本,然后不断解压缩得到最终文件。这里我也是写了一个简单脚本。
import zipfile
import os
def extract_zip(zip_path, password):
try:
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(pwd=password.encode())
os.remove(zip_path)
return True
except:
return False
def main():
current_zip = None
files = [f for f in os.listdir('.') if f.endswith('.zip')]
if files:
current_zip = files[0]
while current_zip and os.path.exists(current_zip):
password = current_zip[:-4]
if extract_zip(current_zip, password):
files = [f for f in os.listdir('.') if f.endswith('.zip')]
current_zip = files[0] if files else None
else:
break
if __name__ == "__main__":
main()
把该脚本和数字为标题的压缩文件放在同一个目录,然后运行该脚本,这个嵌套压缩蛮深的,需要多等待一段时间。最后会得到一个名为“qr.txt”的文本文件。其中有很多元组数据。
之前我们做过一个类似的,当时是(x,y)的坐标,然后利用脚本通过坐标画图。但这里是坐标的可能性不大,总不至于画一个三维的图,三个元素,每个元素又不超过255,倒是有点像是图像像素的RGB。这里简单写个脚本把这些像素点转为完整图像。
from PIL import Image
import re
with open('pixels.txt', 'r') as f:
pixels = []
for line in f:
r, g, b = map(int, re.findall(r'\d+', line))
pixels.append((r, g, b))
width = height = int(len(pixels) ** 0.5)
img = Image.new('RGB', (width, height))
img.putdata(pixels)
img.save('output.png')
img.show()
把脚本和qr.txt放在同一个目录下,运行脚本后就出现了一个二维码,用qr_research扫描该二维码后就出现了答案。
类型 | 多层压缩、图像像素 |
---|---|
工具 | python、qr_research |
Flag | flag{ta01uyout1nreet1n0usandtimes} |
下载题目文件,是个pcapng的日志文件,打开wireshark开始分析。另外题目给了提示文本文件,文件内容如下。
流量分析
200pt
提示一:若感觉在中间某个容易出错的步骤,若有需要检验是否正确时,可以比较MD5: 90c490781f9c320cd1ba671fcb112d1c
提示二:注意补齐私钥格式
-----BEGIN RSA PRIVATE KEY-----
XXXXXXX
-----END RSA PRIVATE KEY-----
这里提到了私钥,说明我们当前目的是找到私钥从而能够查看HTTP内容。这里我先在wireshark中搜索字符串关键词“KEY”,注意这里需要大小写敏感否则会有很多筛选结果。全大写“KEY”的只有两个包,第一个Ftp Data的没有意义,后面两个包都在流2016中,所以我们主要看这个流。可以发现这个流是写了一个邮件发给某个人,这个邮件末尾附上了一个很大的png图片。
这里把png文件的数据复制出来放进CyberChef,通过自动识别发现是base64,解码后在线渲染发现是一张写有RSA私钥内容的图片。
用在线文字识别工具(https://www.toolapi.cc/ocr/)识别图片中的文字,核对无误后加上私钥的标识符。
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDCm6vZmclJrVH1AAyGuCuSSZ8O+mIQiOUQCvN0HYbj8153JfSQ
LsJIhbRYS7+zZ1oXvPemWQDv/u/tzegt58q4ciNmcVnq1uKiygc6QOtvT7oiSTyO
vMX/q5iE2iClYUIHZEKX3BjjNDxrYvLQzPyGD1EY2DZIO6T45FNKYC2VDwIDAQAB
AoGAbtWUKUkx37lLfRq7B5sqjZVKdpBZe4tL0jg6cX5Djd3Uhk1inR9UXVNw4/y4
QGfzYqOn8+Cq7QSoBysHOeXSiPztW2cL09ktPgSlfTQyN6ELNGuiUOYnaTWYZpp/
QbRcZ/eHBulVQLlk5M6RVs9BLI9X08RAl7EcwumiRfWas6kCQQDvqC0dxl2wIjwN
czILcoWLig2c2u71Nev9DrWjWHU8eHDuzCJWvOUAHIrkexddWEK2VHd+F13GBCOQ
ZCM4prBjAkEAz+ENahsEjBE4+7H1HdIaw0+goe/45d6A2ewO/lYH6dDZTAzTW9z9
kzV8uz+Mmo5163/JtvwYQcKF39DJGGtqZQJBAKa18XR16fQ9TFL64EQwTQ+tYBzN
+04eTWQCmH3haeQ/0Cd9XyHBUveJ42Be8/jeDcIx7dGLxZKajHbEAfBFnAsCQGq1
AnbJ4Z6opJCGu+UP2c8SC8m0bhZJDelPRC8IKE28eB6SotgP61ZqaVmQ+HLJ1/wH
/5pfc3AmEyRdfyx6zwUCQCAH4SLJv/kprRz1a1gx8FR5tj4NeHEFFNEgq1gmiwmH
2STT5qZWzQFz8NRe+/otNOHBR2Xk4e8IS+ehIJ3TvyE=
-----END RSA PRIVATE KEY-----
在wireshark中配置私钥,“编辑“-”首选项“,然后配置TLS的key就可以了。
配置完成后直接找到http流量并追踪,flag就在其中。
类型 | 日志分析、字符编码 |
---|---|
工具 | CyberChef、wireshark、OCR工具、 |
Flag | flag{0ca2d8642f90e10efd9092cd6a2831c0} |
下载题目文件,是个可执行的exe文件,放进IDA Pro,观察字符串,没发现什么有用东西。就运行一下看看是什么类型程序,发现是个日期比较程序,上面显示着今天的日期,并告诉你2020年9月17日会给出flag。这里就尝试更改本地时间为2020.9.17,结果flag就出来了,还以为是某种加壳的复杂逆向题。
类型 | 特殊Misc |
---|---|
工具 | 无 |
Flag | flag{We1cOm3_70_cyber_security} |
简单的过分的日志分析题目,被前面几个日志分析折磨一天了终于给我点好果子了。下载pcapng文件放进wireshark分析,只有几行数据故直接追踪TCP流,发现只有两个流。第一个流中得到压缩文件密码是“supercomplexpassword”,第二个流给出压缩文件包数据。
把流2中的数据以原始数据的格式放入CyberChef并转换为ASCII并保存。保存后的压缩文件直接用之前的密码解压缩,得到flag。
类型 | 日志分析 |
---|---|
工具 | wireshark、CyberChef |
Flag | flag{this_flag_is_your_flag} |
下载题目文件,是个jpg后缀的文件,但在010editor中打开后发现全是文字,好像是个什么小说。
看看flag在不在文字中,在kali中用grep找有花括号的字符串,结果flag直接出来了。
类型 | 文本搜索 |
---|---|
工具 | 无 |
Flag | flag{fil3_ext3nsi0ns_4r3nt_r34l} |
OK,依旧是两天的时间完成了12道题。第一天其实只写了三道,今天以为无论如何都写不完了,结果最后几题挺简单的。感觉现在每道题需要思考的时间都变多了,因为不想为了快而降低文章的质量,后面大概会拉长到3至4天一篇。
最后感谢大家观看。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。