1. gdb 段错误调试
  2. 如果 rand 之前没有 srand
  3. page fault 和 access fault 的区别
  4. canary
  5. pwntools

gdb 段错误调试

Linux下调试段错误的方法

如果 rand 之前没有 srand

标准里面写了

会用 1 作为默认种子

page fault 和 access fault 的区别

page fault 是读写执行权限的错误,access 是 kernel 还是 user 的错误。

access fault 也有可能由于 PMA(Physical Memory Attribute)检查失败产生。

物理内存属性(PMA:Physical Memory Attributes)检查失败通常发生在处理器试图访问具有特定属性的物理内存时,但该访问违反了这些属性的规定。

canary

原来,所有栈的 canary 都相同

前一个函数的栈帧内容没有被清空,会被后续的函数再使用,alloca 可以调整取得栈变量的位置。从而泄露 canary。

浅析 Linux 程序的 Canary 机制

pwntools

# 寻找一个字符串
binsh = libc_base + next(libc.search(b'/bin/sh'))

# 按照正则来接收
canary = p.recvregex("(\-*\d+\.\d+)")

# struct 来打包和解包
# https://www.cnblogs.com/litaozijin/p/6506354.html
>>> f = -3001136621000090411588975790367592799993690258910694055348200145211620623843852288.000000
>>> hex(u64(pack('<d', f)))
'0xd0d94f9496fdf700'