攻防世界 - Misc - Level 8 | traffic
🌟 关注这个靶场的其它相关笔记:CTF 靶场笔记 —— 攻防世界(XCTF)· 过关思路合集
0x01:考点速览
本题考察的是 Misc 中的流量分析与编码相关的知识,与以往考点不同,这关的关键并不在请求包携带的数据上,而在于请求包自身的特性上。比如说,请求包的长度。属于是脑洞题了。
0x02:Write UP
下载下来是一个流量包,无法直接通过搜索 flag 及其变体拿到答案,且无法使用工具从流量包中分离出或者导出可用的文件:
但是仔细查看流量包,可以发现一堆可疑的 ICMP 流量,流量包长度较小,且内容为 “heihei!!! aaaa”:
本题考的就是脑洞,需要提取出这些 ICMP 报文的长度,然后加上一个特殊值转成字符后才能拿到 Flag,过关脚本如下,number_list
就是这些 ICMP 报文排序好后的长度(去重了的):
def add_or_sub_random_number(number_list, key_word="flag", show_all=False):"""对传入的 number_list 加或减去任意一个数字后转化成 ASCII 字符,并从中寻找 Key 值:param number_list : list, 数字列表 => [144, 150, 139]:param key_word : str, 关键词,默认为 flag:param show_all : bool, 是否展示所有转化的结果,默认为 False,不展示"""# 确保 number_list 中的内容均为 Int 型数据number_list = [int(num) for num in number_list]
# 定位最大最小数 - 用来框选测试的范围 => ASCII 码值的范围是 0 - 255max_number = max(number_list)min_number = min(number_list)
# 每次计算完成后列表向右移一位for right_index in range(len(number_list)):for adjust_num in range(-min_number, (255 - max_number) + 1): # 为什么要加 1,因为 rnage 的范围是:[-min_number, 255 - max_number)flag = ''for origin_num in number_list:flag += chr(origin_num + adjust_num) # 将原列表内容添加一个矫正值后转化为字符串if show_all == True:print(f"[ + ] {number_list} 校正值: {adjust_num} - 最终结果 : {flag}")else:# Key_word 正序反序如果在结果中则显示if key_word in flag or key_word[::-1] in flag:print(f"[ + ] {number_list} 校正值: {adjust_num} - 最终结果 : {flag}")# 将最后一位数字移动到头部number_list.insert(0, number_list.pop(-1))
if __name__ == "__main__":# Type 1: 拿到一串无意义的数字 144 150 139 => 需要加或减去任意一个数字再转成 ASCII 码值再拿到 Flagnumber_list = [144, 150, 139, 145, 165, 91, 109, 151, 122, 113, 106, 119, 93, 167]# number_list.reverse() # 如果不能直接定位出 Flag,建议将列表反转后再次定位add_or_sub_random_number(number_list)
运行脚本后即可拿到 Flag: