通过准备ctf所学习到的知识

通过准备CTF比赛所学习到的知识

前言

有时候为了节约时间就偷懒直接用文字代替了,我知道这样会让有些朋友看不明白,如果不明白的话可以加我的QQ来交流,本人也比较喜欢广交朋友。
回归正题,马上要参加CTF比赛了,但是也不知道初赛能不能过…..-.-

WEB篇

WEB篇目作为非常大的一面,也许是我做的还不够多,做了做百度杯的题,就知识的涉及的话,我个人感觉它涉及的并不多,但是非常考验逻辑思考能力以及经验问题。
拿到一个web题目
一、要看他的名字是否透露出了一些信息
二、查看他的源代码
三、抓包分析
这是拿到一个web题目最基本的流程,通过抓包改包来透出一些其他的信息,但是之后就涉及到了代码审计,当他给出这个功能实现的源代码,你要能通过审计来audit他的小漏洞或者是反向写出另外一个php代码来找到数据,这是我个人认为很难的一点,也许是还没有学习php..还有就是有些大量的琐碎的事情,需要写另一些脚本来运行,还好我学的是python,可以用来做这样的一些事情,但是思路方面还是要不断练习
还有就是利用web渗透的方法,像什么注入,以及万能密码直接过…….

web方面涉及的知识也比较多,还是要不断做题才能发现更多的知识点以及更为老练的经验..

隐写术篇

图片隐写

在隐写术篇目中只先接触了图片隐写,而视频隐写暂时还未了解,一切的拓展,等赛后再次充实,为了下次比赛的绽放,哈哈。
关于图片的隐写我来介绍几种我这几天遇到的
第一种:直接在图片中隐藏一些信息,我们可以通过stegsolve这款调节像素的工具来调节图片的像素从而来发现这个图片是否隐写了一些信息。
第二种:图片中包含一个另一个文件,或者是一个解压包或者有另一个图片。我们通过binwalk(我在kali环境)来查看这个文件是否含有其他的文件binwalk xx.xx。然后利用dd命令来将他分出来dd if=源文件 of=要输出的文件名 bs=1 skip=xxx 来将文件输出出来,binwalk后在你如果发现了其他名称的文件,在他的文件名前边会有一个编号,将他输入到skip后,就可以将这个文件从源文件中提取出来,of就是提取后的文件。
dd和binwalk用法不止在图片的隐写以及分离中使用,他很强大,有兴趣的朋友可以多多了解。
第三种:对图片的每一帧每一帧的查看,可能会得到相关的信息。
第四种:他会给你一串代码,或许是base64编码,我们可以拿到Image2Base64这个网站将bas64转为图片格式,再从图片上发现信息,如果图片发现不了信息,可以拿到谷歌图片去搜索这个图片的相关信息。
直接用记事本打开

有时候我们发现一个图片损坏,我们可以查看一些各种格式的文件头,然后利用winhex(windows环境下)和Ghex(linux环境下),看看他的格式头是否和标准格式头相同,然后来修改其中的一些东西,使其能够正常运行,所以我们需要收集一些文件头以备不时之需
如果是一个没有后缀的文件可以尝试加一个rar来看看里边有没有东西

音频隐写

关于音频隐写这里只是简单的涉及了一个工具的使用,叫做silenteye直接将音频文件放进去decode即可,运气好可以直接爆出来…..

密码篇

摩斯密码

哈哈,很著名的一种密码,举手眨眼间就可以散发出密码的味道。关于摩斯密码,我们要背一些东西,他的加密表。
摩斯密码表当然网上也有在线的解密器,但是为了提高自己的逼格,还是背一下,毕竟感觉很高大上哦~

培根密码

培根密码是采用a和b来构成的,解密请看他的密码表
note:只有a和b的也不一定是培根密码,也有可能是摩斯密码

猪圈密码

直接看他的密码表吧,如果不懂百度即可加我QQ互相探讨也可以
猪圈密码表

rot13密码

这是rot13的置换表
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
比如:hello world经过rot13加密后就为
uryyb jbeyq

凯撒加密

凯撒加密其实就是根据字母表将消息中的字母移动常量k,举个例子。比如我想隐藏的密文是hello,然后移动的常量是3,最后得出的密文就是khoor这样。
我们也可以写一个脚本来快速得到解密后的值,这个写起来比较简单,网上的方法也很多,我也就不再赘述。

栅栏密码

