首先我们对前面的几期做一个小总结
首先我们说到了top10的文件上传,sql注入,xss注入,rce漏洞
还有内网渗透的永恒之蓝
这里涵盖的面有web渗透和内网渗透,对于这两大板块,我们都还没有完结,远没有完结
先说一下我们还差的内容,web渗透的top10中还有xee csrf等,内网渗透还有永恒之黑,权限维持,后门等
为了后面我们的内容各位能够更方便的理解,这里我决定对一些干货做一些补充(实践决定下限,理论决定上限)所以这一期我们浅说一下c语言(下一期就是php)(这一期由我个人纯手敲)
在c语言中有头文件和源文件这两类文件分别是(后缀名为.h为头文件,后缀名为.cpp为源文件)源文件中会有main函数main函数是所有函数和程序最终运行的位置
C++也一样现在c和c++被统称为c/c++
这里一张图可以说明

c语言的第一个程序
我们用编译器看源码

这个就是c语言的第一个程序输出hello,world我们编译一下看一下效果

这就是最后的效果
这一段源码中我们可以看到第一句话的#include<>就是引用文件<>中的内容就是文件的名字
#开头的内容都叫做预编译指令#include就是表示的引用的意思(后面我们还会提到预编译指令和#include)
int main就是main函数是程序最终运行的地方
printf()就是输出函数,括号的内容就是输出的内容(我们后面还会提到这个函数)
可以看到printf后面的()里面的参数是字符串””里面的内容就是表示字符串其中\n是转义字符这里表示的是回车转义字符我们后续还会提到
return 0表示函数的返回值
{}大括号内的内容就是函数体部分
;表示这一条语句的结束
在c语言中return int main 这些都叫关键字各位可以看一下关键字表
auto :声明自动变量
short :声明短整型变量或函数
int: 声明整型变量或函数
long :声明长整型变量或函数
float:声明浮点型变量或函数
double :声明双精度变量或函数
char :声明字符型变量或函数
struct:声明结构体变量或函数
union:声明共用数据类型
enum :声明枚举类型
typedef:用以给数据类型取别名
const :声明只读变量
unsigned:声明无符号类型变量或函数
signed:声明有符号类型变量或函数
extern:声明变量是在其他文件正声明
register:声明寄存器变量
static :声明静态变量
volatile:说明变量在程序执行中可被隐含地改变
void :声明函数无返回值或无参数,声明无类型指针
if:条件语句
else :条件语句否定分支(与 if 连用)
switch :用于开关语句 case:开关语句分支
for:一种循环语句
do :循环语句的循环体
while :循环语句的循环条件
goto:无条件跳转语句
continue:结束当前循环,开始下一轮循环
break:跳出当前循环
default:开关语句中的“其他”分支
sizeof:计算数据类型长度
return :子程序返回语句(可以带参数,也可不带参数)循环条件
这些就是关键字表(这里只是部分关键字)
我们先讲一下变量声明和运算符
变量的类型主要有整型 浮点型 字符型
我们先说整型 有int long short
在声明变量的时候我们会看到int a;
其中a就是变量名
1对于变量名不能以关键字命名(这里补充说明一下,一般的编译器都是可以编译c/c++的所以也不能包含c++的关键字)
2不建议使用_下划线开头来定义变量名(因为有很多系统定义的变量名都是_开头防止变量冲突)
3变量名是严格区分大小写的就好比说int a和int A是声明了两个不同的变量
4变量名中不能有空格开头
然后我们说一下int long short之间的区别
直观一点来说就是对变量的长度限制也就是说我们定义的这三种不同的变量长度是有一定上限的,这里我说的长度就是变量的最大值是有限制的int是-2147483648~+2147483647 long是-2147483648~+2147483647 (同int)short是-32768~+32767
这里我们还要说明一个问题就是unsigned关键字这个关键字表示这个变量是无符号的
也就是说是没有负数的情况的
例如unsigned int的取值范围就是0-2的32次方-1
在定义变量的时候我们如果没有说明unsigned那么默认就是signed就是有符号的可以取值到负数
浮点型 float double
浮点型就是带小数的数据float double的区别就是精度上的区别
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位
下面我们来说char类也就是字符类
字符类char有两种例如我们声明的时候有char a和char* a两种形式后者表示字符串前者表示单个字符
通常情况下字符串我们会有一个默认\0的结束字符也就是转义字符表示结束
后面我们了解到数组的时候我们会说到char[]也可以用来表示字符串(这里只是简单提一下)
对字符和字符串的理解暂时没必要太深刻后续还会解释的
下面我们来说一下运算符
常见的加减乘除在c语言中表示为+ – * /
这一类我们称作算术运算符除了这四个运算符之外我们还有%(叫做取余运算)
我们按最难的来先说吧,也不算是最难,这个可能是我认为不好理解的
%取余运算例如

