给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
四、无名管道
五、有名管道
六、信号
七、使用有名管道,实现聊天(代码实现)
笔记:
特殊的进程:
1.孤儿进程
父进程先于子进程退出,子进程被init进程收养,子进程被称为孤儿进程
2.僵尸进程
在僵尸态的进程,子进程退出后,父进程没有回收子进程的资源
一、进程资源的回收问题
如何避免僵尸进程的产生,即子进程退出后,父进程回收子进程的资源。
回收的手段:
wait()和waitpid()的功能:等待进程状态的改变
1.wait()
#include <sys/types.h>
#include <wait.h>
/\*
\*函数名:wait
\*函数功能:阻塞的等待一个子进程退出状态,如果父进程有多个子进程,则返回随机接收的一个
\*函数参数: int \*status:存储的是返回状态,exit(status)中status \* 2^8
\*函数返回值:成功返回接收到的子进程的进程号
\*/
pid_t wait(int \*status);
2.waitpid()
#include <sys/types.h>
#include <wait.h>
/\*
\*函数名:waitpid
\*函数功能:接收指定进程的退出状态
\*函数参数: int \*status:存储的是返回状态,exit(status)中status \* 2^8
\*函数返回值:成功返回接收到的子进程的进程号
\*/
pid_t wait(pid_t pid, int \*status, int options);
3.wait和waitpid的区别:
1.wait是阻塞的,waitpid可以设置阻塞还是非阻塞
2.在多个子进程的情况下,wait接到的退出状态是随机的,而waitpid可以指定接哪个子进程的退出状态
3.两个函数都有回收资源的功能
4.wait是在waitpid基础上封装的
5.为了避免遗露,建议使用waitpid
二、守护进程
1.让进程从电脑开机一直到电脑关机一直运行
2.不能让进程被普通用户轻易杀死,不要让进程受到中断控制
实现上述两个功能的进程,称之为守护进程。
1.如何创建守护进程
核心问题:如何摆脱终端控制
终端和进程之间的关系
2.特殊概念
(1)终端:
用户和操作系统交互的接口,称为终端,传统的终端是一个硬件设备。
在Linux系统中,给用户提供了连接七个终端设备的接口,我们称之为终端。
终端的分类:
真终端:操作系统提供的终端
Linux中,终端有:tty1-tty7
字符界面终端:tty1-tty6
图形化界面终端:tty7
终端的切换:
ctrl + alt + F1 + (Fn)
F2/3/4/5/6
ctrl + alt + F7
伪终端:使用软件模拟的终端
Terminal: ctrl + alt + t
超级终端/putty
pts/开头
(2)进程组:
PGID(进程组ID)
只要PGID一致,则就在一个进程组内
标题会话组:
SID(会话组ID)
只要SID一致,则就在一个会话期内
3.如何创建守护进程
<1>fork()创建子进程,exit()父进程退出
<2>setsid()创建新会话,把自己设置为新会话的组长
<3>更改工作路径
<4>重设文件权限掩码
<5>关闭不需要的文件描述符
setsid:
#include <unistd.h>
/\*创建新会话,把自己的pid设置为会话组id\*/
pid_t setsid(void);
chdir
#include <unistd.h>
/\*
\*函数名:chdir
\*函数功能:更改进程的工作路径
\*函数参数:const char \*path:相要更改的路径
\*函数返回值:int:成功返回0,失败返回-1
\*/
int chdir(const char \*path);
umask
#include <sys/types.h>
#include <sys/stat.h>
/\*
\*函数名:umask
\*函数功能:设置文件的权限掩码
\*函数参数:mode\_t mask:八进制类型的掩码,默认0002
\*函数返回值:mode\_t:不会失败,返回值位文件权限掩码
\*/
mode_t umask(mode_t mask);
getdtablesize
#include <unistd.h>
//得到进程的文件描述符表的大小
int getdtablesize(void);
三、进程间通信
进程间通信机制:
Unix传统进程间通信方式
无名管道
有名管道
信号
Unix System V进程间通信方式
System V 共享内存
System V 信号量
System V 消息队列
POSIX IPC 进程间通信方式
IPC 共享内存
IPC 信号量
IPC 消息队列
BSD 进程间通信机制
socket通信
四、无名管道
1.无名通道的特点
无名管道是Linux中管道通信的一种原始方法,它具有如下特点:
(1)只能在具有亲缘关系的进程间使用(父子进程/兄弟进程间的通信)
(2)是一个半双工的通信模式,具有固定的读端和固定的写端
(3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()/write()等函数,但是它不属于任何文件系统,并且只存在于内存中。
2.对于通信方式的划分
单工通信:
只能单向通信的方式
半双工通信:
同一时刻只能单向通信,但是可以通过时分复用信道的方法实现双向通信。
全双工通信:
同一时刻可以实现双向通信
3.管道读写注意点:
(1)只有在管道的读端存在时,向管道写入数据才有意义,否则,向管道写入数据的进程将收到内核传来的SIGPIPE信号(通常时Broken Pipe错误),即管道破裂。
(2)向管道写入数据时,Linux将不保证写入的原子性,管道缓冲区只要有空间,写进程就会适度向管道写入数据。如果管道缓冲区已经满了,那么写操作将会一直阻塞。
(3)父子进程在运行时,他们的先后次序并不能保证。为了确保父子进程已经关闭了相应的文件描述符,可在两个进程中调用sleep()函数。当然,这种调用不是很好的解决方法。
(4)读阻塞,管道中没有数据,这时去读取数据,就会阻塞。
4.无名管道的创建
pipe
/\*需要包含的头文件\*/
#include <unistd.h>
/\*
\*函数名:pipe
\*函数功能:创建一个无名管道pipe
\*函数参数:int pipefd[2]: pipefd用来存储操作管道的文件描述符
\* pipefd[0]:读端 pipefd[1]:写端
\*函数返回值:int:成功返回0,失败返回-1
\*/
int pipe(int pipefd[2]);
5.无名管道的读写
read fd[0] 读端
write fd[1] 写端
6.无名管道的关闭
close
7.注意
1.pipe函数一定要放在fork上面,要不然会pipe两次,导致父子进程各操作各的无名管道。会实现不了通信。
8.设置文件为非阻塞:
int flags = fcntl(fd, F_GETFL);
if(flags < 0 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0)
{
perror("fcntl");
close(fd);
return -1;
}
9.fcntl函数:
#include <unistd.h>
#include <fcntl.h>
函数功能:用来控制文件描述符的
函数参数:
int fd:被控制的文件描述符
int cmd:控制命令
.../\*arg\*/:可变参数(可有可无)
函数返回值:
int fcntl(int fd, int cmd, ... /\* arg \*/ );
cmd:
F_GETFL:获取文件描述符的状态
F_SETFL:设置文件描述符的状态
在使用F_SETFL时,会使用到arg,arg常用的参数有:
O_NONBLOCK:非阻塞I/O
O_ASYNC:异步I/O
五、有名管道
1.有名管道的特点:
有名管道(FIFO)是对无名管道的一种改进,它具有如下特点:
(1)它可以使互不相关的两个进程实现彼此通信
(2)该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立管道之后,两个进程就可以把它当作普通文件进行读写,使用非常方便。
(3)FIFO严格遵循先进先出原则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。有名管道不支持如lseek()等文件定位操作。
2.如何创建有名管道:
mkfifo
#include <sys/types.h>
#include <sys/stat.h>
/\*
\*函数名:mkfifo
\*函数功能:创建一个有名管道
\*函数参数:
\* const char \*pathname:有名管道的文件名
\* mode\_t mode:文件权限
\*函数返回值:int:成功返回0,失败返回-1
\*/
int mkfifo(const char \*pathname, mode_t mode);
mknod<管道文件名> p
例子:
mknod myfifo p
如何自学黑客&网络安全
黑客零基础入门学习路线&规划
初级黑客
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!
7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。
8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。
网络安全工程师企业级学习路线
如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的
视频配套资料&国内外网安书籍、文档&工具
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。
一些笔者自己买的、其他平台白嫖不到的视频教程。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!