关于栅栏密码的实现
比如这是一串密文 you are so beautiful
拿到明文后,先把明文的空格去掉,变为youaresobeautiful,然后将他两两分为一组,yo ua re so be au ti fu l,然后将第一个字母取出,得出一组,yursbatfl 然后将第二个字母取出来,得为第二组。 oaeoeuiu,然后将两组连到一起从而得到最后的密文。
解密为他的逆向,你懂得。

我们通过一个python脚本来快速的得出栅栏密码的明文,网上找大牛的,代码的实现还没有细细研究,不过也不难,赛后再好好看看,现在先保存可能比赛的时候用。(不过我已经背下了哦-.-)

1
2
3
4
5
6
7
8
9
10
result = {
0:'',1:'',2:'',3:'',4:'',5:'',6:'',7:'',8:'',9:'',10:'',11:'',12:'',13:'',14:'',15:'',16:'',17:''
}
b = 17
cryptograph = '密文'
for i in range(len(cryptograph)):
a = a%b
result.update({a:result[a]+str(i)})
for i in range(b):
print(result[i])

通过代码的实现,我们可以快速的得到栅栏密码的明文方式。

bf

不知道这个能不能算是一种密码,但我觉得应该算。
有时候我们看到一串诸如++++++++++++[>++++>+++++>++++++>++这样的代码,我们可以猜想,或许他就是brainfuck语言的代码,而后缀为bf就是这种语言的特有后缀,我们可以通过c语言来写出brainfuck的解释器从而来破解这段密文,以下是用c实现brainfuck解释器的代码:(当然我现在还写不出来-.-)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define TOKENS "><+-.,[]"

#define CODE_SEGMENT_SIZE 30000
#define STACK_SEGMENT_SIZE 1000
#define DATA_SEGMENT_SIZE 30000

typedef void (*Callback)(void);

struct {
char cs[CODE_SEGMENT_SIZE]; /* Code Segment */
long ip; /* Instruction Pointer */

char ss[STACK_SEGMENT_SIZE]; /* Stack Segment */
long sp; /* Stack Pointer */

char ds[DATA_SEGMENT_SIZE]; /* Data Segment */
long bp; /* Base Pointer */

Callback fn[128];
} vm;

void vm_forward() {
vm.bp = (vm.bp + 1) % DATA_SEGMENT_SIZE;
}

void vm_backward() {
vm.bp = (vm.bp + DATA_SEGMENT_SIZE - 1) % DATA_SEGMENT_SIZE;
}

void vm_increment() {
vm.ds[vm.bp]++;
}

void vm_decrement() {
vm.ds[vm.bp]--;
}

void vm_input() {
vm.ds[vm.bp] = getchar();
}

void vm_output() {
putchar(vm.ds[vm.bp]);
}

void vm_while_entry() {
if (vm.ds[vm.bp]) {
vm.ss[vm.sp] = vm.ip - 1;
vm.sp++;
} else {
int c = 1;
for (vm.ip++; vm.cs[vm.ip] && c; vm.ip++) {
if (vm.cs[vm.ip] == '[') {
c++;
} else if (vm.cs[vm.ip] == ']') {
c--;
}
}
}
}

void vm_while_exit() {
if (vm.ds[vm.bp]) {
vm.sp--;
vm.ip = vm.ss[vm.sp];
}
}

void setup() {
int c;
int i;

memset(&vm, 0, sizeof(vm));
vm.fn['>'] = vm_forward;
vm.fn['<'] = vm_backward;
vm.fn['+'] = vm_increment;
vm.fn['-'] = vm_decrement;
vm.fn['.'] = vm_output;
vm.fn[','] = vm_input;
vm.fn['['] = vm_while_entry;
vm.fn[']'] = vm_while_exit;

for (i = 0; (c = getchar()) != EOF;) {
if (strchr(TOKENS, c)) {
vm.cs[i] = c;
i++;
}
}
}

void run() {
while (vm.cs[vm.ip]) {
vm.fn[vm.cs[vm.ip]]();
vm.ip++;
}
}

int main(int argc, char* argv[]) {
if (argc > 1) {
freopen(argv[1], "r", stdin);
}

setup();
run();

return 0;
}

将他运行一遍然后将所得到的exe文件保存以后直接使用exe文件即可。我们把密文保存为.bf后缀,然后运行。
**注意:
运行时候要brainfuck.exe xxxx.bf这样来运行。

数据流分析篇

刚接触了一个ctf的数据流分析题,也许是刚接触wireshark和数据的分析,做的实在头大,看见格式为pcapng还以为是写错了图片格式,自作主张的将其改为了Png……
关于数据包的分析这一节先不做解释,还是等赛后全面充实的时候再做全面拓展。