pwn中str()与p64()
在做一道题是,当scanf的字符串是'%d'时,用str(0xfc1)会输入修改成功。
当scanf的字符串是'%s'时,用p64(0xfc1)会输入修改成功。
想了很久,才明白。
用pwn脚本时,用str()发送数据是模拟交互输入,比如str(0xfc1)会发送过去 4033 这个字符串,就相当于我们与程序交互时,输入了4033这个数字,所以可以用"%d"来读取,并用小端序存储
用p64()发送数据时,是发送的字节流,也就是比特流(二进制流)。本来是01这样表示的,但是ide为了方便观察, 就转换成了\xc1\x0f\x00\x00\x00\x00\x00\x00。发送时,也是按照字节来发,所以要用"%s"来读取
注:我一直想为什么是按照字符串来读取,并且\xc1\x0f是反的呢,我猜想的是因为字符串放入内存是\x0f先放入栈中,然后\xc1再放入,所以会这样。
我试了试用‘%s’读取4033,读入内存的是 0x0000000033333034。 用'%d'读取4033,读入内存的是0xfc1.