初次接触CTF有一c语言编程题库100题求助

文章简介:大致介绍了CTF比赛中Fornesics题目的常见类型和各类使用工具此类题目在国内CTF中偶尔出现,但国外的CTF中经常出现这类取证赛题

在CTF中,取证赛题包括了文件分析、隐写、内存镜像分析和流量抓包分析任何要求检查一个静态数据文件(与可执行程序和远程服务器不同)从而获取隐藏信息的都可以被认为昰取证题(除非它包含了密码学知识而被认为是密码类赛题)。

取证作为CTF中的一大类题目不完全包括安全产业中的实际工作,常见的与の相关的工作是事故相应但即使在事故响应工作中,计算机取证也经常是执法部门获取证据数据和证物的工作而非对防御攻击者或恢複系统感兴趣的商业事故相应企业。

与大多数CTF取证题目不同现实生活中的计算机取证任务很少会涉及巧妙的编码、隐藏数据、层层嵌套嘚文件中的文件,或是其他脑洞类的谜题很多时候刑事案件需要的是精心恢复一个被破坏的PNG文件,根据一张照片或QR码来解码获取包含NES只讀内存镜像来输出证据的压缩包密码也就是说,现实的取证需要从业者能够找出间接的恶意行为证据:攻击者攻击系统的痕迹或是内蔀威胁行为的痕迹。实际工作中计算机取证大部分是从日志、内存、文件系统中找出犯罪线索并找出与文件或文件系统中数据的关系。洏网络(流量抓包)取证比起内容数据的分析更注重元数据的分析,也就是当前不同端点间常用TLS加密的网络会话

CTF竞赛中的取证类谜题囷实际生活中的工作关联较少的原因可能在于这类题目并不像漏洞利用一类的题目受到人们的注意。也有可能是它很少吸引黑客们来参与解答此类题目不管怎么样,许多参赛者都喜欢解答CTF中各种简单多样化的取证题目考虑到大多数参赛者没有能够在可执行文件分析大赛Φ带来巨大优势的售价5000美元的带有Hex-Rays反编译器的IDA Pro专业版,这类题目还是相对适合入门新手来做的

下列三种能力是解答取证类CTF题目中最常用箌的:

  • 掌握一门脚本语言(例如python)
  • 掌握如何使用该语言来操作二进制数据(涉及到字节的操作)
  • 认识各类文件格式、协议、结构和编码

前兩类技术你可以在CTF外自行学习,而第三种则只能在实战中不断熟练好在通过本文档,你可以有个大致的了解

当然了,在大部分CTF比赛中朂常用的环境是Linux系统有时候也会用到VM虚拟机中的Windows。MacOS也可以拿来代替Linux前提是你得忍受部分开源工具无法正确编译运行。

通过python操作二进制數据

假设你已经初步掌握了一些Python编程技巧你也可能不太清楚如何有效地操作二进制数据。类似C的低级语言可能更适合这一工作但Python开源社区中的各种包比起学习C语言的难度,可以帮助你更快速的上手操作二进制数据

下面是常用的python操作二进制数据的例子

在二进制模式中读取和写入文件:

字节数组是一种数组的可变序列,在Python2和3都可以使用

你也可以通过16进制的字节数组来表示Unicode字符串:

将文件以二进制数组形式读取的例子:

接下来会讲述常见的CTF取证题目概念和一些帮助初步解题的推荐工具。

文件格式的判断(以及’魔法字节’)

几乎所有的取證题目都会涉及到一个有时候连告诉你是什么文件类型的提示都没有的文件文件类型对于用户来说长期是和文件扩展名相关联的(例如MarkDown嘚readme.md文件)MIME类型(互联网上指定应用程序打开对应扩展名的协议)或是存储在文件系统上的元数据(泪如Mac OS上的mdls命令)。在CTF中有时候是用各種方法来尝试判断文件的类型。

在UNIX系统中传统的识别文件类型方法是libmagic,也就是识别被称作‘魔法数字’或者‘魔法字节’——文件头中特定字节的库libmagic库是文件操作中最基础的命令:

考虑到这是CTF竞赛,因此竞赛时命题人会故意设计一些针对常用工具和方法故意误导人的攵件。同时如果一个文件内部包含了其他文件的信息那么文件命令只能够识别其中包含的文件类型。此时你需要进一步深入地分析文件內容

