IceCTF 2016

2023-12-25 07:48
文章标签 2016 icectf

本文主要是介绍IceCTF 2016,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

WriteUp

  1. Corrupt Transmission
  2. Rotated!
  3. Blue Monday
  4. All your Base are belong to us
  5. Thor’s a hacker now
  6. Scavenger Hunt
  7. R.I.P Transmission

涨姿势

  1. Audio Problems
  2. Intercepted Conversations Pt.1
  3. Intercepted Conversations Pt.2

Corrupt Transmission

原题

这里写图片描述

解题思路

PNG图片格式

WriteUp

已知PNG是损坏的,拿张正常的PNG对比,一下就可以发现题目的PNG前几个字节不对

这里写图片描述

这里写图片描述

将正确的字节替换错误的字节保存即可

这里写图片描述


Blue Monday

原题

这里写图片描述

解题思路

观察法

WriteUp

不知道是什么文件,用HxD看看再说

这里写图片描述

可以知道这是MIDI文件,播放一遍后没发现异常,准备用Audacity看看,这时发现了关键信息

这里写图片描述

在字节数据中发现了IceCTF,这不就是flag的开头吗?接下来还有
' { '符号和' } '符号,可以肯定flag就在其中,那么只要一个个字符抄下来即可

Rotated!

原题

这里写图片描述

解题思路

ROT13

WriteUp

这里写图片描述


All your Base are belong to us

原题

这里写图片描述

解题思路

二进制转ASCII

WriteUp

这里写图片描述

将前面两个转为十进制再转为ASCII对照一下就可以发现是要将所有二进制转为ASCII
f = open('01.txt','r')
numList = []for line in f.readlines():numList += list(line.rstrip().split(' '))s = ''
for n in numList:s += chr(int(n,2))print(s)

Thor’s a hacker now

原题

这里写图片描述

解题思路

LZIP是Linux压缩文件

WriteUp
这里写图片描述

很明显这是某种文件在十六进制查看工具下的数据分布,开头的前几个bytes说明了文件类型:LZIP
将数据部分提取出来后粘贴到HxD中生成文件,Linux下解压即可
f = open('in.txt','r')
f2 = open('out.txt','w')for line in f.readlines():line = line[10:50]+'\n'f2.write(line)f.close()
f2.close()

这里写图片描述

这里写图片描述


Scavenger Hunt

原题

这里写图片描述

解题思路

那就找吧

WriteUp

整个网站下载下来就容易找了

这里写图片描述

这里写图片描述


R.I.P Transmission

原题

这里写图片描述

解题思路

Binwalk,爆破

WriteUp

直接仍Binwalk里面可以发现隐藏有zip文件

这里写图片描述

提取出来发现需要密码,爆破即可

这里写图片描述

这里写图片描述


Audio Problems

原题

这里写图片描述

解题思路

Audacity?还是要sox

WriteUp

惯例先上Audacity,频谱图有发现,不过好像太模糊了

这里写图片描述

怎么看都看不清,怎么办,sox试试啊

这里写图片描述

涨姿势点

sox, the Swiss Army knife of sound processing programs
掌握基本用法

Intercepted Conversations Pt.1

原题

这里写图片描述

解题思路

键盘数据包,tshark提取数据,Dvorak键盘

WriteUp

参考资料

从后缀 '.pcapng' 为截取的数据包,Wireshark查看证实是usb通信的数据包

这里写图片描述

那么应该就是要从里面提取键盘输入的数据,用tshark完成
tshark -r interceptpt1.pcapng -T fields -e usb.capdata -Y 'usb.capdata && usb.transfer_type == 0x01 && frame.len == 72' >cap.txt
提取的数据如下
02 和 20 开头的数据表示输入的是大写
02 = 20 = shift

这里写图片描述

