首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,542 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,350 阅读
3
【技术分享】NASM x86 Assembly Language
5,982 阅读
4
【技术分享】CK竞技之王游戏辅助制作
3,725 阅读
5
【每日随记】天涯明月刀无限飞修改思路
2,816 阅读
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
Search
标签搜索
Windows
Web安全
Python3
Linux
逆向工程
CTF
红队技术
人工智能
C/C++
黑客工具
Go
密码学
二进制安全
数学
漏洞挖掘
Android
eNSP
渗透测试
蓝队技术
黑客大会
发光的神
累计撰写
160
篇文章
累计收到
103
条评论
首页
栏目
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
页面
实用工具
我的旅程
在线壁纸
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
160
篇与
的结果
2021-04-09
【技术分享】C++ 命名空间
简介1.为什么要有命名空间? 其实很简单在开发中我们会创建函数比如 test(),在另一个可用的库中也存在一个相同的test()函数,这个时候编译器就无法判断你使用的是哪一个函数。2.因此,我们要引入命名空间,它是用来专门解决这个问题的,它是用来区分不同库中的相同名称的函数、类、变量等。 使用命名空间就可以定义上下文。3.简单来说,命名空间就是定义一个范围,以下例子可以让你很清楚的了解到。用命名空间前#include <iostream> int main() { std::cout << "Hello, World!" << std::endl; // 没用前发现要接std::才可以使用 return 0; }用命名空间后#include <iostream> using namespace std; // 使用命名空间后 int main() { cout << "Hello, World!" << endl; // 发现不需要std::了 return 0; }命名空间前后关系#include <iostream> int main() { cout << "Hello, World!" << endl; using namespace std; // 关键的来了 要是把位置放在这里 那么上面的语句就找不到会报错,只会认识下面的。 cout << "Hello, World!" << endl; return 0; }
2021年04月09日
56 阅读
0 评论
2 点赞
2021-04-08
【技术分享】C语言学习笔记
简介很早以前就学过C语言了,那个时候Python刚热门起来也学了下来,毕竟轮子多嘛方便,后面不怎么用C了慢慢的就忘记了,现在整理下复习笔记,方便自己查阅资料。C语言环境安装Mingw下载地址: https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe1.下载完后运行Mingw,到这个界面后点击左上角的 Basic Setup,在右边面板寻找 mingw32-gcc-g++,鼠标右击并点击 Mark for Installation,之后再点击左上角的 Installation > Apply Changes。2.下载完后关掉所有界面,右击"此电脑" > 属性 > 高级系统设置 > 环境变量 > 在下面的系统变量中双击Path,如果之前没有改过安装路径,就添加 C:\MinGW\bin,按情况来添加。gcc --version3.添加好后输入 gcc --version 回车,能看见正常显示那就没问题了,只要配置了gcc的环境变量,那么vscode也可以运行。VSCode运行C代码1.到vscode应用商店安装,Code Runner 有了这个插件就很方便了,直接在vscode里运行代码。gcc编译器运行C程序gcc a.c -o a && a // C g++ a.cpp -o a && a // C++1.通过终端输入以上gcc命令,也是可以执行成功的。C语言中的关键字1.在C语言中,有32个关键字,它们具有预定义的含义,不能用作变量名,这些词也被称为 "保留词",最好避免将这些关键字用作变量名。if,else,switch,case,default – 用于决策控制编程结构。 break – 用于任何循环或者switch-case。 int,float,char,double,long – 这些是数据类型,在变量声明期间使用。 for,while – C 中的循环结构类型。 void – 其中一种返回类型。 goto – 用于重定向执行流程。 auto,signed,const,extern,register,unsigned – 定义一个变量。 return – 该关键字用于返回值。 continue – 它通常与for,while和do-while循环一起使用,当编译器遇到此语句时,它执行循环的下一次迭代,跳过当前迭代的其余语句。 enum – 常量集。 sizeof – 用于了解尺寸。 struct, typedef – 结构中使用的这两个关键字(单个记录中的数据类型分组)。 union – 它是一组变量,它们共享相同的内存位置和内存存储。 volatile编写第一个C程序先来编写一个经典的开场,那就是你好世界啦,C语言是强类编译型语言,文件后缀是以.c结尾,c++是以.cpp结尾。好了先创建一个 a.c 文件,将以下代码写入 a.c 文件里,然后再运行。#include <stdio.h> // 预处理器指令,告诉C编译器在实际编译之前要包含 stdio.h 文件 int main() { // main主函数,程序从这里开始执行 printf("Hello, World!"); // 输出函数 会在终端上显示内容 return 0; // 终止 main() 函数,并返回值 0 }输出结果:Hello, World!代码注释1.在日常的开发中,代码只会越写越多,而且不止是你一人在写,在团队中要想别人看的懂你的代码,就要用到注释了。// 单行注释 /* 多行注释 */ 2.内容写在注释里,编译器会忽略掉注释里的内容,这样就会方便我们在做开发的时候阅读代码。if-else语句if else语句的语法:如果条件返回true,则执行if正文内的语句,并跳过else正文内的语句。如果条件返回false,则跳过if正文中的语句,并执行else中的语句。if(condition) { // Statements inside body of if } else { //Statements inside body of else }#include <stdio.h> int main() { int par = 1; if (par == 1) { // 判断变量par 是否为真 printf("up"); // 成立就执行对的 }else{ printf("down"); // 否则就不成立 } return 0; }输出:upfor循环C语言中最常用的循环。步骤 1:首次初始化发生,计数器变量初始化。步骤 2:在第二步中检查条件,其中计数器变量由给定条件测试,如果条件返回true则执行for循环体内的 C 语句,如果条件返回false,则for循环终止,控制流退出循环。步骤 3:成功执行循环体内语句后,计数器变量会递增或递减,具体取决于操作(++或--)。for (initialization; condition test; increment or decrement) { //Statements to be executed repeatedly }#include <stdio.h> int main() { int i; for (i=1; i<=3; i++) { printf("%d\n", i); } return 0; }输出: 1 2 3C语言中的各种形式的for循环,我在以下所有例子中使用变量num作为计数器。1.这里使用num = num + 1而不是num ++。for (num=10; num<20; num=num+1)2.初始化部分可以从循环中跳过,如下所示,计数器变量在循环之前声明。int num=10; for (;num<20;num++)注意:即使我们可以跳过初始化部分但是分号(;)必须保留,否则你将得到编译错误。3.与初始化一样,您也可以跳过增量部分,如下所示。在这种情况下,分号(;)必须在条件逻辑之后。在这种情况下,增量或减量部分在循环内完成。for (num=10; num<20; ) { //Statements num++; } 4.这也是可能的,计数器变量在循环之前初始化并在循环内递增。int num=10; for (;num<20;) { //Statements num++; }5.如上所述,计数器变量也可以递减。在下面的示例中,每次循环运行时变量都会递减,直到条件num > 10返回false。for(num=20; num>10; num--)6.C语言中的嵌套for循环循环嵌套也是可能的。让我们举个例子来理解这个:#include <stdio.h> int main() { for (int i=0; i<2; i++) { for (int j=0; j<4; j++) { printf("%d, %d\n",i ,j); } } return 0; }输出: 0, 0 0, 1 0, 2 0, 3 1, 0 1, 1 1, 2 1, 37.在上面的例子中,我们在另一个for循环中有一个for循环,这称为循环嵌套。我们使用嵌套for循环的示例之一是二维数组。在 C 中循环内部进行多次初始化我们可以在for循环中进行多次初始化,如下所示。for (i=1,j=1;i<10 && j<10; i++, j++)上面的循环和简单的for循环有什么区别?它正在初始化两个变量。注意:两者都用逗号(,)分隔。它有使用 与(&&)逻辑运算符连接在一起的两个测试条件。注意:您不能使用以逗号分隔的多个测试条件,您必须使用逻辑运算符,例如&&或||连接条件。增量部分有两个变量。注意:应以逗号分隔。8.具有多个测试条件的for循环的示例#include <stdio.h> int main() { int i,j; for (i=1,j=1 ; i<3 || j<5; i++,j++) { printf("%d, %d\n",i ,j); } return 0; }输出: 1 2 3while循环1.循环用于重复执行语句块,如果条件返回true,则执行while循环体内的语句,否则控制退出循环。while (condition test) { //Statements to be executed repeatedly // Increment (++) or Decrement (--) Operation }#include <stdio.h> int main() { int count=1; while (count <= 4) { printf("%d ", count); count++; } return 0; }输出:1 2 3 42.while循环中使用逻辑运算符,就像关系运算符(< > <= >= == !=)一样,我们也可以在while循环中使用逻辑运算符。while(num1<=10 && num2<=10)while(num1<=10||num2<=10)while(num1!=num2 &&num1 <=num2)while(num1!=10 ||num2>=num1)3.在while循环中使用逻辑运算符测试多个条件#include <stdio.h> int main() { int i=1, j=1; while (i <= 4 || j <= 3) { printf("%d %d\n",i, j); i++; j++; } return 0; }输出: 1 1 2 2 3 3 4 4break语句1.break是用来退出循环的。#include <stdio.h> int main() { int num =0; while(num<=100) { printf("value of variable num is: %d\n", num); if (num==2) { break; } num++; } printf("Out of while-loop"); return 0; }输出: value of variable num is: 0 value of variable num is: 1 value of variable num is: 2 Out of while-loop2.在for循环中使用break#include <stdio.h> int main() { int var; for (var =100; var>=10; var --) { printf("var: %d\n", var); if (var==99) { break; } } printf("Out of for-loop"); return 0; }输出: var: 100 var: 99 Out of for-loop3.在switch-case中使用break语句#include <stdio.h> int main() { int num; printf("Enter value of num:"); scanf("%d",&num); switch (num) { case 1: printf("You have entered value 1\n"); break; case 2: printf("You have entered value 2\n"); break; case 3: printf("You have entered value 3\n"); break; default: printf("Input value is other than 1,2 & 3 "); } return 0; }输出: Enter value of num:2 You have entered value 2continue语句当在循环内遇到 continue语句时,控制流跳转到循环的开头以进行下一次迭代,跳过当前迭代循环体内语句的执行。#include <stdio.h> int main() { for (int j=0; j<=8; j++) { if (j==4) { continue; } printf("%d ", j); } return 0; }输出:0 1 2 3 5 6 7 8switch-case语句1.当我们有多个选项时,使用C语言switch-case语句,我们需要为每个选项执行不同的任务。switch (variable or an integer expression) { case constant: //C Statements ; case constant: //C Statements ; default: //C Statements ; }2.在switch-case中使用数字#include <stdio.h> int main() { int num=2; switch(num+2) { case 1: printf("Case1: Value is: %d", num); case 2: printf("Case1: Value is: %d", num); case 3: printf("Case1: Value is: %d", num); default: printf("Default: Value is: %d", num); } return 0; }输出:Default: value is: 23.在switch-case中使用字符#include <stdio.h> int main() { char ch='b'; switch (ch) { case 'd': printf("CaseD "); break; case 'b': printf("CaseB"); break; case 'c': printf("CaseC"); break; case 'z': printf("CaseZ "); break; default: printf("Default "); } return 0; }输出:CaseB4.switch的有效表达式switch(1+2+23) switch(1*2+3%4)5.无效的switch表达式switch(ab+cd) switch(a+b+c)goto语句goto label_name; .. .. label_name: C-statements#include <stdio.h> int main() { int sum=0; for(int i = 0; i<=10; i++){ sum = sum+i; if(i==5){ goto addition; } } addition: printf("%d", sum); return 0; }输出:15C语言按引用函数讨论按引用函数调用之前,让我们理解我们将在解释这个时使用的术语。实际参数:函数调用中出现的参数。形式参数:函数声明中出现的参数。int sum(int a, int b);int s = sum(10, 20); //Here 10 and 20 are actual parameters or int s = sum(n1, n2); //Here n1 and n2 are actual parameters按引用函数调用的示例#include <stdio.h> void increment(int *var) { *var = *var+1; } int main() { int num=20; increment(&num); printf("Value of num is: %d", num); return 0; }输出:Value of num is: 21在调用swapnum()函数后,变量的值已经更改,因为交换发生在变量num1和num2的地址上#include <stdio.h> void swapnum ( int *var1, int *var2 ) { int tempnum ; tempnum = *var1 ; *var1 = *var2 ; *var2 = tempnum ; } int main( ) { int num1 = 35, num2 = 45 ; printf("Before swapping:"); printf("\nnum1 value is %d", num1); printf("\nnum2 value is %d", num2); swapnum( &num1, &num2 ); printf("\nAfter swapping:"); printf("\nnum1 value is %d", num1); printf("\nnum2 value is %d", num2); return 0; }输出: Before swapping: num1 value is 35 num2 value is 45 After swapping: num1 value is 45 num2 value is 35文件I/O操作1.在上面的程序中,我们在r模式下打开文件newfile.txt,读取文件内容并在控制台上显示。#include <stdio.h> int main() { FILE *fp1; char c; fp1= fopen ("C:\\myfiles\\newfile.txt", "r"); while(1) { c = fgetc(fp1); if(c==EOF) break; else printf("%c", c); } fclose(fp1); return 0; }打开文件fopen()函数用于打开文件。FILE pointer_name = fopen ("file_name", "Mode");pointer_name可以是您选择的任何东西。file_name是您要打开的文件的名称。在此处指定完整路径,如C:\myfiles\newfile.txt。打开文件时,需要指定模式。我们用来读取文件的模式是r,它是 "只读模式"。FILE *fp; fp = fopen("C:\\myfiles\\newfile.txt", "r");第一个字符的地址存储在pointer fp中。如何检查文件是否已成功打开?如果文件未成功打开,则指针将被赋予NULL值,因此您可以编写如下逻辑:此代码将检查文件是否已成功打开。如果文件未打开,则会向用户显示错误消息。FILE fpr; fpr = fopen("C:\\myfiles\\newfile.txt", "r"); if (fpr == NULL) { puts("Error while opening file"); exit(); }文件打开模式使用fopen()函数打开文件,打开时可以根据需要使用以下任何一种模式。模式r:这是一种只读模式,这意味着如果文件在r模式下打开,它将不允许您编写和修改它的内容。当fopen()成功打开文件时,它返回文件第一个字符的地址,否则返回NULL。模式w:这是一种只写模式。fopen()函数在指定文件不存在时创建新文件,如果无法打开文件,则返回NULL。模式a:使用此模式,内容可以附加在现有文件的末尾。与模式w类似,如果文件不存在,fopen()会创建一个新文件。在打开不成功时,它返回NULL。文件指针指向:文件的最后一个字符。模式r+:此模式与模式r相同;但是,您可以对在此模式下打开的文件执行各种操作。您可以读取,写入和修改以r+模式打开的文件内容。文件指针指向:文件的第一个字符。模式w+:与可以执行的操作相同的模式w相同;可以在此模式下读取,写入和修改文件。模式a+:与模式a相同;您可以在文件中读取和附加数据,但在此模式下不允许进行内容修改。读取文件要读取文件,我们必须首先使用任何模式打开它,例如,如果您只想读取文件,然后以r模式打开它。根据文件打开期间选择的模式,我们可以对文件执行某些操作。fgetc():该函数从当前指针的位置读取字符,成功读取后,将指针移动到文件中的下一个字符。一旦指针到达文件的末尾,该函数返回 EOF(文件结束)。我们在程序中使用了 EOF 来确定文件的结尾。#include <stdio.h> int main() { FILE *fp1; char c; fp1 = fopen ("C:\\myfiles\\newfile.txt", "r"); while(1) { c = fgetc(fp1); if(c==EOF) break; else printf("%c", c); } fclose(fp1); return 0; }写入文件要写入文件,我们必须以支持写入的模式打开文件。例如,如果以r模式打开文件,则无法写入文件,因为r是只允许读取的只读模式。#include <stdio.h> int main() { char ch; FILE *fpw; fpw = fopen("C:\\newfile.txt","w"); if(fpw == NULL) { printf("Error"); exit(1); } printf("Enter any character: "); scanf("%c",&ch); fprintf(fpw,"%c",ch); fclose(fpw); return 0; }关闭文件fclose(fp);fclose()函数用于关闭打开的文件。作为参数,您必须提供指向要关闭的文件的指针。#include <stdio.h> int main() { char ch; FILE *fpr, *fpw; fpr = fopen("C:\\file1.txt", "r"); if (fpr == NULL) { puts("Input file cannot be opened"); } fpw= fopen("C:\\file2.txt", "w"); if (fpw == NULL) { puts("Output file cannot be opened"); } while(1) { ch = fgetc(fpr); if (ch==EOF) break; else fputc(ch, fpw); } fclose(fpr); fclose(fpw); return 0; }二进制文件的文件I/O如果文件是二进制文件(例如.exe文件)。上述程序不适用于二进制文件,但处理二进制文件时有一些细微的变化。主要区别在于文件名和模式。 让我们在一个例子的帮助下理解这一点。可以说我有两个二进制文件bin1.exe和bin2.exe– 我想将bin1.exe的内容复制到bin2.exe#include <stdio.h> int main() { char ch; FILE *fpbr, *fpbw; fpbr = fopen("bin1.exe", "rb"); if (fpbr == NULL) { puts("Input Binary file is having issues while opening"); } fpbw= fopen("bin2.exe", "wb"); if (fpbw == NULL) { puts("Output binary file is having issues while opening"); } while(1) { ch = fgetc(fpbr); if (ch==EOF) break; else fputc(ch, fpbw); } fclose(fpbr); fclose(fpbw); return 0; }指针的概念指针是存储另一个变量的地址的变量。与保存某种类型值的其他变量不同,指针保存变量的地址。例如,整数变量保存(或者可以说是存储)整数值,但整数指针保存整数变量的地址。在本指南中,我们将在示例的帮助下讨论C 编程中的指针。在这个程序中,我们有一个int类型的变量。num的值是 10,这个值必须存储在内存中的某个地方,对吧?为保存该变量值的变量分配一个内存空间,该内存空间有一个地址。例如,我们住在一所房子里,我们的房子有一个地址,帮助其他人找到我们的房子。同样,变量的值存储在内存地址中,这有助于 C 程序在需要时找到该值。因此,假设分配给变量num的地址是0x7fff5694dc58,这意味着我们应该将赋给num的任何值存储在以下位置:0x7fff5694dc58。#include <stdio.h> int main() { int num = 10; printf("Value of variable num is: %d", num); printf("\nAddress of variable num is: %p", &num); return 0; }输出: Value of variable num is: 10 Address of variable num is: 0x7fff5694dc58打印数组元素地址的简单示例#include <stdio.h> int main( ) { int val[7] = { 11, 22, 33, 44, 55, 66, 77 } ; for ( int i = 0 ; i < 7 ; i++ ) { printf("val[%d]: value is %d and address is %d\n", i, val[i], &val[i]); } return 0; }输出: val[0]: value is 11 and address is 1423453232 val[1]: value is 22 and address is 1423453236 val[2]: value is 33 and address is 1423453240 val[3]: value is 44 and address is 1423453244 val[4]: value is 55 and address is 1423453248 val[5]: value is 66 and address is 1423453252 val[6]: value is 77 and address is 1423453256C语言中的数组和指针示例#include <stdio.h> int main( ) { int *p; int val[7] = { 11, 22, 33, 44, 55, 66, 77 } ; p = &val[0]; for ( int i = 0 ; i<7 ; i++ ) { printf("val[%d]: value is %d and address is %p\n", i, *p, p); p++; } return 0; }输出: val[0]: value is 11 and address is 0x7fff51472c30 val[1]: value is 22 and address is 0x7fff51472c34 val[2]: value is 33 and address is 0x7fff51472c38 val[3]: value is 44 and address is 0x7fff51472c3c val[4]: value is 55 and address is 0x7fff51472c40 val[5]: value is 66 and address is 0x7fff51472c44 val[6]: value is 77 and address is 0x7fff51472c48数组的使用数组是相同数据类型的分组(或集合)。例如,int数组包含int类型的元素,而float数组包含float类型的元素。C 中声明数组int num[35]; /* An integer array of 35 elements */ char ch[10]; /* An array of characters for 10 elements */C语言中访问数组的元素您可以使用数组下标(或索引)来访问存储在数组中的任何元素。下标从 0 开始,这意味着arr[0]代表数组arr中的第一个元素。通常,arr[n-1]可用于访问数组的第n个元素。其中n是任何整数。int mydata[20]; mydata[0] /* first element of array mydata*/ mydata[19] /* last (20th) element of array mydata*/#include <stdio.h> int main() { int avg = 0; int sum =0; int x=0; int num[4]; for (x=0; x<4;x++) { printf("Enter number %d \n", (x+1)); scanf("%d", &num[x]); } for (x=0; x<4;x++) { sum = sum+num[x]; } avg = sum/4; printf("Average of entered number is: %d", avg); return 0; }输出: Enter number 1 10 Enter number 2 10 Enter number 3 20 Enter number 4 40 Average of entered number is: 20这里我们将数组从 0 迭代到 3,因为数组的大小是 4。在循环内部,我们向用户显示一条消息以输入值。使用scanf函数将所有输入值存储在相应的数组元素中。输入数据到数组for (x=0; x<4;x++) { printf("Enter number %d \n", (x+1)); scanf("%d", &num[x]); }数组中读出数据for (x=0; x<4;x++) { printf("num[%d]\n", num[x]); }初始化数组的不同方式int arr[5] = {1, 2, 3, 4 ,5}; int arr[] = {1, 2, 3, 4, 5};简单的二维数组#include<stdio.h> int main() { int disp[2][3]; int i, j; for(i=0; i<2; i++) { for(j=0;j<3;j++) { printf("Enter value for disp[%d][%d]:", i, j); scanf("%d", &disp[i][j]); } } printf("Two Dimensional array elements:\n"); for(i=0; i<2; i++) { for(j=0;j<3;j++) { printf("%d ", disp[i][j]); if(j==2){ printf("\n"); } } } return 0; }输出: Enter value for disp[0][0]:1 Enter value for disp[0][1]:2 Enter value for disp[0][2]:3 Enter value for disp[1][0]:4 Enter value for disp[1][1]:5 Enter value for disp[1][2]:6 Two Dimensional array elements: 1 2 3 4 5 6 二维数组的初始化int disp[2][4] = { {10, 11, 12, 13}, {14, 15, 16, 17} }; int disp[2][4] = { 10, 11, 12, 13, 14, 15, 16, 17};虽然上述两个声明都是有效的,但我建议您使用第一个方法,因为它更具可读性,因为您可以在此方法中可视化 2d 数组的行和列。指针和二维数组#include <stdio.h> int main() { int abc[5][4] ={ {0,1,2,3}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}, {16,17,18,19} }; for (int i=0; i<=4; i++) { printf("%d ",abc[i]); } return 0; }数组传递给函数#include <stdio.h> void disp( char ch) { printf("%c ", ch); } int main() { char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}; for (int x=0; x<10; x++) { disp (arr[x]); } return 0; }输出:a b c d e f g h i j按引用传递数组给函数#include <stdio.h> void disp( int *num) { printf("%d ", *num); } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; for (int i=0; i<10; i++) { disp (&arr[i]); } return 0; }输出:1 2 3 4 5 6 7 8 9 0将整个数组作为参数传递给函数#include <stdio.h> void myfuncn( int *var1, int var2) { for(int x=0; x<var2; x++) { printf("Value of var_arr[%d] is: %d \n", x, *var1); var1++; } } int main() { int var_arr[] = {11, 22, 33, 44, 55, 66, 77}; myfuncn(var_arr, 7); return 0; }输出: Value of var_arr[0] is: 11 Value of var_arr[1] is: 22 Value of var_arr[2] is: 33 Value of var_arr[3] is: 44 Value of var_arr[4] is: 55 Value of var_arr[5] is: 66 Value of var_arr[6] is: 77 函数的概念函数是执行特定任务的语句块。假设您正在使用 C语言构建应用,并且在某个程序中,您需要多次执行相同的任务。1.预定义的标准库函数 – 如puts(),gets(),printf(),scanf()等,这些函数已经在头文件中有定义(.h文件如stdio.h),所以我们只要在需要使用它们时调用它们。2.用户定义函数 – 我们在程序中创建的函数称为用户定义函数。为什么需要函数1.提高代码的可读性。2.提高代码的可重用性,可以在任何程序中使用相同的函数,而不是从头开始编写相同的代码。3.如果使用函数,代码的调试会更容易,因为错误很容易被跟踪。4.减少代码的大小,重复的语句集被函数调用替换。return_type function_name (argument list) { Set of statements – Block of code }#include <stdio.h> int addition(int num1, int num2) { int sum; sum = num1+num2; return sum; } int main() { int var1, var2; printf("Enter number 1: "); scanf("%d",&var1); printf("Enter number 2: "); scanf("%d",&var2); int res = addition(var1, var2); printf ("输出: %d", res); return 0; }常见的字符串处理函数strcat函数函数用于字符串连接,它在另一个指定字符串的末尾连接指定的字符串。char *strcat(char *str1, const char *str2)此函数将两个指针作为参数,并在连接后返回指向目标字符串的指针。str1 – 指向目标字符串的指针。str2 – 指向附加到目标字符串的源字符串的指针。#include <stdio.h> #include <string.h> int main () { char str1[50], str2[50]; strcpy(str1, "This is my initial string"); strcpy(str2, ", add this"); strcat(str1, str2); printf("String after concatenation: %s", str1); return 0; }输出:String after concatenation: This is my initial string, add thisstrncat函数类似的strncat()函数,它与 strcat()相同,只是 strncat()只将指定数量的字符附加到目标字符串。char *strncat(char *str1, const char *str2, size_t n)str1 – 目标字符串。str2 – 附加在目标字符串str1末尾的源字符串。n – 需要追加的源字符串str2的字符数。例如,如果这是 5,则只有源字符串str2的前 5 个字符将附加在目标字符串str1的末尾。返回值:该函数返回指向目标字符串str1的指针。#include <stdio.h> #include <string.h> int main () { char str1[50], str2[50]; strcpy(str1, "This is my initial string"); strcpy(str2, ", add this"); printf("String after concatenation: %s\n", strncat(str1, str2, 5)); printf("Destination String str1: %s", str1); return 0; }输出: String after concatenation: This is my initial string, add Destination String str1: This is my initial string, addstrchr函数给定字符串中搜索指定字符的出现,并返回指向它的指针。char *strchr(const char *str, int ch)str – 在其中搜索字符的字符串。ch – 在字符串str中搜索的字符。#include <stdio.h> #include <string.h> int main () { const char str[] = "This is just a String"; const char ch = 'u'; char *p; p = strchr(str, ch); printf("String starting from %c is: %s", ch, p); return 0; }输出: String starting from u is: ust a Stringstrcmp函数int strcmp(const char *str1, const char *str2)str1 – 第一个字符串 str2 – 第二个字符串 0:如果两个字符串相等 > 0:如果字符串str1的第一个不匹配字符的 ASCII 值大于字符串str2中的字符 < 0:如果字符串str1的第一个不匹配字符的 ASCII 值小于字符串str2中的字符#include <stdio.h> #include <string.h> int main () { char str1[20]; char str2[20]; int result; strcpy(str1, "hello"); strcpy(str2, "hEllo"); result = strcmp(str1, str2); if(result > 0) { printf("ASCII value of first unmatched character of str1 is greater than str2"); } else if(result < 0) { printf("ASCII value of first unmatched character of str1 is less than str2"); } else { printf("Both the strings str1 and str2 are equal"); } return 0; }输出:ASCII value of first unmatched character of str1 is greater than str2strncmp函数strncmp()函数,它与strcmp()相同,但strncmp()比较仅限于函数调用期间指定的字符数。例如,strncmp(str1, str2, 4)仅比较字符串str1和str2的前四个字符。int strncmp(const char *str1, const char *str2, size_t n)str1 – 第一个字符串 str2 – 第二个字符串 n – 需要比较的字符数。 0,如果字符串str1和str2都相等 > 0,如果str1的第一个不匹配字符的 ASCII 值大于str2 < 0,如果str1的第一个不匹配字符的 ASCII 值小于str2#include <stdio.h> #include <string.h> int main () { char str1[20]; char str2[20]; int result; strcpy(str1, "hello"); strcpy(str2, "helLO WORLD"); result = strncmp(str1, str2, 3); if(result > 0) { printf("ASCII value of first unmatched character of str1 is greater than str2"); } else if(result < 0) { printf("ASCII value of first unmatched character of str1 is less than str2"); } else { printf("Both the strings str1 and str2 are equal"); } return 0; }输出:Both the strings str1 and str2 are equalstrcoll函数strcmp()函数,它比较两个字符串并根据比较结果返回一个整数。int strcoll(const char *str1, const char *str2)str1 – 第一个字符串 str2 – 第二个字符串 > 0:如果字符串str1中第一个不匹配字符的 ASCII 值大于str2。 < 0:如果字符串str1中第一个不匹配字符的 ASCII 值小于str2。 = 0:如果两个字符串相等#include <stdio.h> #include <string.h> int main () { char str1[20]; char str2[20]; int result; strcpy(str1, "HELLO"); strcpy(str2, "hello world!"); result = strcoll(str1, str2); if(result > 0) { printf("ASCII value of first unmatched character of str1 is greater than str2"); } else if(result < 0) { printf("ASCII value of first unmatched character of str1 is less than str2"); } else { printf("Both the strings str1 and str2 are equal"); } return 0; }输出:ASCII value of first unmatched character of str1 is less than str2strcpy函数strcpy()函数将一个字符串复制到另一个字符串char *strcpy(char *str1, const char *str2)str1 – 这是复制其他字符串str2的值的目标字符串。函数的第一个参数。str2 – 这是源字符串,该字符串的值被复制到目标字符串。这是函数的第二个参数。#include <stdio.h> #include <string.h> int main () { char str1[20]; char str2[20]; strcpy(str1, "Apple"); printf("String str1: %s\n", str1); strcpy(str2, "Banana"); printf("String str2: %s\n", str2); strcpy(str1, str2); printf("String str1: %s\n", str1); return 0; }输出: String str1: Apple String str2: Banana String str1: Bananastrncpy函数类似于strcpy()函数,不同之处在于它只从源字符串复制指定数量的字符到目标字符串。char *strncpy(char *str1, const char *str2, size_t n)str1 – 目标字符串。复制源字符串str2的前n个字符到其中的字符串。str2 – 源字符串n – 需要复制的源字符串的字符数。#include <stdio.h> #include <string.h> int main () { char str1[20]; char str2[25]; strcpy(str2, "welcome to beginnersbook.com"); strncpy(str1, str2, 7); printf("String str1: %s\n", str1); printf("String str2: %s\n", str2); return 0; }输出: String str1: welcome String str2: welcome to beginnersbook.comstrrchr函数给定字符串中搜索指定字符的最后一次出现。此函数与函数strchr()完全相反,后者在字符串中搜索字符的第一次出现。char *strrchr(const char *str, int ch)#include <stdio.h> #include <string.h> int main () { const char str[] = "This-is-just-a-test-string"; const char ch = '-'; char *p, *p2; p = strrchr(str, ch); printf("String starting from last occurrence of %c is: %s\n", ch, p); p2 = strrchr(str, 'i'); printf("String starting from last occurrence of 'i' is: %s\n", p2); return 0; }输出: String starting from last occurrence of - is: -string String starting from last occurrence of 'i' is: ingstrspn函数给定字符串中搜索指定的字符串,并返回给定字符串中匹配的字符数。size_t strspn(const char *str1, const char *str2)#include <stdio.h> #include <string.h> int main () { int len; const char str1[] = "abcdefgh"; const char str2[] = "abXXcdeZZh"; len = strspn(str1, str2); printf("Number of matched characters: %d\n", len ); return 0; }输出:Number of matched characters: 5strstr函数指定主字符串中搜索给定字符串,并返回指向给定字符串第一次出现的指针。str – 要搜索的字符串。searchString – 我们需要在其中搜索字符串str的字符串char *strstr(const char *str, const char *searchString)#include <stdio.h> #include <string.h> int main () { const char str[20] = "Hello, how are you?"; const char searchString[10] = "you"; char *result; result = strstr(str, searchString); printf("The substring starting from the given string: %s", result); return 0; }输出:The substring starting from the given string: you?strcspn函数在主字符串中扫描给定字符串,并返回主字符串中从开头到第一个匹配字符的字符数。str1 – 要搜索的主字符串str2 – 在主字符串中搜索此字符串的字符,直到找到第一个匹配的字符#include <stdio.h> #include <string.h> int main () { const char str[20] = "aabbccddeeff"; const char searchString[10] = "dxz"; int loc; loc = strcspn(str, searchString); printf("The first matched char in string str1 is at: %d", (loc+1)); return 0; }输出:The first matched char in string str1 is at: 7strlen函数返回给定字符串的长度(字符数)。size_t strlen(const char *str)str – 这是我们需要计算长度的给定字符串#include <stdio.h> #include <string.h> int main () { char str[50]; int length; strcpy(str, "Welcome to Beginnersbook.com"); length = strlen(str); printf("Length of string - %s is: %d", str, length); return 0; }输出:Length of string - Welcome to Beginnersbook.com is: 28隐藏DOS窗口gcc main.c -s -mwindows // 添加 mwindows 参数即可隐藏自定义图标生成 icon 资源文件:dot2 ICON "00.ico"00.ico和C源文件,demo.rc文件均在同一路径下,行如下命令生成资源文件:windres demo.rc demo.o执行成功后,会生成demo.o文件gcc -s main.c demo.o -o main.exe
2021年04月08日
96 阅读
0 评论
23 点赞
2021-03-06
【技术分享】Kali Linux 隐藏自己的公网IP
简介一般用Kali干什么? 肯定是渗透了在这个安全行业中,喜欢搞对方网站的也有,不想快点被抓让对方难以溯源,最好的办法那就是伪装自己的ip,办法还是通过代理ip实现的。实验步骤vi /etc/proxychains4.conf 首先编辑下这个文件,进去后滑倒最下面。https 127.0.0.1 444 // 代理类型 + 代理ip + 端口 这里要根据自己代理ip设置哈找到这里,添加下代理ip现在网站都是用https的了,所以代理也要支持https才能正常访问。配置好之后保存一下就行了。
2021年03月06日
31 阅读
0 评论
3 点赞
2021-03-05
【技术分享】Kali linux 扫描局域网主机几种方式
查看本机ipifconfigarp-scan扫描arp-scan -l-f 从指定文件中读取主机名或地址 arp-scan -f ip.txt-l 从网络接口配置生成地址 arp-scan -l-i 各扫描之间的时间差 arp-scan -l -i 1000-r 每个主机扫描次数 arp-scan -l -r 5-V 显示程序版本并退出 arp-scan -l -V-t 设置主机超时时间 arp-scan -t 1000 192.168.75.0/24-L 使用网络接口 arp-scan -L eth0-g 不显示重复的数据 arp-scan -l -g-D 显示数据包往返时间 arp-scan -l -D可以看到局域网存在的几个主机的ip地址。nmap官方文档:https://nmap.org/docs.html-sL 列出要扫描的ip -sn 不进行端口扫描 -Pn 将所有主机都默认为在线,跳过主机发现 -PS/PA/PU/PY 使用TCP、SYN/ACK、UDP或SCTP协议去发现端口 -PE/PP/PM:使用ICMP响应(echo)、时间戳或子网掩码请求来发现探测 -PO 使用IP协议的ping -n 不做DNS解析 -R 总是做DNS反向解析 --dns-servers指定自定义的DNS服务器 --system-dns 使用操作系统的DNS --traceroute 追踪每台主机的跳转路径 -sS/sT/sA/sW/sM:使用SYN、TCP、全连接Connect()、ACK、Window、Maimon来进行扫描 -sU UDP扫描 -sN/sF/sX 使用TCP Null(无flag)、FIN、Xmas(FIN+Push+Urgent)扫描 --scanflags +flags 自定义TCP扫描的flags -sI 僵尸机扫描 -sY/sZ 使用SCTP协议的INIT/COOKIE-ECHO扫描 -sO 进行IP协议扫描 -b <FTP relay host>:指定FTP中继主机进行FTP反弹扫描 端口说明和扫描规则 -p 只扫描指定的端口 --exclude-ports 不对此端口进行扫描 -F 快速模式,扫描比默认端口数量更少的端口 -r 有序地扫描端口而不是随机地扫描 --top-ports <number> 扫描排名指定的数字前几位的最常用的端口 --port-ratio <ratio> 扫描比输入的比例更常用的端口 -sV:探测开启的端口来获取服务、版本信息 --version-intensity <level>:设置探测服务、版本信息的强度 --version-light:强度为2的探测强度 --version-all:强度为9的探测强度 --version-trace:将扫描的具体过程显示出来 -sS/sT/sA/sW/sM:使用SYN、TCP、全连接Connect()、ACK、Window、Maimon来进行扫描 -sU UDP扫描 -sN/sF/sX 使用TCP Null(无flag)、FIN、Xmas(FIN+Push+Urgent)扫描 --scanflags +flags 自定义TCP扫描的flags -sI 僵尸机扫描 -sY/sZ 使用SCTP协议的INIT/COOKIE-ECHO扫描 -sO 进行IP协议扫描 -b <FTP relay host>:指定FTP中继主机进行FTP反弹扫描 端口说明和扫描规则 -p 只扫描指定的端口 --exclude-ports 不对此端口进行扫描 -F 快速模式,扫描比默认端口数量更少的端口 -r 有序地扫描端口而不是随机地扫描 --top-ports <number> 扫描排名指定的数字前几位的最常用的端口 --port-ratio <ratio> 扫描比输入的比例更常用的端口nmap扫描主机范围nmap 192.168.18.1/24nmap扫描目标端口sS : 使用 TCP SYN 扫描-sV : 进行版本探测-T4 : 使用的是一种快速扫描方式,扫描速度的级别范围(T0-T5),级别越高,扫描速度越快-p- : 0-65535 端口nmap -sS -sV -T4 -p- 192.168.17.1nmap ARP扫描端口nmap -PR 192.168.18.1arping扫描arping -c 1 192.168.18.1
2021年03月05日
692 阅读
0 评论
131 点赞
2021-03-05
【CTF解题】墨者学院 SQL注入实战
sqlmap注入首先寻找注入点,题目给我们提示了X-Forwarded-for,说明题需要使用到。我使用了Fiddler抓包或burpsuite,尝试随便输入一个账号密码,登录发现出来一个弹窗,在浏览器显示乱码了,但在抓包软件里能看到,很显然需要是内网本机才能登录。这里给提交登录的POST请求头加上了 x-forwarded-for: 127.0.0.1经过几轮测试,发现账号密码没有注入点而x-forwarded-for 存在sql注入点。把提交的数据都写在一个txt文本文档里,导入sqlmap进行自动注入。sqlmap -r a.txt -dbs -batch首先列出可用的数据库列表。sqlmap -r a.txt -D webcalendar -tables -batch再看数据库有哪些表。sqlmap -r a.txt -D webcalendar -T user -columns -batch再查看表的字段。sqlmap -r a.txt -D webcalendar -T user -C username,password -dump -batch最后输出字段内容。这道题考验我们的并不是x-Forwared-for的设置,而是存在sql注入点的利用。
2021年03月05日
27 阅读
0 评论
2 点赞
2021-03-04
【技术分享】Kali Linux 创建删除用户
// 添加账户并创建主目录 useradd -m username // 为用户设置密码 passwd username // 给用户添加sudo权限 usermod -a -G sudo username // 验证sudo权限是否添加成功 cat /etc/group | grep sudo // 给用户绑定bash作为默认Shell usermod -s /bin/bash username // 在其他用户下切换到root用户 su - // 删除账户 userdel -r username // 删除用户使用的进程(这个操作不要轻易对root或系统进程执行!) kill -9 username_pid
2021年03月04日
36 阅读
0 评论
3 点赞
2021-03-03
【技术分享】Kali Linux 配置IP地址
简介一般配置ip地址都是用图形化界面,这里是通过终端命令行的方式进行配置,比较快一点挺方便的。实验步骤vi /etc/network/interfaces首先输入命令: vim /etc/network/interfaces 编辑配置文件按键盘上i键,进行编辑看情况来,你想动态获取就配置dhcp,这里我配置的是静态的。编辑好了,先按esc键再按shift + :输入wq保存。静态分配auto eth0 iface eth0 inet static //配置静态网卡 address 192.168.42.188 //配置静态IP地址 netmask 255.255.255.0 //配置子网掩码 gateway 192.168.42.2 //配置网关动态分配auto eth0 iface eth0 dhcp // 配置dhcp自动分配ifconfig // 查看ip地址 ip add // 查看ip地址 两个都是可以的保存好之后,先用ifconfig查看下现在的ip,可以发现还没生效。service networking restart // 重启服务 systemctl restart networking // 重启服务 两个都是可以的只要重启下网卡就可以了,这里用 service networking restart 进行重启。基本命令service networking restart 重启 service networking start 启动 service networking status 查看网络状态 service networking stop 停止 systemctl restart networking重启配置dnsvi /etc/resolv.conf配置下保存就可以了。
2021年03月03日
27 阅读
0 评论
4 点赞
2021-03-02
【技术分享】Kali Linux 目录结构详解
文件系统的类LINUX有四种基本文件系统类型:普通文件、目录文件、连接文件和特殊文件,可用file命令来识别。普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可用cat、less、more、vi、emacs来察看内容,用mv来改名。目录文件:包括文件名、子目录名及其指针。它是LINUX储存文件名的唯一地方,可用ls列出目录文件。连接文件:是指向同一索引节点的那些目录条目。用ls来查看是,连接文件的标志用l开头,而文件面后以"->"指向所连接的文件。特殊文件:LINUX的一些设备如磁盘、终端、打印机等都在文件系统中表示出来,则一类文件就是特殊文件,常放在/dev目录内。例如,软驱 A称为/dev/fd0。LINUX无C:的概念,而是用/dev/had来自第一硬盘。对于linux新手来说,最感到迷惑的问题之一就是文件都存在哪里呢?特别是对于那些从windows转过来的新手来说,linux的目录结构看起来有些奇怪哦。所以,在这里讲一下linux下的主要目录以及它们都是用来干什么的。 /这就是根目录。对你的电脑来说,有且只有一个根目录。所有的东西,我是说所有的东西都是从这里开始。举个例子:当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。 /root这是系统管理员(root user)的目录。对于系统来说,系统管理员就好比是上帝,它能对系统做任何事情,甚至包括删除你的文件。因此,请小心使用root帐号。 /bin这里存放了标准的(或者说是缺省的)linux的工具,比如像“ls”、“vi”还有“more”等等。通常来说,这个目录已经包含在你的“path”系 统变量里面了。什么意思呢?就是:当你在终端里输入ls,系统就会去/bin目录下面查找是不是有ls这个程序。 /etc这里主要存放了系统配置方面的文件。举个例子:你安装了samba这个套件,当你想要修改samba配置文件的时候,你会发现它们(配置文件)就在/etc/samba目录下。 /dev这里主要存放与设备(包括外设)有关的文件(unix和linux系统均把设备当成文件)。想连线打印机吗?系统就是从这个目录开始工作的。另外还有一些包括磁盘驱动、USB驱动等都放在这个目录。 /home这里主要存放你的个人数据。具体每个用户的设置文件,用户的桌面文件夹,还有用户的数据都放在这里。每个用户都有自己的用户目录,位置为:/home/用户名。当然,root用户除外。 /tmp这是临时目录。对于某些程序来说,有些文件被用了一次两次之后,就不会再被用到,像这样的文件就放在这里。有些linux系统会定期自动对这个目录进行清理,因此,千万不要把重要的数据放在这里。 /usr在这个目录下,你可以找到那些不适合放在/bin或/etc目录下的额外的工具。比如像游戏阿,一些打印工具拉等等。/usr目录包含了许多子目录: /usr/bin目录用于存放程序;/usr/share用于存放一些共享的数据,比如音乐文件或者图标等等;/usr/lib目录用于存放那些不能直接 运行的,但却是许多程序运行所必需的一些函数库文件。你的软件包管理器(应该是“新立得”吧)会自动帮你管理好/usr目录的。 /opt这里主要存放那些可选的程序。你想尝试最新的firefox测试版吗?那就装到/opt目录下吧,这样,当你尝试完,想删掉firefox的时候,你就可 以直接删除它,而不影响系统其他任何设置。安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面。举个例子:刚才装的测试版firefox,就可以装到/opt/firefox_beta目录下,/opt/firefox_beta目录下面就包含了运 行firefox所需要的所有文件、库、数据等等。要删除firefox的时候,你只需删除/opt/firefox_beta目录即可,非常简单。 /usr/local 这里主要存放那些手动安装的软件,即不是通过“新立得”或apt-get安装的软件。它和/usr目录具有相类似的目录结构。让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面,我想这应该是个不错的主意。 /media有些linux的发行版使用这个目录来挂载那些usb接口的移动硬盘(包括U盘)、CD/DVD驱动器等等。补充/bin 系统所需要的那些命令位于此目录,比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的、普通用户都可以使用的命令。作为基础系统所需要的最基础的命令就是放在这里(/usr/bin和/usr/sbin 类似与“/”根目录下对应的目录(/bin和/sbin),但不用于基本的启动(譬如,在紧急维护中)。大多数命令在这个目录下。 )。/boot Linux的内核及引导系统程序所需要的文件目录,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录。/lost+found 在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损 坏的文件系统。 有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。/mnt 这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom 等目录。可以参看/etc/fstab的定义。有时我们可以把让系统开机自动挂载文件系统,把挂载点放在这里也是可以的。主要看/etc/fstab中怎 么定义了;比如光驱可以挂载到/mnt/cdrom 。/opt 表示的是可选择的意思,有些软件包也会被安装在这里,也就是自定义软件包,比如在Fedora Core 5.0中,OpenOffice就是安装在这里。有些我们自己编译的软件包,就可以安装在这个目录中;通过源码包安装的软件,可以通过 ./configure --prefix=/opt/目录 。/proc 操作系统运行时,进程信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统,它的定义可以参见 /etc/fstab 。/sbin 大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin目录是相似的;我们记住就行了,凡是目录sbin中包含的都是root权限才能执行的。/usr 这个是系统存放程序的目录,比如命令、帮助文件等。这个目录下有很多的文件和目录。当我们安装一个Linux发行版官方提供的软件包时,大多安装在这里。 如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。/usr目录下包括涉及字体目录/usr/share/fonts ,帮助目录 /usr/share/man或/usr/share/doc,普通用户可执行文件目录/usr/bin 或/usr/local/bin 或/usr/X11R6/bin ,超级权限用户root的可执行命令存放目录,比如 /usr/sbin 或/usr/X11R6/sbin 或/usr/local/sbin 等;还有程序的头文件存放目录/usr/include。/var 这个目录的内容是经常变动的,看名字就知道,我们可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。/var/www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地; -来源网络
2021年03月02日
31 阅读
0 评论
3 点赞
2021-03-01
【技术分享】Kali linux 安装教程 ( 直装版 )
安装教程最简单的一种方式,直接使用导出的镜像,不需要安装这里官方给我们提供了,首先到官方网站下载kali的镜像官方网址:https://www.kali.org/get-kali/#kali-platforms找到这个点击下载即可。这里建议使用迅雷,下载很快的,迅雷官网:https://www.xunlei.com/虚拟机下载好是一个压缩包,然后把下载好的镜像解压到一个文件里,通过vm直接打开它。点击打开虚拟机,找到刚才解压镜像的文件夹路径,直接双击里面的文件。这个时候就完成了,开机就可以正常使用了。
2021年03月01日
579 阅读
0 评论
47 点赞
2021-01-07
【技术分享】Kali Linux ARP中间人嗅探
简介ARP 中间人欺骗(ARP spoofing)是一种网络攻击方法,攻击者可以通过欺骗目标计算机,让他将通信数据发送到攻击者控制的假冒设备上,从而实现对通信内容的截获和篡改。首先可以对受害者进行内网扫描,确定ip地址时,再配合arp协议进行欺骗。# 开启转发 echo 1 > /proc/sys/net/ipv4/ip_forward 必须开启转发,这样流量才能从攻击者机器上出去,不然被攻击的机器是无法上网的。# 参数:网卡、网关、受害者IP arpspoof -i eth0 -t 192.168.20.2 192.168.20.133开启欺骗时流量会从攻击者的主机上经过,这个时候可以通过抓包来进行嗅探。中间人监听 - 账号密码{dplayer src="https://www.52tt.pro/usr/uploads/2022/01/ettercap.mp4"/}echo 1 > /proc/sys/net/ipv4/ip_forward ettercap -Tq -i eth0 -M arp:remote /// /192.168.10.1// # 欺骗路由器后台
2021年01月07日
35 阅读
0 评论
5 点赞
2021-01-05
【CTF解题】CTF入门介绍 ( 基本了解 )
CTF赛制概述CTF(Capture The Flag)是网络安全领域的技术竞技比赛,起源于1996年DEFCON大会,现已成为全球范围内广泛举行的比赛形式。赛题类型涵盖不同的网络安全技术领域,以下是常见的赛制模式及赛题分类:1. Jeopardy-解题模式概述:参赛队伍通过解题获得分数,题目多为网络安全技术挑战。类似ACM编程竞赛,通过解题积累分数,并可能根据时间和得分排名。常见规则:包括“First Blood”(首解)奖励、题目分值动态调整(即解答人数越多,分值越低)。2. AWD-攻防模式概述:参赛队伍不仅要防守自己的系统(GameBox),还需要攻击对方的系统。通过防御和攻击操作获取分数。特点:比赛持续24-48小时,涉及实时攻防对抗,要求参赛队员具有较强的技术与协作能力。3. AWP-攻防增强模式概述:结合攻击与防御,选手攻击一次、修复一次即可完成题目。与AWD相比,选手无需持续维护环境,减少了硬件与运维负担。特点:简化了攻击和防御操作,更注重选手的效率。4. RHG-自动化攻防概述:通过编写自动化程序(bot)进行漏洞挖掘与攻击。选手提交的bot会全自动进行任务,无需人工干预。特点:强调自动化与工程化能力,比赛过程全程自动化运行。5. RW-真实世界模式概述:模拟真实的渗透测试环境,选手需要在真实环境中挖掘漏洞并攻击。比赛时,选手需要展示攻击成果,现场验证攻击效果。特点:与实际工作中渗透测试更为贴近,强调实战能力。6. KoH-抢占山头模式概述:选手通过挖掘漏洞控制目标系统,并进行加固防御,防止其他队伍入侵。定期检查系统标识文件,根据文件标识判定得分。特点:结合渗透攻击与防御加固,强调持续控制与防护能力。7. Mix-混合模式概述:结合多种模式进行比赛,例如解题和攻防模式并行,提升比赛的多样性与挑战性。特点:为参赛队伍提供更多的题型和模式,适应不同的技术需求。CTF赛题分类Web 渗透测试特点:利用 Web 应用漏洞获取敏感信息或控制权限。常见漏洞有 SQL 注入、XSS、命令注入等。工具:Burp Suite、SQLmap 等。Crypto 密码学特点:破解加密算法或编码技术。涉及经典密码、加密算法漏洞分析等。工具:CyberChef、Hashcat 等。Pwn 二进制漏洞利用特点:通过利用二进制漏洞进行攻击,常见如缓冲区溢出、格式化字符串漏洞等。工具:GDB、Pwntools、IDA Pro 等。Reverse 逆向工程特点:通过静态与动态分析程序代码,理解其功能并发现漏洞。工具:IDA Pro、OllyDbg、Ghidra 等。Misc 杂项特点:包括取证、隐写等不容易归类到其他类型的题目。工具:ExifTool、Steghide 等。CTF二次元版
2021年01月05日
36 阅读
0 评论
7 点赞
2017-05-26
【技术分享】操作系统常用命令
Linux 通用命令1. 目录与文件管理命令功能说明实用示例ls显示目录内容ls -la(显示所有文件,含隐藏文件+详细信息)、ls -lh(人性化显示文件大小)cd切换目录cd /usr/local(进入指定目录)、cd ..(返回上级)、cd ~(回到家目录)、cd -(返回上一次所在目录)pwd查看当前工作路径直接执行,无参数mkdir创建文件夹mkdir -p /data/test(递归创建多级目录)、mkdir -m 755 testdir(创建指定权限的目录)touch创建空文件/更新文件时间戳touch test.txt、touch -d "2026-03-24" test.txt(修改文件时间戳)cp复制文件/目录cp -r /src /dest(-r递归复制目录)、cp -p file1 file2(保留文件属性)mv移动/重命名文件mv old.txt new.txt(重命名)、mv file /tmp(移动)、mv -i file /tmp(覆盖前提示)rm删除文件/目录rm -rf /tmp/test(-r删目录,-f强制删除)、rm -i file.txt(删除前提示)cat查看文件内容cat -n test.txt(显示行号)、cat file1 file2 > file3(合并文件)more/less分页浏览文件less test.log(支持上下翻页、搜索,按q退出)、more +10 test.txt(从第10行开始显示)head/tail查看文件开头/尾部head -10 test.log(前10行)、tail -f test.log(实时监控尾部)、tail -n +5 test.txt(从第5行到末尾)chmod修改文件权限chmod 755 script.sh(赋予执行权限)、chmod -R 777 /data(递归改目录权限)、chmod u+x script.sh(仅给属主加执行权限)chown修改文件属主/属组chown user:group test.txt、chown -R root:root /datastat查看文件详细属性stat test.txt(显示大小、权限、修改时间等)which查找命令/文件路径which python3(查找python3安装路径)locate快速查找文件(基于数据库)locate passwd(查找passwd相关文件)、updatedb(更新locate数据库)find实时查找文件find / -name "*.log"(按名称查找)、find /var/log -size +100M(查找大于100M的文件)2. 用户与权限管理命令功能说明示例useradd创建用户useradd -m testuser(-m自动创建家目录)、useradd -s /bin/bash -d /home/test testuser(指定shell和家目录)userdel删除用户userdel -r testuser(-r删除家目录)passwd修改用户密码passwd testuser(修改testuser密码)、passwd -l testuser(锁定用户)who查看在线登录用户直接执行whoami查看当前登录用户直接执行su/sudo切换用户/提权su root(切换到root)、sudo ls /root(临时提权执行命令)hostname查看/修改主机名hostname(查看)、hostname new-host(临时修改)、hostnamectl set-hostname new-host(永久修改)id查看用户UID/GIDid testuser(查看用户身份信息)3. 进程管理命令功能说明示例ps查看进程状态ps -ef(全量进程)、ps -eftop动态监控资源占用最高的进程直接执行,按q退出、top -p 1234(仅监控指定PID进程)htop增强版tophtop(更友好的进程监控界面,需安装)kill终止进程kill -9 1234(-9强制杀死PID为1234的进程)、killall nginx(按进程名杀死所有实例)history查看/清除历史命令history(查看)、history -c(清除)、!100(执行历史记录中第100条命令)nohup后台运行进程nohup ./script.sh > output.log 2>&1 &(后台运行脚本并记录日志)4. 网络管理命令功能说明示例ifconfig查看/配置网卡信息(旧版)ifconfig eth0(查看eth0网卡)、ifconfig eth0 192.168.1.100 netmask 255.255.255.0(设置IP)ip addr查看/配置网卡信息(新版)ip addr show(查看所有网卡)、ip addr add 192.168.1.100/24 dev eth0(设置IP)ping测试网络连通性ping -c 4 192.168.1.1(发送4个数据包)、ping -i 0.5 -c 10 8.8.8.8(每隔0.5秒ping一次,共10次)netstat查看网络连接/端口netstat -tulnp(查看监听端口+对应进程)、netstat -ano(Linux兼容格式)ss替代netstat的新命令ss -tulnp(更快的端口查看命令)grep文本过滤/搜索grep "error" test.log(查找日志中的错误)、grep -i "Error" test.log(忽略大小写)、grep -r "test" /etc(递归搜索目录)curl/wget网络下载/测试curl www.baidu.com(测试网页访问)、wget https://xxx.com/file.tar.gz(下载文件)nmap端口扫描(Kali/CentOS需安装)nmap 192.168.1.1(扫描指定IP开放端口)5. 系统管理命令功能说明示例uname查看系统信息uname -a(显示内核版本、主机名、系统架构等)、uname -r(仅显示内核版本)systemctl管理系统服务(CentOS7+/Kali/Ubuntu)systemctl start mysqld(启动服务)、systemctl status nginx(查看状态)、systemctl enable sshd(设置开机自启)、systemctl disable firewalld(关闭开机自启)service兼容旧版服务管理service sshd restart(重启ssh服务)shutdown关机/重启shutdown -r now(立即重启)、shutdown -h 20:00(20点关机)、shutdown -c(取消关机计划)df/du磁盘空间查看df -h(人性化显示磁盘使用)、du -sh /data(查看目录总大小)free内存查看free -h(人性化显示内存使用)uptime系统运行时间uptime(查看系统运行时长、负载)6. Kali Linux 专属命令命令功能说明示例wine运行Windows EXE程序wine xxx.exewinecfg配置WINE运行环境直接执行,图形化配置apt-get/apt包管理apt update(更新源)、apt install wine(安装软件)msfconsoleMetasploit控制台(Kali核心)msfconsole(启动渗透测试框架)nmap端口扫描(Kali预装)nmap -sS 192.168.1.0/24(SYN扫描网段)7. CentOS 专属命令命令功能说明示例date查看/修改系统时间date(查看)、date -s "2026-03-24 10:00"(修改)、hwclock -w(同步到硬件时钟)w查看登录用户及当前操作直接执行(比who更详细)awk文本处理工具awk -F: '{print $1}' /etc/passwd(提取所有用户名)systemctl list-unit-files查看所有服务开机自启状态systemctl list-unit-filesyum/dnfCentOS包管理yum install nginx(安装软件)、yum remove nginx(卸载)、yum update(更新系统)firewall-cmd防火墙管理firewall-cmd --list-ports(查看开放端口)、firewall-cmd --permanent --add-port=80/tcp(永久开放80端口)Windows DOS/CMD 命令1. 目录与文件管理命令功能说明示例cd切换目录cd D:\tools、cd ..(返回上级)、cd /d E:\test(跨盘符切换)dir列出目录内容dir /a(显示所有文件,含隐藏/系统文件)、dir /s(递归显示子目录)、dir /b(仅显示文件名)、dir /p(分页显示)tree生成目录树tree D:\data(显示指定目录结构)、tree /f D:\data(显示文件和目录)mkdir创建文件夹mkdir test(等价于md test)、md test1\test2\test3(递归创建多级目录)rd删除目录rd /s /q test(/s删目录及内容,/q静默删除)del删除文件del .tmp(删除所有临时文件)、del /f /s /q D:\tmp*.(强制删除目录下所有文件)copy/move复制/移动文件copy src.txt D:\dest、move old.txt newdir、xcopy D:\src D:\dest /s/e(递归复制目录)type查看文件内容type test.txt、type test.txtecho输出内容/创建文件echo 测试内容 > new.txt(创建并写入)、echo off(关闭命令回显)、echo 追加内容 >> new.txt(追加内容)ren重命名文件/目录ren old.txt new.txt、ren D:\olddir newdir2. 系统管理命令功能说明示例hostname查看主机名直接执行systeminfo查看系统详细信息systeminfotasklist查看进程列表tasklisttaskkill终止进程taskkill /f /pid 1234(/f强制杀死PID=1234的进程)、taskkill /f /im chrome.exe(按进程名杀死)taskmgr打开任务管理器直接执行net user管理本地用户net user(查看所有用户)、net user test 123456 /add(创建用户)、net user test /del(删除用户)net localgroup管理用户组net localgroup Administrators test /add(将test加入管理员组)shutdown关机/重启/注销shutdown -s -t 60(60秒关机)、shutdown -r now(立即重启)、shutdown -a(取消关机)、logoff(注销当前用户)sfc /scannow扫描并修复系统文件管理员权限执行,修复损坏的系统文件chkdsk磁盘检测修复chkdsk C: /f(修复C盘错误,需重启)format格式化磁盘format D: /fs:NTFS /q(快速格式化D盘为NTFS)、format D: /fs:FAT32(格式化为FAT32)convert转换磁盘格式(无损)convert D: /fs:NTFS(将FAT32转为NTFS)3. 网络管理命令功能说明示例ipconfig查看网卡/IP信息ipconfig /all(显示详细信息)、ipconfig /release(释放IP)、ipconfig /renew(重新获取IP)、ipconfig /flushdns(清空DNS缓存)ping测试网络连通性ping -n 4 192.168.1.1(发送4个数据包)、ping -t www.baidu.com(持续ping)、ping -l 1024 www.baidu.com(指定数据包大小)netstat查看网络连接netstat -ano(显示连接+PID+端口)、netstat -b(显示连接对应的程序)、netstat -rn(查看路由表)arp -a查看ARP缓存表直接执行,显示IP-MAC映射、arp -d 192.168.1.1(删除指定ARP记录)nslookup解析域名/查询DNSnslookup www.baidu.com(查询域名IP)、nslookup www.baidu.com 8.8.8.8(指定DNS服务器解析)tracert路由追踪tracert www.baidu.com(查看数据包路由路径)、tracert -d www.baidu.com(不解析IP为域名,加快速度)route print查看路由表直接执行、route add 0.0.0.0 mask 0.0.0.0 192.168.1.1(添加默认网关)net view查看局域网共享主机net view \192.168.1.100(查看指定主机共享)、net view(查看局域网所有主机)net use映射网络驱动器net use Z: \192.168.1.100\share(映射共享文件夹到Z盘)netsh配置网络(网卡/Wi-Fi)netsh wlan show profiles(查看保存的Wi-Fi)、netsh wlan show profile name="WiFi名称" key=clear(查看Wi-Fi密码)、netsh interface ip set address "以太网" static 192.168.1.100 255.255.255.0 192.168.1.1(设置静态IP)4. 高级管理命令命令功能说明示例regedit打开注册表编辑器直接执行gpedit.msc打开组策略编辑器(专业版/企业版)直接执行wmic系统信息查询(强大)wmic process where processid=41176 get commandline,name,path(查看指定PID进程的命令行/路径)、wmic diskdrive get size,model(查看磁盘信息)Get-CimInstance(PowerShell)进程/系统信息查询Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=41176" / Select-Object CommandLine, Name, Pathpowershell启动PowerShellpowershell(切换到PowerShell环境)cmdkey查看/管理凭据cmdkey /list(查看保存的网络凭据)5. Windows 常用快捷键快捷键功能说明示例Win + E打开文件资源管理器直接按下快捷键即可触发Win + D快速显示桌面直接按下快捷键即可触发Win + L锁定计算机直接按下快捷键即可触发Alt + F4关闭当前窗口/调出关机菜单直接按下快捷键即可触发Ctrl + Shift + Esc直接打开任务管理器直接按下快捷键即可触发Alt + Tab切换已打开的窗口直接按下快捷键即可触发Win + Tab打开任务视图(多桌面)直接按下快捷键即可触发Ctrl + F在文本/网页中搜索内容直接按下快捷键即可触发Ctrl + A全选当前内容直接按下快捷键即可触发Ctrl + C/V/X复制/粘贴/剪切直接按下快捷键即可触发Win + +打开放大镜工具直接按下快捷键即可触发Win + R打开运行对话框直接按下快捷键即可触发Ctrl + Z/Y撤销/重做直接按下快捷键即可触发Win + S打开搜索框直接按下快捷键即可触发Ctrl + Shift + N在文件管理器中新建文件夹直接按下快捷键即可触发远程桌面(RDP)管理命令命令功能说明示例开启远程桌面启用RDP服务(管理员权限)REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f关闭远程桌面禁用RDP服务(管理员权限)REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 1 /f开放RDP端口(3389)防火墙放行(管理员权限)netsh advfirewall firewall add rule name="RemoteDesktop" dir=in action=allow protocol=TCP localport=3389查看RDP端口检查远程桌面端口reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber网络连接状态说明状态含义常见场景LISTENING监听状态:端口已开放,等待外部连接服务端程序启动后监听端口(如nginx监听80端口)ESTABLISHED已建立连接:双方正在传输数据正常的TCP连接(如浏览器访问网页、SSH连接)CLOSE_WAIT等待关闭:被动关闭连接,本地等待应用程序关闭对方已关闭连接,但本地程序未及时释放TIME_WAIT超时等待:主动关闭连接后,等待确认对方关闭主动断开连接后,系统保留端口一段时间(通常2MSL)FIN_WAIT_1关闭过程中:本地发起关闭请求,等待对方响应TCP四次挥手第一步,本地发FIN包等待ACKFIN_WAIT_2关闭过程中:收到对方ACK,等待对方FIN包TCP四次挥手第二步LAST_ACK最后确认:被动关闭后,等待对方确认关闭被动关闭方发FIN包后,等待对方ACKSYN_SENT发起连接:本地发送SYN包,等待对方确认客户端发起TCP连接请求SYN_RECEIVED接收连接:收到对方SYN包,等待本地确认服务端收到SYN包,准备建立连接CLOSED关闭状态:连接已完全关闭无活跃连接
2017年05月26日
77 阅读
0 评论
5 点赞
1
...
12
13
14
0:00