是一个专业的文件分析工具,尽管它没有开源但它在多个平台上都是免费使用的。它还允许一定程度上的自主分析功能它的优勢在于内部包含有世上大多数文件类型的属性和混淆格式。

文件中的文件或是加载在固件和文件系统中的文件是CTF中常见的一类取证题目。针对识别文件系统中附加的其他文件并进行提取的技术称作‘文件雕复’最常用于这一工作的固件分析工具是。

作为SluethKit(在文件系统中會具体谈到)是另一个用于文件恢复的文件雕复工具

要手动提取文件(已知偏移量)的部分信息,你可以使用dd命令许多16进制编辑器也提供了复制黏贴部分字节到新建文件中的功能,所以你不需要专门去研究偏移量

使用dd命令从一个偏移量1335205的文件中提取字节数据的文件雕複例子:

尽管上述工具能够满足基本需求,但有时候你还是需要人工利用Python的re或regex模块来编程提取文件中的一小部分信息从而判断魔法字节,以及Python的zlib模块来提取zlib数据流

刚开始你可能一头雾水,面对着题目文件不知道如何进行下一步常见的一些方式包括搜索文件中所有的明攵字符串,例如grep指令搜索特定字符串来搜索非文本形式的数据规律,还有hexdump命令

通过文件偏移来获取所有ASCII字符串的例子如下:

Unicode字符串,唎如UTF-8会在搜索ASCII字符串时出现但如果要搜索其他编码,可以翻阅帮助文档中关于-e指令的说明需要注意许多编码都有可能在取证中出现,泹最简单的编码始终占据着主导地位

搜索PNG文件中PNG魔法字节的例子

hexdump的优势不在于它是最好的16进制编辑器(它绝对不是)而在于你可以用操莋命令直接输出hexdump,或用grep命令来输出还能用字符串格式化命令来设置输出格式。

使用hexdump格式化命令以64字节整数的16进制来输出文件前50个字节例孓如下:

其他16进制镜像操作例子

二进制指的是1和0,但它们经常以文本的形式传输着因为如果真的要发送一组的序列无疑是十分浪费的,所以数据经常先通过一种方式进行编码这就是所说的,一种十分流行的CTF赛题当遇到在分析文件种字符串的情况时,可以尝试将二进淛数据编码为文本字符串

我们之前提到要精通CTF取证题目,需要认识各类编码形式有些一眼就能看出来,例如Base64编码有着字母数字和=结尾嘚特征(如果出现的话)现在有许多在线,你也可以使用base64命令:

ASCII编码的16进制由于字符特征(0-9A-F)而十分好认。ASCII字符本身占据了一段字节(0x00到0x7f)所以如果你在文件中找到了类似68 65 6c 6c 6f 20 77 6f 72 6c 64 21的字符串很明显会都是类似0x60的特点——这就是ASCII码。从技术角度来说这个是文本(“hello world!”)通过ASCII(二进淛)编码后以16进制(文本)编码获得的。是不是已经晕了

下列多个提供了多种在线的编码/解码。在本地上可以尝试使用xxd命令

使用xxd将文夲从ASCII转换为16进制编码的例子:

我们已经讨论了取证任务中常用的基础概念和工具,现在我们将具体的分类讨论取证题目以及各种情况下嶊荐用于分析的工具。

尽管无法准备每一种可能遇到的数据格式但CTF中还是有不少经常出现的格式。如果你能针对下述情况准备号分析工具你就能应付大多数的取证赛题:

  • 压缩包文件(ZIP,TGZ)

在一些难度较高的CTF竞赛中命题人会自豪地出一些要求参赛者分析没有现成的公开笁具拿来分析的复杂格式文件。你需要了解如何快速找到没见过的格式相关的文档和工具许多文件格式都可以通过互联网搜索找到相关嘚具体开源报告,但如果事先了解过相关文档无疑会受益匪浅。所以我们列出了下列的参考链接

当分析文件格式时,能够用于识别不哃文件格式(模板)的16进制编辑器是十分有用的另一个类似的开源工具是。还有类似功能的分析器可以然而这些工具都是分析完整无損的文件,无法有效的用于CTF竞赛中要求你重构缺失一定内容的文件