学过汇编应该都知道系统在读取键盘输入时在缓冲区存储的是字母的代码,例如
G的代码是0x0a,前面的02或者20控制大写,那么我们就要把代码转换为字母
可是转换后会发现根本就不是flag,这个时候就要用到另一种键盘,Dvorak键盘,它的字母排列和我们常用的键盘不同,只要在根据转化表转换即可
#代码修改自 @Jhonathan Davi
hids_codes = {"0x04":"a","0x05":"b","0x06":"c","0x07":"d","0x08":"e","0x09":"f","0x0A":"g","0x0B":"h","0x0C":"i","0x0D":"j","0x0E":"k","0x0F":"l","0x10":"m","0x11":"n","0x12":"o","0x13":"p","0x14":"q","0x15":"r","0x16":"s","0x17":"t","0x18":"u","0x19":"v","0x1A":"w","0x1B":"x","0x1C":"y","0x1D":"z","0x1E":"1","0x1F":"2","0x20":"3","0x21":"4","0x22":"5","0x23":"6","0x24":"7","0x25":"8","0x26":"9","0x27":"0","0x36":",","0x33":":","0x28":"\n","0x2C":" ","0x2D":"_","0x2E":"=","0x2F":"{","0x30":"}"}layout_dvorak = { 'q':"'", 'w':',', 'e':'.', 'r':'p', 't':'y', 'y':'f', 'u':'g', 'i':'c', 'o':'r', 'p':'l', '_':'_', ':':'S','[':'/', '{':'{', '}':'}' ,']':'=','a':'a', 's':'o', 'd':'e', 'f':'u', 'g':'i', 'h':'d', 'j':'h', 'k':'t', 'l':'n', ';':'s', "'":'-','z':';', 'x':'q', 'c':'j', 'v':'k', 'b':'x', 'n':'b', 'm':'m', ',':'w', '.':'v', '.':'z',' ':' ','Q':"'", 'W':',', 'E':'.', 'R':'P', 'T':'Y', 'Y':'F', 'U':'G', 'I':'C', 'O':'R', 'P':'L','A':'A', 'S':'O', 'D':'E', 'F':'U', 'G':'I', 'H':'D', 'J':'H', 'K':'T', 'L':'N', ';':'S', "'":'-','Z':';', 'X':'Q', 'C':'J', 'V':'K', 'B':'X', 'N':'B', 'M':'M','0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','7':'7','8':'8','9':'9'}flag = ''file = open('cap.txt','r') 
for line in file.readlines():spli = line.split(':')conv = '0x'+spli[2].upper()if conv in hids_codes:if spli[0] == '00':flag += layout_dvorak[hids_codes[conv]]else:flag += layout_dvorak[hids_codes[conv].upper()]print(flag)

这里写图片描述

涨姿势点

Wireshark能抓取不同端口的数据包
tshark的基本用法
Dvorak键盘的排列不同于普通键盘

Intercepted Conversations Pt.1

原题

这里写图片描述

解题思路

Wireshark发现关键信息及提取文件,反编译pyc,算法逆向

WriteUp

参考资料

Wireshark分析数据包可以发现有个IRC网络的,解析几个数据包可以发现有人正在通信

这里写图片描述

这里写图片描述

这里写图片描述

从截取的对话可以发现通信方发送了一个名为 encode.pyc 的文件,我们可以在接下来的几个TCP协议的数据包的data段获取该文件

这里写图片描述

然后我们在通信的最后可以发现通信方发送了一个字符串
'Wmkvw680HDzDqMK6UBXChDXCtC7CosKmw7R9w7JLwr/CoT44UcKNwp7DllpPwo3DtsOID8OPTcOWwrzDpi3CtMOKw4PColrCpXUYRhXChMK9w6PDhxfDicOdwoAgwpgNw5/Cvw=='

这里写图片描述

Google之后知道 .pyc文件是python文件编译后的文件,那么我们反编译后就可以获得 .py 文件,推测和最后一个字符串的加密有关,那么只要算法逆向就可以从字符串中得到关键信息
把获取到的文件数据粘贴进HxD中生成 .pyc 文件

这里写图片描述

接下来进行反编译,网上有在线反编译的,不过对于这个文件来说效果不好,那么就自己反编译,这里用到python'uncompyle6',用 pip 安装即可
这里顺便提一下文件开头的 16 0D的含义,这是magic number,不同版本编译出来的 .pyc 文件的magic number是不同的,具体可查阅 https://gist.github.com/delimitry/bad5496b52161449f6de。按照对照表,16 0D代表的是
python 3.5b2 这在uncompyle6进行反编译时也会有提示

