python与pwntools基本使用

本片文章旨在总结成长为一名合格的pwn手必须要熟练掌握的python语法知识

操作字符串/字节流


截取字符串/字节对象


python没有单字符类型,只有字符串类型
python访问子字符串,可以用[]来截取字符串

字符串的截取语法

1
变量[头下标:尾下标]

更高级的操作可以搜索python序列操作:切片操作

注意:p64()打包之后在payload中也可以进行截取操作,这是一个partial write操作技巧

注意:截取的下标是左闭右开的,即截取的子序列中,会包含头下标,不会包含尾下标,切取的 字符范围 是【头下标,尾下表-1】索引范围的字符

左对齐和右对齐


字符串的内置方法

1
2
str.ljust(width, fillchar)
str.rjust(width, fillchar)

如果width小于被操作字符串的长度,不会被操作,直接返回原字符串

小端序(little-endian)是一种字节序,它将低位字节存储在低地址处,高位字节存储在高地址处

发送字节流时是从低地址向高地址发送的,对应的数字型也是从低位到高位(小端序),所以向低位对齐、高位补0的操作常用.ljust(width, fillchar)方法

因为pwntools的u64()u32()等解包函数严格限制了字节流的长度,所以往往需要先截取字符串再进行对齐补全操作后解包成无符号数

解包与打包


字节流转为无符号整数 无符号整数转为字节流

默认情况下u32()u64()等解包函数使用小端序,这与x86架构的默认字节序一致

demo:

1
2
3
4
5
6
7
8
from pwn import *

# 示例字节流
byte_stream = b'\x0c\xb0\xce\xfa\x00\x00\x00\x00'

# 使用 u64 转换为64位无符号整数
result = u64(byte_stream)
print(result) # 输出:4047627004

字符串/字节流拼接操作


+*运算符

int()函数


python中非常高级强大的一个函数

将字符串、数字类型转换为(十进制)整数,最主要使用的是将字符串转换为整数

1
int(x, base=10)

x:要转换的值
base:被转换值的进制数


python语法之字典



python语法之模块化编程


import

from ... import ...

from ... import ... as ...

python语法之关键字try


1
2
3
4
5
6
7
8
9
10
try:
# 可能引发异常的代码
except 异常类型1:
# 处理异常类型1的代码
except (异常类型2, 异常类型3):
# 处理异常类型2和3的代码
else:
# 如果没有发生异常,执行此代码
finally:
# 无论是否发生异常,都会执行此代码

python跳出循环的语法:break

1
2
3
4
for i in range(1, 6):
if i == 3:
break
print(i)

LibcSearcher


libc常见的地址前缀:

  • 0x7f:现代linux系统中最常见的libc地址结构。
  • 0xf7:在一些较老的系统或特定的配置中,libc 地址可能以 0xf7 开头
1
data = io.recvuntil(b'\x7f')

去掉高位的0
32位系统中libc有效地址常常4个字节
64位系统中libc有效地址常常6个字节

若启用ASLR,libc基地址会在运行时随机化,但范围大致固定:

  • 32位:0xb7000000 ~ 0xf7000000
  • 64位:0x7f0000000000 ~ 0x7ffffffff000

python与pwntools基本使用
http://example.com/2024/11/04/python与pwntools基本使用/
作者
yvyvSunlight
发布于
2024年11月4日
许可协议