你也可以查看下由Ange Albertini编辑的文件格式可视化说明。

许多CTF题目都会压缩一個在zip,7z,rar,tar或tag文件中但只有取证题会将压缩包作为题目的一部分。很多时候题目的目标是从一个损坏的压缩包中提取文件或是在一个没有用箌的区域(常规的取证题目)中找到加载的数据。Zip既是现实中最常用的也是CTF中最常见的。

下面有多个命令行工具来帮助了解zip压缩文件的信息:

  • 解压缩操作经常会给出zip文件无法解压的相关有用信息
  • Zipinfo在无需提取的情况下列出了zip文件的内容信息
  • 尝试爆破zip压缩包密码(适用于少于7個字母的密码)

在遇到密码保护的zip文件时需要注意它并没有加密文件名和压缩包中的原始文件大小,而加密保护的RAR和7z文件则无法查看

茬破解加密zip时,如果你有加密压缩包其中一个文件的未加密/未压缩副本你可以尝试进行(点击查看和)的明文攻击操作。但新的密码保護压缩文件(如采用AES-256而不是ZIP加密)没有这一安全隐患

CTF是十分有趣的,而图像文件能够很好地包含黑客文化因此CTF竞赛中经常会出现各种圖像文件。图像文件有多种复杂的格式可以用于各种涉及到元数据、信息丢失和无损压缩、校验、隐写或可视化数据编码的分析解密。

苐一步往往是使用检查图像文件的元数据CTF中使用的图像文件中EXIF信息往往保留着原始图像例如相机、略缩图、注释、GPS定位等信息。不论这些元数据是否有用都值得先去看一看。

Exiftool导出的部分数据例子:

PNG图片在CTF竞赛中可能由于它低损压缩的格式适合在图片中隐藏不可见的数据洏十分流行PNG图片也可以在wireshark中分割开来,你可以尝试使用来试图修复被破坏的PNG图片如果你需要深入研究PNG文件的数据,那么你可以使用

隱写技术指的是将一些秘密数据储存在现实中较为罕见无关数据(明文)中(通过密码学进行有效加密)的技术,但在CTF取证题目中隐写題目十分流行。隐写的明文可以是任何一种数据但视频文件由于能够允许一定量不引人注意的数据丢失(同样特征可以实现低损压缩)洏更适合作为赛题。隐写的难点不光在于如何识别需要提取的隐写技术还包括如果使用来进行提取。针对赛题的文件我们可以进行一些方法来尝试验证其是否是一个隐写题目。经常用于各种图片隐写中判断和提取隐藏数据你也可以尝试。

提供了转换各类图像文件可视囮数据的功能CTF命题人经常使用修改过的Hue/Saturation/Luminance值或颜色通道来隐藏一段秘密信息。Gimp还可以用于确认文件是否是一个图像文件例如你从内存镜潒或其他地方获取了一个图片文件,但你不知道它标注像素格式等信息的头文件那么你可以将这些数据作为‘Raw image data’交给Gimp进行各种处理操作。

工具集可以嵌入在脚本中帮助你快速进行识别、调整、修改、转换图像文件的各类操作它的比较工具还可以帮助你快速找出两张看似楿同的图片中的数据区别。

如果你在写一个自制的图像解析可以试着导入(Python图像处理库PTL)。它允许你从动态GIF中提取每一帧图像或是从JPG图爿中提取不同位置的像素——它基本支持所有的图像文件格式

如果题目是一个QR码(2D条形码)使用Python的qrtools模块来检查一下,你能通过不到5行的Python玳码来对QR码的图像进行解码当然你也可以用智能手机来扫一扫对单独的一个QR码解码。

有时候CTF取证类赛题会提供一个完整的磁盘镜像,參赛者需要具备一定的策略来在这个数据系统中寻找特定的flag在计算机取证中,这类策略指的是快速理清内容的能力没有策略的话只能耗时耗力地查看所有的信息。

加载光驱文件系统镜像的例子:

一旦你加载了文件系统那么使用tree命令来快速查看目录结构从而判断是否有徝得你进一步分析的内容是个好主意。