这里写图片描述

然后我们就得到了加密的 .py文件
import random            #加密 .py
import base64P = [27, 35, 50, 11, 8, 20, 44, 30, 6, 1, 5, 2, 33, 16, 36, 64, 3, 61, 54, 25, 12, 21, 26, 10, 57, 53, 38, 56, 58, 37, 43, 17, 42, 47, 4, 14, 7, 46, 34, 19, 23, 40, 63, 18, 45, 60, 13, 15, 22, 9, 62, 51, 32, 55, 29, 24, 41, 39, 49, 52, 48, 28, 31, 59]inp = input()
inp += ''.join((chr(random.randint(0, 47)) for _ in range(64 - len(inp) % 64)))
ans = ['' for i in range(len(inp))]for j in range(0, len(inp), 64):for i in range(64):ans[j + P[i] - 1] = chr((ord(inp[j + i]) + S[i]) % 256)ans = ''.join(ans)
print(base64.b64encode(ans.encode('utf8')).decode('utf8'))
分析加密代码后写出解密代码,解密最后一个字符串即可
# Offsec Research CTF Team   import random, base64, string, sysP = [27, 35, 50, 11, 8, 20, 44, 30, 6, 1, 5, 2, 33, 16, 36, 64, 3, 61, 54, 25, 12, 21, 26, 10, 57, 53, 38, 56, 58, 37,43, 17, 42, 47, 4, 14, 7, 46, 34, 19, 23, 40, 63, 18, 45, 60, 13, 15, 22, 9, 62, 51, 32, 55, 29, 24, 41, 39, 49,52, 48, 28, 31, 59]S = [68, 172, 225, 210, 148, 172, 72, 38, 208, 227, 0, 240, 193, 67, 122, 108, 252, 57, 174, 197, 83, 236, 16, 226, 133,94, 104, 228, 135, 251, 150, 52, 85, 56, 174, 105, 215, 251, 111, 77, 44, 116, 128, 196, 43, 210, 214, 203, 109,65, 157, 222, 93, 74, 209, 50, 11, 172, 247, 111, 80, 143, 70, 89]# comment these lines if not running under python2
reload(sys)
sys.setdefaultencoding('utf8')# Get the encoded flag and do the conversions in reverse order
ans = ((base64.b64decode(sys.argv[1])).encode('utf8')).decode('utf8')# Create a list with length of character in ans (encoded flag)
ans_list = list(ans)# Create empty inp list
inp = ['' for i in range(len(ans))]for j in range(0, len(ans), 64):for i in range(64):# Try every printable ascii character and if the equation is satisfied, we've found one character of the initial inputfor c in string.printable:if (ans_list[j + P[i] - 1] == unichr(((ord(c) + S[i]) % 256))):inp[j + i] = cinp = ''.join(inp)
print(inp)

这里写图片描述

涨姿势点

IRC网络
Wireshark从数据流中提取文件的方式
不同版本的python编译后的 .pyc文件的magic number不同
uncomple6反编译 .pyc文件,也有在线反编译的网站

备注

虽然文件是python 3.5的版本编译的,不过用uncompyle6反编译时的python版本为 2.7

这篇关于IceCTF 2016的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/534740

相关文章

实践课堂|2016成都站|报名开始啦!

Hi,QingCloud 的小伙伴们,欢迎参加史上最有营养的云知识讲堂。 QingCloud 实践课堂系列开始于 2014 年末,在深圳、上海、广州、成都、杭州、北京六个城市,QingCloud 的研发工程师们同近千名 CIO 、架构师、开发者、运维工程师……分享了 QingCloud 的技术理念、功能特性和使用技巧,还有来自人民网、融云、泰捷视频、杏树林、友好速搭、百姓网、冰点、顺丰速运、洋葱

2016/9/11--一周的工作总结

