一. 地址方面字节上的差异
32位是cpu一次处理的位数,即32位4字节,相当于地址的宽度,即sizeof(*p);
虚拟地址大小为4G,即有2的32次方个地址,从32个0到32个1个地址;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210323094254825.png)
64位是cpu一次处理的位数,即64位8字节,相当于地址的宽度,即sizeof(*p);
虚拟地址大小为128G,即有2的64次方个地址,从64个0到64个1个地址;
在写Exp的时候: 64位
32位:
————————————————
二.函数调用方面的差异
由于函数调用这方面的差异:
在写 ExP,payload的时候:
32 位: p32(system)+p32(bin_sh)
64 位: p64(rdi)+p64(bin_sh)+p64(system)
出现栈劫持的时候 p(binsh)在前面
三.格式化漏洞利用方面的差异
64位的格式化字符串漏洞,它跟32位有挺大区别的,要注意‘00’的截断,不可以像32位那样一步修改到位,它一次只可修改2字节。
出现截断这种情况时,我们可以根据情况更改偏移量,或者填充字符来克服;
而32位
相比64位利用起来就很简单;
32位的 payload = p32(泄露地址) + %偏移$x 来构建
类似payload=p32(printf_got)+"%6$s"
64位
payload=“aa%9$nAAA”+p64(judge)
64位文件
为了字符串不被截断,我们只能将地址给放在字符串的后面了