首先一定要注意,byte和str在python里面有明确的区分,尤其是在做pwn的题目时,一定要注意这个问题。
参考链接:https://www.cnblogs.com/mlgjb/p/7899534.html
hex(x)
x -- 10进制整数
返回16进制数,以字符串形式表示。
p32(x)
x-- 一个整型数据
返回byte型。
u32(x)
x-- byte型
返回整型。
int(a,base=x)
a-- 可以是byte也可以是str型
x是a本身的的进制。
返回10进制数,整型。
你可能有疑惑了,为什么byte型str型不是整数,却还有进制?
举个例子:
a='100'
c=int(a,8)
print(c)
结果:c=64
什么意思?
100作为一个八进制数,转化成十进制数,就是64
再看一个:
a='aaa'
c=int(a,8)
print(c)
结果?
没有结果,因为这是错误的。
Traceback (most recent call last):
File "%p.py", line 25, in <module>
c=int(a,8)
ValueError: invalid literal for int() with base 8: 'aaa'
8进制里面,怎么可以出现大于7的字符呢?
再看一个:
a='z'
c=int(a,35)
print(c)
报错:
Traceback (most recent call last):
File "%p.py", line 25, in <module>
c=int(a,35)
ValueError: invalid literal for int() with base 35: 'z'
你可以借鉴16进制,
A表示10,B–1,C–12,D–13,E–14,F–15
那z呢?
在36进制内,z表示35。
所以35进制内不存在z。
把进制换成36就好了,结果是35.
我想,你应该明白了。
在pwn中,recv和send、sendline都是使用的byte型。
也就是说,我们在接收时,收到的是byte型,发送时,发送的是byte型。
例子
好了,我们开始自己的尝试,一点一点去理解这个东西。
from pwn import *
a='0x80489632'
print(type(a))#str
a1=int(a,16)
print(a1)
print(type(a1))#int
print(hex(a1))
print(type(hex(a1)))#str
print(p32(a1))
print(type(p32(a1)))#byte
'''
a2=u32(a)
print(a2)
print(type(a2))#int
'''
b=b'0x8048000'
print(type(b))#byte
b1=int(b,16)
print(b1)
print(type(b1))#int
print(hex(b1))
print(type(hex(b1)))#str
print(p32(b1))
print(type(p32(b1)))#byte
b=b'\xb0\x9a\t\x86\xe8\x7f\x00\x00'
'''
鉴于能够执行u32、u64的byte型数据是有要求的,我上面写的那个byte型数据b不符合要求,所以我换了一个b,只要能明白这些东西的类型转换就行,不要太纠结
'''
b2=u64(b)
print(b2)
print(type(b2))#int
结果:
<class 'str'>
2152240690
<class 'int'>
0x80489632
<class 'str'>
b'2\x96H\x80'
<class 'bytes'>
<class 'bytes'>
134512640
<class 'int'>
0x8048000
<class 'str'>
b'\x00\x80\x04\x08'
<class 'bytes'>
140636657916592
<class 'int'>
我的一些想法是,p32、p64所做的是,将一个整形数据进行hex转换后,将这个进行转换成byte型,并进行小段输入
个人理解,还请见谅。