python与pwntools基本使用
本片文章旨在总结成长为一名合格的pwn手必须要熟练掌握的python语法知识
操作字符串/字节流
截取字符串/字节对象
python没有单字符类型,只有字符串类型
python访问子字符串,可以用[]
来截取字符串
字符串的截取语法
1 |
|
更高级的操作可以搜索python序列操作:切片操作
注意:p64()
打包之后在payload
中也可以进行截取操作,这是一个partial write
操作技巧
注意:截取的下标是左闭右开的,即截取的子序列中,会包含头下标,不会包含尾下标,切取的 字符范围 是【头下标,尾下表-1】索引范围的字符
左对齐和右对齐
字符串的内置方法
1 |
|
如果
width
小于被操作字符串的长度,不会被操作,直接返回原字符串
小端序(little-endian)是一种字节序,它将低位字节存储在低地址处,高位字节存储在高地址处
发送字节流时是从低地址向高地址发送的,对应的数字型也是从低位到高位(小端序),所以向低位对齐、高位补0的操作常用
.ljust(width, fillchar)
方法
因为pwntools的u64()
、u32()
等解包函数严格限制了字节流的长度,所以往往需要先截取字符串再进行对齐补全操作后解包成无符号数
解包与打包
字节流转为无符号整数 无符号整数转为字节流
默认情况下u32()
、u64()
等解包函数使用小端序,这与x86架构的默认字节序一致
demo:
1 |
|
字符串/字节流拼接操作
+
、 *
运算符
int()函数
python中非常高级强大的一个函数
将字符串、数字类型转换为(十进制)整数,最主要使用的是将字符串转换为整数
1 |
|
x:要转换的值
base:被转换值的进制数
python语法之字典
python语法之模块化编程
import
from ... import ...
from ... import ... as ...
python语法之关键字try
1 |
|
python跳出循环的语法:break
1 |
|
LibcSearcher
libc常见的地址前缀:
0x7f
:现代linux
系统中最常见的libc
地址结构。0xf7
:在一些较老的系统或特定的配置中,libc
地址可能以0xf7
开头
1 |
|
去掉高位的0
32位系统中libc有效地址常常4个字节
64位系统中libc有效地址常常6个字节
若启用ASLR,libc
基地址会在运行时随机化,但范围大致固定:
- 32位:
0xb7000000
~0xf7000000
。 - 64位:
0x7f0000000000
~0x7ffffffff000
。