首先我們說到了top10的文件上傳,sql注入,xss注入,rce漏洞還有內網滲透的永恒之藍這裏涵蓋的麵有web滲透和內網滲透,對於這兩大板塊,我們都還沒有完結,遠沒有完結先說一下我們還差的內容,web滲透的top10中還有xeecsrf等,內網滲透還有永恒之黑,權限維持,後門等為了後麵我們的內容各位能夠更方便的理解,這裏我決定對一些幹貨做一些補充(實踐決定下限,理論決定上限)所以這一期我們淺說一下c語言(下一期就是php)(這一期由我個人純手敲)在c語言中有頭文件和源文件這兩類文件分別是(後綴名為.h為頭文件,後綴名為.cpp為源文件)源文件中會有main函數main函數是所有函數和程序最終運行的位置C++也一樣現在c和c++被統稱為c/c++,c語言的第一個程序我們用編譯器看源碼這個就是c語言的第一個程序輸出hello,world我們編譯一下看一下效果這就是最後的效果這一段源碼中我們可以看到第一句話的#include<>就是引用文件<>中的內容就是文件的名字#開頭的內容都叫做預編譯指令#include就是表示的引用的意思(後麵我們還會提到預編譯指令和#include)intmain就是main函數是程序最終運行的地方printf()就是輸出函數,括號的內容就是輸出的內容(我們後麵還會提到這個函數)可以看到printf後麵的()裏麵的參數是字符串””裏麵的內容就是表示字符串其中是轉義字符這裏表示的是回車轉義字符我們後續還會提到return0表示函數的返回值{}大括號內的內容就是函數體部分;表示這一條語句的結束在c語言中returnintmain這些都叫關鍵字各位可以看一下關鍵字表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:子程序返回語句(可以帶參數,也可不帶參數)循環條件這些就是關鍵字表(這裏隻是部分關鍵字)我們先講一下變量聲明和運算符變量的類型主要有整型浮點型字符型我們先說整型有intlongshort在聲明變量的時候我們會看到inta;其中a就是變量名1對於變量名不能以關鍵字命名(這裏補充說明一下,一般的編譯器都是可以編譯c/c++的所以也不能包含c++的關鍵字)2不建議使用_下劃線開頭來定義變量名(因為有很多係統定義的變量名都是_開頭防止變量衝突)3變量名是嚴格區分大小寫的就好比說inta和intA是聲明了兩個不同的變量4變量名中不能有空格開頭然後我們說一下intlongshort之間的區別直觀一點來說就是對變量的長度限製也就是說我們定義的這三種不同的變量長度是有一定上限的,這裏我說的長度就是變量的最大值是有限製的int是-2147483648~+2147483647long是-2147483648~+2147483647(同int)short是-32768~+32767這裏我們還要說明一個問題就是unsigned關鍵字這個關鍵字表示這個變量是無符號的也就是說是沒有負數的情況的例如unsignedint的取值範圍就是0-2的32次方-1在定義變量的時候我們如果沒有說明unsigned那麼默認就是signed就是有符號的可以取值到負數浮點型floatdouble浮點型就是帶小數的數據floatdouble的區別就是精度上的區別float:2^23\u003d8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;double:2^52\u003d4503599627370496,一共16位,同理,double的精度為15~16位下麵我們來說char類也就是字符類字符類char有兩種例如我們聲明的時候有chara和char*a兩種形式後者表示字符串前者表示單個字符通常情況下字符串我們會有一個默認\\0的結束字符也就是轉義字符表示結束後麵我們了解到數組的時候我們會說到char[]也可以用來表示字符串(這裏隻是簡單提一下)對字符和字符串的理解暫時沒必要太深刻後續還會解釋的下麵我們來說一下運算符常見的加減乘除在c語言中表示為+-*/這一類我們稱作算術運算符除了這四個運算符之外我們還有%(叫做取餘運算)我們按最難的來先說吧,也不算是最難,這個可能是我認為不好理解的%取餘運算例如這裏b的值是1,取餘運算就是按照小學的除法來算11➗2\u003d5.......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也就是說高精度的數據轉換為低精度的數據會損失精度,而低精度的數據類型轉換為高精度的數據類型則不會損失精度這就是算術運算下麵我們說一下邏輯運算\u0026\u0026||!這三個邏輯運算符就是表示和或非首先我們說一下什麼是邏輯值邏輯值也就是bool類的值,在定義變量的時候我們沒有說過這個類型,因為這個類型很簡單隻有兩個值就是真和假分別是真和假在c語言中所有的非零值都可以表示真在c語言中本來是沒有我們可以定義的bool類型的但是這個類型實質意義是存在的,c++中可以定義,所以你在編譯器中輸入boola不會報錯下麵我們來說邏輯運算法則\u0026\u0026表示和例如a\u0026\u0026b當a和b都為真的時候a\u0026\u0026b的值就為真有一個是假那麼a\u0026\u0026b為假||表示或例如a||b當a和b其中隻要有一個為真的時候a||b就為真!表示非例如!a當a的值為真那麼!a為假這就是邏輯運算法則下麵我們來說一下位運算(這裏有點難了,我當時也是這裏卡著了)位運算是針對的二進製的整型數據的,或者說是整型數據被化作二進製才能進行這個運算(這個轉換過程程序會自動轉換,不需要人為操作)C中的位運算\u0026:按位與(兩者同為1則為1,否則為0)|:按位或(兩則同為0則為0,否則為1)^:按位異或(兩則相同則為0,相異則為1)~:取反(1取0,0取1)<<:左移(相當於乘2)>>:右移(相當於除2),這裏綠色部分就是注解注解的格式有兩種/**/這種就是表示兩個*之間的內容為注解內容還有一種//如圖所示//後麵的部分就是注解的內容注解的內容是不會被編譯器編譯的(說白了就是有人要看你的代碼的時候別人看不懂了就要看你的注解)可以看到和我們預期的結果一樣\u003d號的賦值運算可以看到我們上麵這裏a\u003d11就是將11這個值賦