Qemu 模拟环境
Qemu 模拟环境这一章节主要介绍如何使用 QEMU 来搭建调试分析环境。为了使用 qemu 启动和调试内核,我们需要内核、qemu、文件系统。
准备内核这个在之前已经编译完成了。
QEMU关于 QEMU 的介绍与安装请参考 ctf-tools。
文件系统这里我们使用 busybox 来构建一个简单的文件系统。
下载编译 busybox下载 BUSYBOX12❯ wget https://busybox.net/downloads/busybox-1.32.1.tar.bz2❯ tar -jxf busybox-1.32.1.tar.bz2
配置1❯ make menuconfig
在 Setttings 选中 Build static binary (no shared libs),将 busybox 编译为静态链接的文件;在 Linux System Utilities 中取消选中 Support mounting NFS file systems on Linux < 2.6.23 (NEW);在 Networking Utilities 中取消选中 inetd。
编译 ...
Python迭代器与成器
Python迭代器与成器迭代器核生成器算是Python一大特色,其核心是基于迭代器协议来的。
而平时我们经常使用的for in循环体,本质就是迭代器协议的一大应用。
同时Python内置的集合类型(字符,列表,元组,字典)都已经实现了迭代器协议,所以才能使用for in 语句进行迭代遍历。for in 循环体在遇到 StopIteration异常时,便终止迭代和遍历。
再说下可迭代,迭代器,生成器三个概念的联系和区别。
可迭代概念范围最大,生成器和迭代器肯定都可迭代,但可迭代不一定都是迭代器和生成器,比如上面说到的内置集合类数据类型,可以认为,在Python中,只要有集合特性的,都可以迭代。
迭代器,迭代器的特点是,均可以使用for in 和next逐一遍历。
生成器,生成器一定是迭代器,也一定可迭代。
至于Python中为何要引入迭代器和生成器,除了节省内存空间外,也可以显著提高代码运行速度。
迭代器迭代是python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往 ...
python推导式
python推导式python推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
python支持各种数据结构的推导式:
列表推导式
字典推导式
集合推导式
元组推导式
列表推导式过滤掉长度小于或等于3的字符串列表,并将剩下的转换成大写字母
1234>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']>>> new_names = [name.upper()for name in names if len(name)>3]>>> print(new_names)['ALICE', 'JERRY', 'WENDY', 'SMITH']
计算 30 以内可以被 3 整除的整数
123>>> multiples = [i ...
python导入本地库文件
python导入本地库文件问题背景在导入一个开源的gitbub项目的师傅,报错发现没有对应的目录,于是去网上找到对应的解决办法,现在做个总结
python包路径搜索机制在解决问题前,我们先来了解一下问题的原因,可以用
来查询当前已安装的包
1pip list package_name
在python解释器里使用sys.path
12import sysprint(sys.path)
sys.path其实就是你的python解释器真正搜索包路径的顺序
python的sys.path解释
sys.path 的第一个路径是脚本的执行目录,如果启动的是交互式python解释器(也就是直接在命令行启动python;或者脚本是从标准输入获取的,则这第一个路径是一个空字符串’’)
第三方库
1/usr/lib/python3/site-packages:/home/user/.local/lib/python3/site-packages
PYTHONPATH环境变量
大部分老手都知道将自己的一些模块路径打入系统环境变量中,让python解释器能够找到
1export PYTHONP ...
python3集合
python3集合集合是一个无序的不重复元素序列。
可以使用大括号{}或者set()函数创建集合,注意:创建一个空的集合必须使用set函数而不是{},因为{}是创建一个空字典。
集合的基本操作添加元素add()函数可以将元素添加到集合中,如果元素已存在,则不进行任何操作
1234>>> thisset = set(("Google", "Runoob", "Taobao"))>>> thisset.add("Facebook")>>> print(thisset){'Taobao', 'Facebook', 'Google', 'Runoob'}
还有一个方法update(),也可以添加元素,且参数可以是列表,元组,字典等。
12345678>>> thisset = set(("Google", "Run ...
Python3错误和异常
Python3错误和异常异常处理try/except异常捕捉可以使用try/except语句
try 语句按照如下方式工作;
首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
如果没有异常发生,忽略 except 子句,try 子句执行后结束。
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:
12except (RuntimeError, TypeError, NameError): pass
最后一个except子句可以忽 ...
python3运算符
python3运算符python语言支持以下类型的运算符:
算术运算符
比较运算符
赋值运算符
逻辑运算符
位运算符
成员运算符
身份运算符
算术运算符和比较运算符,赋值运算符,位运算符基本上和C语言都是一样的,这里就不载赘述了。
Python逻辑运算符
运算符
逻辑表达式
描述
实例
and
x and y
布尔“与”,如果x为False,x and y 返回x的值,否则返回y的值。
a and b
or
x or y
布尔“或”,如果x为true,它返回x的值,否则它返回y的值。
a or b
not
not x
布尔“非”,如果x为True,返回False。如果Flase,它返回True
not a
Python成员运算符除了以上的一些运算符,python还支持成员运算符。
运算符
描述
实例
in
如果在指定的序列中找到值返回True,否则返回False。
x在y的序列中,返回true。
not in
如果在指定的序列中没有找到值返回True,否则返回Fasle。
x不在y的序列中,返回true。
Python身份运算符身份运算 ...
python3输入和输出
python3输入和输出输出格式美化python两种输出值的方式:表达式语句和print()函数。
第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。
如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。
如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。
str(): 函数返回一个用户易读的表达形式。
repr(): 产生一个解释器易读的表达形式
例如1234567891011121314151617181920>>> s = 'Hello, Runoob'>>> str(s)'Hello, Runoob'>>> repr(s)"'Hello, Runoob'">>> str(1/7)'0.14285714285714285'>>> x = 10 * 3.25>>&g ...
python3模块
python3模块import 语句导入模块的语句有三种
123import module1[, module2[,... moduleN]from modname import name1[, name2[, ... nameN]]from modname import name1[, name2[, ... nameN]]
import module1[, module2[,… moduleN]当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。
搜索路径是一个解释器会先进行搜索的所有目录的列表。
当我们使用 import 语句的时候,Python 解释器是怎样找到对应的文件的呢?
这就涉及到 Python 的搜索路径,搜索路径是由一系列目录名组成的,Python 解释器就依次从这些目录中去寻找所引入的模块。
这看起来很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。
搜索路径是在 Python 编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在 sys 模块中的 path 变量
from modname import name1[, ...
Python3数据结构
Python3数据结构列表Python中列表是可变的,这是它区别于字符串核元组的最重要的特点,一句话概括:列表可以修改,而字符串核元组不能。
把列表当做堆栈使用列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用append()方法看把一个元素添加到堆栈顶。用不指定索引的pop方法可以把一个元素从堆栈顶释放出来。
把列表当做队列使用也可以把列表当做队列用,只是队列里第一加入的元素,第一个取出来;但拿列表用做这样的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度去不快(因为所有其他元素都得一个一个地移动)。
列表推导式列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每一个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。
每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。
del ...