一些基础知识的记录

记录一些帮助理解的基础知识,备查.

对于64位程序接收泄露的地址时,为什么在读到 \x7f 之后截止,再获取前面的6字节呢?


xx_addr = u64(io.recvuntil("\x7f")[-6: ].ljust(8, '\0'))

原因是虽然在64位计算机中,一个地址的长度是8字节,但是实际上的计算机内存只有16G内存以下,所以一般的地址空间只是用了不到 2^48 的地址空间。因此,实际的操作系统中,一个地址的最高位的两个字节是00,而且实际栈地址一般是0x7fxxxx开头的,因此为了避免获取错误的地址值,只需要获取前面的6字节值,
然后通过ljust函数把最高位的两字节填充成00。 我们还可以用这种一般的写法:

u64(p.recv(6).ljust(8, "\x00"))

在pwntools中可以用flat()来帮助构造payload,参数传递用list来传,list中的内容为想串接起来的payload,简单来说就是可以把:payload = p32(gadget1) + p32(gadget2) + …… 变成flat([gadget1,gadget2,gadget3……]),但是要事先声明用何种形式打包,所以在exp开头要写上架构,例如:context.arch = ‘i386’,这样就会用p32()打包
64位用pattern计算偏移方法

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005b3 in vulnerable_function ()
gdb-peda$ x/gx $rsp  
0x7fffffffe188: 0x3765413665413565
gdb-peda$ pattern offset 0x3765413665413565
hex pattern decoded as: e5Ae6Ae7
136

通过查看栈顶数据来计算溢出点
vim的基础用法

:%d      #删除当前文件中所有内容
:wq      #保存并退出
:%s/^\s\+//   #删除多行行首的空格
:%s/^\s//     #删除每一行行首的第一个空格
:n1,n2, s/^\s\+//   #删除第n1行到第n2行之间行行首的所有空格

参考链接:
https://www.jianshu.com/p/c53627895330
http://www.vuln.cn/6644

您的鼓励将支持我继续努力!