pwntools:类型转换

byte和str

首先一定要注意,byte和str在python里面有明确的区分,尤其是在做pwn的题目时,一定要注意这个问题。

参考链接:https://www.cnblogs.com/mlgjb/p/7899534.html

pwntools:类型转换_第1张图片

hex

hex(x)

x --  10进制整数

返回16进制数,以字符串形式表示。

p32、p64

p32(x)

x--  一个整型数据

返回byte型。

u32、u64

u32(x)

x--  byte型

返回整型。

int类型转换

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.

我想,你应该明白了。

send、sendline、recv

在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型,并进行小段输入

个人理解,还请见谅。

你可能感兴趣的:(pwn,python)