你也许不需要在可见文件系统中寻找特定的文件而是要在隐藏卷、未使用空间(硬盘中没有划分箌任何一部分的空间)或是类似的非文件系统结构中寻找被删除的文件。对于EXT3和EXT4文件系统来说你可以使用尝试恢复被删除的文件。对于其他系统则可以使用进行恢复丢失的分区表,修复损坏的文件恢复FAT或NTFS盘中的删除文件等多种操作。

和它的WEB用户界面‘Autospy’是一个用于文件系统分析的开源工具它也许过于针对执法部门的工作需求,但在搜索整个硬盘镜像的特定关键字或未使用空间时仍是个十分好用的工具

专门针对固定功能的低资源系统中加载了驱动的文件系统是一类特别的题目,它们可以使压缩过的单独文件或是只读文件。是一类非常受欢迎的驱动文件系统你可以使用或来分析其中加载的镜像文件。

抓包(PCAP)文件分析

网络流量经常通过如tcpdump或(都基于libpcap)的软件以PCAP(抓包)文件的格式来捕捉并保存通常CTF比赛中会提供一个包含一些流量数据和需要参赛者恢复/重构传输文件或信息的PCAP文件。复杂的地方在於数据包里充满着大量无关的流量信息因此如何分类和过滤数据是参赛者需要完成的工作。

在初步分析中可以尝试使用Wiresharks的静态和会话視图或命令来从高层视图查看报文。Wireshark以及命令行版本的tshark都支持过滤功能也就是说你精通正则的话可以快速缩小你需要分析的范围。还有個叫做的在线工具能够将你上传的不超过50MB的PCAP文件转换为可视化时间关系以及SSL元数据的界面它还能够高亮文件传输过程,便于你发现可疑嘚活动如果你已经知道你要找的是什么,也可以用ngrep命令来搜索整个数据报文

正如同文件雕复指的是识别和提取加载在其他文件中的文件一样,报文雕复指的是从抓到的数据包中提取出文件有一些昂贵的商业工具专门完成这类工作,但作为开源工具也能满足这一需求。Wireshark也有一个能够将数据从抓包中提取的功能‘导出对象’(例如:文件—到处对象—HTTP—保存全部)除此之外,你也可以尝试tcpxtract,,,或是

如果伱想要编写自己的脚本来直接处理PCAP文件,那么推荐你也可以用来写Wireshark的交互。

如果你要尝试修复损坏的PCAP文件这里有一个叫做PCAPfix的。

注意PCAP和PCAPNG嘚不同:这是两种版本的PCAP文件格式PCAPNG版本较新,因此有工具不支持该类型文件你可能需要使用Wireshark或其他兼容工具将PCAPNG文件转换为PCAP从而在其他笁具中使用。

多年来计算机取证经常被看作是文件系统取证但当攻击者们越来越熟练时,它们开始避开硬盘进行攻击同时内存快照由於保存了实时环境(系统设置、远程脚本、密码、密钥等)这些无法在硬盘上找到的线索。所以内存快照/镜像取证是这些年事故响应中越來越多的方法在CTF竞赛中,你可能会遇到提供一个内存镜像文件并让你从中定位和提取一个隐藏文件或信息的题目。

用于内存镜像分析嘚主流开源框架是Volatility是一个支持解析外部工具采集的内存奖项(例如VM采集的VMware内存镜像)的Python脚本。在提供内存镜像文件和相关资料(从镜像Φ获取的系统)后Volatility能够开始识别数据的结构,运行进程密码等资料。它还支持提取多种信息的人工插件拓展功能

是一个在内存镜像Φ寻找类似流量数据,并提取为Wireshark中查看的PCAP文件的工具它还有插件可以提取SQL数据库,Chrome访问记录Firefox访问记录等数据。

PDF文件是一个非常复杂的攵档文件格式已经出现了多种可以隐藏数据的地方和技巧,因此它在CTF取证题中十分流行NSA在2008年发表过标题为“Adobe PDF中的隐藏数据和元数据:公开危险和应对措施”。尽管原URL已经无法打开但你仍可以在打开副本。Ange Albertini也在Github上保留着一份关于的Wiki

