如何自学黑客&网络安全
黑客零基础入门学习路线&规划
初级黑客
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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
998
def fun(num):
if num == 0:
return 0
else:
return fun(num - 1)
if __name__ == '__main__':
print(fun(998))
结果
RecursionError: maximum recursion depth exceeded in comparison
print([i%2 for i in range(10)])和print((i%2 for i in range(10)))的结果?
print([i%2 for i in range(10)])
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
print((i%2 for i in range(10)))
<generator object at 0x00000283335C7F48>
一个是列表,一个是生成器/迭代器
简述解释型语言和编译型语言?
-编译型(需要编译器,相当于用谷歌翻译):编译型语言执行速度快,不依赖语言环境运行,跨平台差,如C/C++、Go执行速度快,调试麻烦
-解释型(需要解释器,相当于同声传译):解释型跨平台好,一份代码,到处使用,缺点是执行速度慢,依赖解释器运行,如Python、JAVA执行速度慢,调试方便
解释器种类及特点
CPython是使用最广且被的Python解释器。
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。CPython用>>>作为提示符,而IPython用In[序号]:作为提示符。
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
字符串格式化有哪几种?
占位符
‘hello,%s’ % ‘world’
‘hello,world’
format
‘hello,{}’.format(‘world’)
‘hello,world’
f-string
f’hello,{“world”}’
‘hello,world’
简述字符串驻留机制?
对于短字符串,将其照值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本。长字符串不遵守驻留机制。
驻留适用范围:由数字,字符和下划线组成的python标识符以及整数[-5,256]。
s1=‘hello_world’
s2=‘hello_world’
id(s1)
2762526059824
id(s2)
2762526059824
s1=‘hello_world’*10000
s2=‘hello_world’*10000
id(s1)
2762523045808
id(s2)
2762523155872
什么是反射,举个例子?
反射是把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。利用以下四个内置函数:
- getattr 获取指定字符串名称的对象属性
- setattr 为对象设置一个对象
- hasattr 判断对象是否有对应的对象(字符串)
- delattr 删除指定属性
例如:
s2=‘hello_world’
getattr(s2,‘split’)(‘_’)
[‘hello’, ‘world’]
Python自省
运行时获得对象的类型等,内置函数dir、type、isinstance等,利用了反射机制。
Python作用域
本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)
函数及函数式编程
函数调用时参数传递方式?
函数传参是引用传递,函数外一直不变,需要区分对象是否可变。对于不可变类型,可以通过返回修改后的引用来改变它(指向其他地方)。
什么是闭包?
在一个函数内部的函数,具体来说:
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数中的变量
- 外部函数的返回值必须是内嵌函数
什么是lambda函数?
lambda函数也叫匿名函数,该函数可以包含任意数量的参数,但只能有一个执行操作的语句。
装饰器
装饰器的作用和功能?
一句话:为已经存在的对象添加额外的功能
- 引入日志
- 函数执行时间统计
- 执行函数栈预备处理
- 执行函数后的清理功能
- 权限校验
- 缓存
迭代器、生成器
迭代器和生成器的区别是什么?
1、共同点
生成器是一种特殊的迭代器。
2、不同点
a、语法上:
生成器是通过函数的形式中调用 **yield 或()**的形式创建的,自动创建了__iter__()和next()方法,显得特别简洁,也是高效的。
迭代器可以通过iter()内置函数创建。
b、用法上:
生成器在调用next()函数或for循环中,所有过程被执行,且返回值,需要的时候才返回,生成器表达式比列表生成式更节省内存。
迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程或动作。
拷贝
深拷贝和浅拷贝有什么区别?
在创建新实例类型时使用浅拷贝,并保留在新实例中复制的值。浅拷贝用于复制引用指针,就像复制值一样。这些引用指向原始对象,并且在类的任何成员中所做的更改也将影响它的原始副本。浅拷贝允许更快地执行程序,它取决于所使用的数据的大小。
**深拷贝用于存储已复制的值。**深拷贝不会将引用指针复制到对象。它引用一个对象,并存储一些其他对象指向的新对象。原始副本中所做的更改不会影响使用该对象的任何其他副本。由于为每个被调用的对象创建了某些副本,因此深拷贝会使程序的执行速度变慢。
浅拷贝拷贝数据集合的第一层数据,深拷贝拷贝数据集合的所有层。例如,一个列表list1,另一个列表list2中append了list1,使用copy标准库的copy和deepcopy分别浅拷贝和深拷贝为list3、list4,修改list1,list3会变化,list4不变。
线程、进程与协程
如何在Python中实现多线程?
Python有一个多线程库,但是用多线程来加速代码的效果并不是那么的好,
Python有一个名为Global Interpreter Lock(GIL)的结构。GIL确保每次只能执行一个“线程”。一个线程获取GIL执行相关操作,然后将GIL传递到下一个线程。
虽然看起来程序被多线程并行执行,但它们实际上只是轮流使用相同的CPU核心。
所有这些GIL传递都增加了执行的开销。这意味着多线程并不能让程序运行的更快。
协程
简单点说协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。
Python里最常见的yield就是协程的思想!
面向对象
Python的元类?
先定义metaclass,就可以创建类,最后创建实例。
所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。它指示Python解释器在创建MyList
时,要通过ListMetaclass.__new__()
来创建。
ORM就是一个典型的例子。
静态方法,类方法
\ | 实例方法 | 类方法 | 静态方法 |
---|---|---|---|
a = A() | a.foo(x) | a.class_foo(x) | a.static_foo(x) |
A | 不可用 | A.class_foo(x) | A.static_foo(x) |
实例方法,类无法调用。类方法和静态方法类和实例都可以调用。A.class_foo(x)可以理解为class_foo(A,x),a.class_foo(x)可以理解为class_foo(a,x),a会转化为A。静态方法和类没有太大关系。
类变量和实例变量
类变量是所有实例共享的
实例变量是实例单独拥有的
Python中单下划线和双下划线
双下划线"__变量或函数__",是Python内部为了防止和用户自定义命名冲突。
双下划线"__变量或函数",解析器用_classname__foo
来代替这个名字,以区别和其他类相同的命名,它无法直接像公有成员一样随便访问,通过对象名._类名__xxx这样的方式可以访问。
单下划线"_变量或函数",是指定变量私有,不能通过from module import *导入,其他地方和公有一样。
重载
- 可变参数类型。
- 可变参数个数。
基本的设计原则:仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载。
__new__
和__init__
的区别
__new__
是一个静态方法,而__init__
是一个实例方法。__new__
方法会返回一个创建的实例,而__init__
什么都不返回。- 只有在
__new__
返回一个cls的实例时后面的__init__
才能被调用。 - 当创建一个新实例时调用**
__new__
**,初始化一个实例时用__init__
。
利用__new__可实现单例模式
文件
read,readline和readlines
- read 读取整个文件
- readline 读取下一行,使用生成器方法
- readlines 读取整个文件到一个迭代器以供我们遍历
内存管理
Python垃圾回收机制?
垃圾回收:
Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称python语言为动态类型的原因(这里我们把动态类型语言可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。
引用计数:
Python采用了类似windows内核对象一样的方式来对内存进行管理。每一个对象,都维护这一个对指向该对象的引用的计数。当变量被绑定在一个对象上的时候,该变量的引用计数就是1,,系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对象就会被回收。
标记-清除:
“标记-清除”不改动真实的引用计数,而是将集合中对象的引用计数复制一份副本,改动该对象引用的副本。对于副本做任何的改动,都不会影响到对象生命走起的维护。基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
分代回收:
将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。
举例: 当某些内存块M经过了3次垃圾收集的清洗之后还存活时,我们就将内存块M划到一个集合A中去,而新分配的内存都划分到集合B中去。当垃圾收集开始工作时,大多数情况都只对集合B进行垃圾回收,而对集合A进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了。
Python是如何进行内存管理的?
内存池机制:
python的内存机制成金字塔形:
第-1,-2层主要有操作系统进行操作;
第0层是C中的malloc,free等内存分配和释放函数进行操作;
第1层和第2层是内存池,有python的接口函数PyMem_Malloc函数实现,当对象小于256字节时由该层直接分配内存;
第三层是最上层,也就是我们对python对象的直接操作;
一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!