这里b的值是1,取余运算就是按照小学的除法来算11➗2=5…….1读作11除以2等于5余1,也就是说这个运算我们只取余数(可以为0)
+运算符就是加法

b的值是13
-就是减法运算

b的值就是9
*就是乘法运算

b的值就是22
/就是除法运算

这里特别注意b的值是5
我们按照正常的逻辑来算11除以2很明显应该是5.5但是我们给b的定义是int型也就是整型,不能有小数,所以程序在计算的时候就会计算11/2的值是5.5但是要赋值给b,可是b不是浮点型,而是整型,就会强制转换为整型这样就会损失掉0.5的精度如果我们把b的类型改为float结果就是5.5了
当我们在做数据类型转换的时候整型转换为浮点型不会损失精度,但是浮点型转换为整型的时候会把小数点后面的数据全部视作0
也就是说高精度的数据转换为低精度的数据会损失精度,而低精度的数据类型转换为高精度的数据类型则不会损失精度
这就是算术运算
下面我们说一下逻辑运算&& || !
这三个逻辑运算符就是表示 和 或 非
首先我们说一下什么是逻辑值
逻辑值也就是bool类的值,在定义变量的时候我们没有说过这个类型,因为这个类型很简单只有两个值就是真和假分别是真和假
在c语言中所有的非零值都可以表示真在c语言中本来是没有我们可以定义的bool类型的但是这个类型实质意义是存在的,c++中可以定义,所以你在编译器中输入 bool a不会报错
下面我们来说逻辑运算法则
&&表示和 例如 a&&b 当a和b都为真的时候a&&b的值就为真有一个是假那么a&&b为假
||表示或 例如a||b 当a和b其中只要有一个为真的时候a||b就为真
!表示非 例如 !a 当a的值为真那么!a为假
这就是逻辑运算法则
下面我们来说一下位运算(这里有点难了,我当时也是这里卡着了)
位运算是针对的二进制的整型数据的,或者说是整型数据被化作二进制才能进行这个运算(这个转换过程程序会自动转换,不需要人为操作)
C中的位运算
&: 按位与(两者同为1则为1,否则为0)
|:按位或 (两则同为0则为0,否则为1)
^: 按位异或(两则相同则为0,相异则为1)
~: 取反 (1取0,0取1)
<<:左移 (相当于乘2)
>:右移 (相当于除2)

这里绿色部分就是注解注解的格式有两种/* */这种就是表示两个*之间的内容为注解内容
还有一种//如图所示 //后面的部分就是注解的内容
注解的内容是不会被编译器编译的(说白了就是有人要看你的代码的时候别人看不懂了就要看你的注解)

可以看到和我们预期的结果一样
=号的赋值运算
可以看到我们上面