PDF格式类似HTML一样有着部分的明文,但其Φ还包括了许多二进制‘对象’Didier Steven写过关于PDF格式的,这些二进制‘对’可以是压缩数据也可以是加密数据,还可以类似Javascript或Flash的脚本语言伱可以通过文本编辑器也可以使用类似Origami的PDF文件编辑器来显示PDF的结构。

是一个查看pdf文件并整理提取信息时十分有用的工具另一个是Ruby中的框架。

在搜索PDF文件中的隐藏数据时常见的隐藏地方包括:

  • PDF的‘增量生成’功能允许保留用户不可见的前版本信息
  • 图层后面被覆盖的另一个圖层

还有许多Python包能够帮助处理PDF文件,例如允许你制作自己的分解脚本

像图像文件一样,不仅仅因为其趣味还由于现实中经常运用音频囷视频来隐藏数据,因此音频和视频文件也经常出现在CTF取证赛题中正如同图像文件一样,隐写技术可以将秘密信息加载在内容数据上伱需要知道如何查看文件元数据区域来寻找线索。第一步一般是使用工具(或exiftool)来查看内容区域和元数据信息

是一个开源的音频文件和波形图处理工具,CTF命题人也喜欢用它在音频波形(也就是你看到的频谱图当然你可以用更加专业的来查看))中添加文本信息。Audiacity还允许伱进行降低播放速度、倒置播放等操作来帮助你从怀疑有隐藏信息(比如你听到的杂音、电磁音、混乱的声音等)中寻找隐藏的信息是叧一个用于转换和操作音频文件的命令行工具。

还有种常见的方法是通过检查LSB来寻找隐藏信息许多音频和视频都采用了分离(固定长度)的数据块从而实现流畅播放,这些数据块的LSB是一个非常常见的不影响文件肉眼可见层面的隐藏数据的位置

其他情况还有将信息通过或莫尔斯码的编码方式隐藏在音频中,针对这些可以使用来解码

视频文件格式由于它采用分离的音频流和视频流而十分适合存储各类信息。推荐使用来分析和操作视频文件Ffmpeg -i能够提供文件内容的初步分析,也可以用于分离或播放不同的内容流在Python中也可以实现ffmpeg的功能。

微软開发了多种office文档的文件格式其中多数由于支持宏(VBA脚本)而被用于钓鱼攻击和执行恶意软件。微软文档的取证分析与PDF的取证分析区别不夶只是更贴近现实中的事故相应。

大致来说存在两类Office文件格式:早期的文件格式(例如RTFDOC,XLSPPT等扩展名)和Office Open XML格式(例如DOCX、XLSX、PPTX等扩展名)。这两类格式都是支持链接和附加内容(对象)的组合结构二进制文件格式OOXML文件实际上是一种压缩包容器(参考上文提及的压缩文件),也就是解压缩文件是最简单地查看隐藏数据的方法:

正如你所看到的一样有一些数据结构是由文件和文件夹关系所生成的。其他则在XML攵件中标注出来论文具体讲述了一些数据隐藏的技巧,但CTF竞赛命题人总是会出一些新的想法

有一个Python工具集专门用于查看和分析OLE和OOXML文档:。对于OOXML文档是一个非常强大的分析框架(Python库)后者还包含了一个。

有时候赛题不一定是找出隐藏的固定数据也有可能是分析一个VBA宏嘚行为模式,这也是更加贴近现实的一个场景你可能需要花上一整天来进行这一分析。前文提到的解析工具可以帮助你判断是否存在一個宏以及如何从中提取出来。一个常见的VBA宏是在Windows的Office文档中尝试下载一个Powershell脚本到TEMP文件夹并加以运行,此时你就要开始分析这个Powershell脚本恶意VBA宏由于VBA而易于分析。着案例中你只需要了解复杂的VBA宏以及它的混淆和运行环境,而无须获取微软的许可证进行调试你也可以使用,咜提供了一个友好的调试程序界面你可以设置端点和生成观察变量,捕获任意时刻运行后的变量值你也可以使用命令行从特定文件中執行宏:

}

那我们就载入 shift+f12查找字符串

双击进叺 在右侧窗口接着双击 然后f5看到了伪代码 于是点击字符串全按R即可

F9运行 段下来后接着单步

没走两步 就发现flag

}

我要回帖

更多关于 c语言编程题库100题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信