从ctf-all-in-one开始学习ctf之第一天:认识ctf

参考自:https://www.gitbook.com/book/firmianay/ctf-all-in-one/details

CTF( Capture The Flag)比赛分为三类:

1.解题模式:emmm就是做题,一般用于在线选拔,题目主要包括逆向、漏洞挖掘与利用、web渗透、密码、取证、隐写、安全编程等。官方说法这种模式的CTF竞赛与ACM编程竞赛、信息学奥赛比较类似, 以解决网络安全技术挑战题目的分值和时间来排名,通常用于在线选拔赛。题目主要包含逆向、漏洞挖掘与利用、Web渗透、密码、取证、隐写、安全编程等类别

2.攻防模式:参赛队伍互相攻击渗透。官方说法参赛队伍在网络空间互相进行攻击和防守,挖掘网络服务漏洞并攻击对手服务来得分,修补自身服务漏洞进行防御来避免丢分。攻防模式CTF赛制可以实时通过得分反映出比赛情况,最终也以得分直接分出胜负,是一种竞争激烈,具有很强观赏性和高度透 明性的网络安全赛制。在这种赛制中,不仅仅是比参赛队员的智力和技术,也 比体力(因为比赛一般都会持续48小时及以上),同时也比团队之间的分工配合与合作。

3.混合模式:既有解题又有攻防。官方说法结合了解题模式与攻防模式的CTF赛制,比如参赛队伍通过解题可以获取一些初始分数,然后通过攻防对抗进行得分增减的零和游戏,最 终以得分高低分出胜负。

题目类别:

Reverse 题目涉及到软件逆向、破解技术等,要求有较强的反汇编、反编译功底。 主要考查参赛选手的逆向分析能力。 所需知识:汇编语言、加密与解密、常见反编译工具

Pwn    在黑客俚语中代表着攻破,获取权限,在CTF比赛中它代表着溢出类的题目,其中常见类型溢出漏洞有整数溢出、栈溢出、堆溢出等。主要考查参赛选手对漏洞的利用能力。所需知识:C,OD+IDA,数据结构,操作系统 

(只列出了我想学的方向,其他方向参考ctf-all-in-one)

gcc技巧:

通常在编译后只会生成一个可执行文件,而中间过程生成的 .i、.s、.o文件都不会被保存。我们可以使用参数 -save-temps永久保存这些临时的中间文件。命令如下:

gcc    -save-temps    hello.c  

ls 可查看几个文件

使用参数  --verbose  可以输出gcc详细的工作流程

    gcc    hello.c    -static    --verbose

 cc1、as和collect2、cc1是gcc的编译器,将.c文件编译为.s文件,as是汇编器命令,将.s文件汇编成.o文件,collect2是链接器命令,它是对命令ld的封装

 

0x80000000=-2147483647?为什么

参考 https://blog.csdn.net/youyou362/article/details/72667951

(1)十进制负数是以其补码储存在内存上  

以-8为例,32位系统中,-8是以补码的形式存储在内存上的。

-8原码为1000 0000 0000 0000 0000 0000  0000 1000

取反得反码,第一位符号不变 1111 1111 1111 1111 1111 1111 1111 0111

加反码1得补码   第一位不变 1111 1111 1111 1111 1111 1111 1111 1000

(2)但是在十六进制中,负数在内存中储存的是原码,但在十六进制中负数的二进制原码的最高位是符号位,后面的31位为序号位,不是值位。以0x8000 0000=-2147483647=-(2^32-1)为例

0x8000 0000二进制原码为:1000 0000 0000 0000 0000 0000 0000 0000

最高位1是符号位,表示该数为负数,后面31个零,表示的是序号为1的那个数,即把-2^31-1  ~  +2^31-1之间的所有负数(总共有-2^31-1个负数)从小到大排列,位于第一位那个数(最小的那个数),就是-2147483647=-(2^31-1)。

 

再以0xFFFF FFFF = -1为例

0xFFFF FFFF二进制原码为1111 1111 1111 1111 1111 1111 1111 1111

最高位为1,表示负数,后面31个1,表示的是序号为2^31-1,即把-(2^31-1)  ~  +2^31-1之间的所有负数从小到大排列,位于第2^31-1位那个数(最后大的负数),就是-1=-(2^31-(2^31-1))。

(4)十进制的补码也符合 符号位+序号位的原则

以-8为例:-8的补码是1111 1111 1111 1111 1111 1111 1111 1000

最高位为1,表示负数,后面29个1三个0,表示的是序号2^31-8,即把-(2^31-1)~+2^31-1之间的所有负数从小到大排列,位于第2^31-8位那个数,就是-8=-(2^31-(2^31-8))。

负数的位右移运算:

原则:若右移的数字为负值,则向右移动N位同时N个1补充在左边

若为正值,则以N个0补充在左边

 

 

 

 

 

 

你可能感兴趣的:(从ctf-all-in-one开始学习ctf之第一天:认识ctf)