这里a=11就是将11这个值赋给a
几种特殊的赋值方法+= -= *= /=
a+=12表示的意思就是a在原有的基础上加12赋值给a
也就是a=a+12等于号最后计算
其他的也是这个意思(我个人一般情况不建议这样写,)
还有一些特殊的计算符++和–分别表示自增加和自递减
值得注意的是a++和++a有区别
前者表示先对a做自增加在做其他的运算++a表示先做其他运算在自增加
–也是如此
三元运算符
这个运算符比较特殊,我们上面接触的所有运算符都是二元运算符也就是说被操作的数据只有两个三元运算符顾名思义也就是有三个操作符
Exp1?exp2:exp3
这个运算符类似于这个格式exp1的值为真返回exp2的值exp1为假返回exp3的值
下面我们来说表达式
关系表达式,这里也就要说到关系运算符
< > <= >= == !=
这些就是关系运算符返回值为逻辑值真或者假
这些分别是小于 大于 小于等于 大于等于 等于 不等于
值得注意的是两个=是表示判断是否相等 而一个等于表示赋值
算术表达式就是用到+-*/%的运算法则
这里我们说一下运算符的优先级
1 [] 数组下标 数组名[常量表达式] 左到右 —
() 圆括号 (表达式)/函数名(形参表) —
. 成员选择(对象) 对象.成员名 —
-> 成员选择(指针) 对象指针->成员名 —
2 – 负号运算符 -表达式 右到左 单目运算符
~ 按位取反运算符 ~表达式
++ 自增运算符 ++变量名/变量名++
— 自减运算符 –变量名/变量名–
* 取值运算符 *指针变量
& 取地址运算符 &变量名
! 逻辑非运算符 !表达式
(类型) 强制类型转换 (数据类型)表达式 —
sizeof 长度运算符 sizeof(表达式) —
3 / 除 表达式/表达式 左到右 双目运算符
* 乘 表达式*表达式
% 余数(取模) 整型表达式%整型表达式
4 + 加 表达式+表达式 左到右 双目运算符
– 减 表达式-表达式
5 << 左移 变量<<表达式 左到右 双目运算符
>> 右移 变量>>表达式
6 > 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式
< 小于 表达式<表达式
<= 小于等于 表达式<=表达式
7 == 等于 表达式==表达式 左到右 双目运算符
!= 不等于 表达式!= 表达式
8 & 按位与 表达式&表达式 左到右 双目运算符
9 ^ 按位异或 表达式^表达式 左到右 双目运算符
10 | 按位或 表达式|表达式 左到右 双目运算符
11 && 逻辑与 表达式&&表达式 左到右 双目运算符
12 || 逻辑或 表达式||表达式 左到右 双目运算符
13 ?: 条件运算符 表达式1?表达式2: 表达式3 右到左 三目运算符
14 = 赋值运算符 变量=表达式 右到左 —
/= 除后赋值 变量/=表达式 —
*= 乘后赋值 变量*=表达式 —
%= 取模后赋值 变量%=表达式 —
+= 加后赋值 变量+=表达式 —
-= 减后赋值 变量-=表达式 —
<<= 左移后赋值 变量<<=表达式 —
>>= 右移后赋值 变量>>=表达式 —
&= 按位与后赋值 变量&=表达式 —
^= 按位异或后赋值 变量^=表达式 —
|= 按位或后赋值 变量|=表达式 —
15 , 逗号运算符 表达式,表达式,… 左到右 —
这里有些运算符是我没讲到的,因为用的很少所以就没说太多
其中值得注意的是sizeof可以理解为函数
if关键字

if(返回值为逻辑值的表达式)
{
逻辑值为真则执行这个部分的语句 逻辑值为假就不执行
}
if关键字用于选择
我们可以在{}内再写入if关键字做二次判断
也可以下载{}外面或者是后面继续判断
if …else…
if(返回值为逻辑值的表达式)
{
逻辑值为真则执行这个部分的语句
}
else
{
逻辑值为假则执行这个部分的语句
}
今天就先到这里吧,预计三期发布完毕