自从九月一号开始上班到现在,现在总结一下自己的问题: 第一个问题:自己没有认真的解决问题! 刚去的第二天,施工给我了一张图纸,让我对电路图进行分析,我刚开始查了一些资料,也看了看但是一直不会做,后边就放一边了也不管了,自己一直说实习学不到东西,但是真正的问题来的时候,是否全力以赴的解决问题?这个问题你真的尽全力去解决了吗?回答是:不,我没有。我还不如一个本科的学生,我一直在逃避,一直没有

日记 01/27/2016.

有机会再看看这个: https://www.zhihu.com/question/27578379 想拿高package,多去拿几个offer再来谈,特别是hot startup的package,往往拿来要挟大公司的HR很好用。 最近在学习Angular JS,自己一定要坚持下来。然后把前端的知识补上。 打算Aug的时候,然后把Princeton的算法课上了,重新充电,然后把

2016年末程序员应该知道的基本架构思想

http://www.toutiao.com/i6352598153379709442/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=6176041275&utm_medium=toutiao_ios

高教社杯数模竞赛特辑论文篇-2016年C题:电池剩余放电时间预测(附MATLAB代码实现)

目录 摘要 一、 问题重述 1.1 已知铅酸电池的基本情况与要求 1.2 需要解决的问题 1.2.1 问题 1 需要解决以下三点: 1.2.2 需要解决以下三点: 1.2.3 问题3需要解决: 二、问题分析 2.1 问题1 2.2 问题 2 2.3 问题3 三、模型假设与约定 四、符号说明及名词定义 五、模型的建立与求解 5.1 问题一的分析与求解 5.2 问题二的分析与求解 5.3 问题三的分

蘑菇街2016研发工程师编程题--回文串

题目 给定一个字符串,问是否能通过添加一个字母将其变为回文串。 输入描述: 一行一个由小写字母构成的字符串,字符串长度小于等于10。 输出描述: 输出答案(YES\NO). 示例1 输入 coco 输出 YES 解法1 使用动态规划,先看一下回文串的性质,如果一个字符串为回文串,那么翻转这个字符串以后跟原来的子串相同如下: 根据题目如果加一个字符就能使字符串成为回文串

网易2016研发工程师编程题--完全解析

前言 之前做公司的真题,碰到动态规划,还有一些数学性质的题目比较多一点。网易2016研发工程师编程题跟之前做的题目有很大的不同,不仅涉及到二叉树的编码,还涉及到图的广度遍历,最后还有一个快排。可以说这次的三个题目含金量非常的高,因此做了一下总结和分析。 1.比较重量 题目描述:小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间

mysql 与java 转换格式化格林威治时间(Tue Sep 13 00:00:00 CST 2016)两种方式

1  mysql 中处理 SELECT STR_TO_DATE('Thu Jul 20 15:04:03  2017','%a %b %e %T %Y %Y %Y') from dual ;   STR_TO_DATE(REPLACE('Tue Sep 13 00:00:00 CST 2016', '00:00:00 CST ', '') ,'%a %b %e %Y %Y %Y') 2 ja

高教社杯数模竞赛特辑论文篇-2016年A题:系泊系统设计(续)(附MATLAB代码实现)

目录 7.2 模型建立 7.2.1 系泊系统的水流力分析 7.2.2 系统构件受力分析 7.3 模型求解 7.3.1 变步长搜索算法 7.3.2 结果分析 八、模型评价及推广 8.1 模型的评价 8..2 模型的改进 8.4 模型的推广 九、参考文献 代码实现 附录 1:问题一的解答程序 附录 2 问题一沉底修补程序  附录三:问题二优化程序 附录四:熵值法 附录五:二维模型制图  附录六 三

2015年总结与2016年期望

2015年度工作述职报告 部门:   设计部        职位:   前端工程师    时间: 2016 年 01 月 11 日 1. 工作中的心得以及收获 一、回顾2015参与的项目: 溯源:质量报告,检测报告,打印BUG 工作台:bootstrap版 --> 微信切换版(张鑫旭)--> SUI框架版 工作台模块:工厂和分仓,经销商,业务员,会员,导购,销管等工