郑重声明:本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。
🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论 | 保持连接💬
🌌 立即前往 👉 晖度丨安全视界🚀

▶ 信息收集
▶ 漏洞检测
▶ 初始立足点 ➢ 深入剖析JMP ESP原理 ➢🔥🔥🔥
▶ 权限提升
▶ 横向移动
▶ 报告/分析
▶ 教训/修复
目录
1.1.1 再次复习 Python 漏洞利用代码 (42928.py)
1.ESP寄存器在函数返回时的特殊位置
本例以Sync Breeze Enterprise(这是一个文件管理同步软件)为目标,对其漏洞利用分析与修改,并最终利用,利用缓冲区溢出漏洞,类似漏洞编号:CVE-2017-14980。
之前的一系列文章写的是,如果寻找漏洞利用的脚本,并利用缓冲区溢出原理加以利用,按照实际测试环境的情况修改脚本后编译为可执行文件,最终拿到反向shell。主要要非常了解栈结构、出入栈原理,以及shellcode的结构等。但,这里有一个核心问题不知道你们有没有想过:
① “为什么覆盖了返回地址后,当执行漏洞利用文件时,返回地址指向的不是shellcode的地址,而是JMP ESP指令?”
② “为什么返回地址指向JMP ESP指令,就能执行我们的shellcode?”
至少,我脑袋中想到了这个很细节、但有非常核心的问题!那么,我们试试把它弄懂。
1.1 复习核心载荷结构
1.1.1 再次复习 Python 漏洞利用代码 (42928.py)
在此复习42928.py源代码,开始进行分析。
1.1.1.1 核心载荷分析
重点看漏洞利用脚本中的HTTP服务器模块,通过构造特殊的 POST请求 触发缓冲区溢出。以下是核心代码段的解读:
| 代码片段 | 说明 |
|---|---|
offset = "A" * 780 |
创建780个字符“A”作为偏移量填充,用于覆盖缓冲区直至返回地址位置 |
JMP_ESP = "\x83\x0c\x09\x10" |
跳转指令,指向内存地址 0x10090c83(JMP ESP),用于重定向执行流。 这里具体的是,在偏移量780处,使用内存地址为0x10090c83的JMP ESP指令覆盖指令指针。 |
shellcode = "\x90"*16 + msf_shellcode |
Shellcode构造:16个NOP指令( 这个shellcode的作用是执行攻击者想要运行的恶意操作,比如:打开反向Shell连接、执行任意命令等。 |
结构:
[缓冲区填充] → [覆盖返回地址,跳转至JMP ESP地址] → [执行NOP滑道] → [运行Shellcode]
1.1.2.2 POST请求构造
漏洞利用通过HTTP POST的请求体携带来发送恶意载荷:
POST请求结构如下:
POST /login HTTP/1.1
Host: <目标IP>
Content-Type: application/x-www-form-urlencoded
Content-Length: <长度>
username=<偏移量><JMP_ESP><NOP滑道><Shellcode>&password=A
1.2 核心问题剖析
“为什么返回地址指向JMP ESP指令,就能执行我们的Payload?”
1.2.1 完整的原理剖析
1.2.1.1 构造恶意数据
攻击数据结构:
[低地址] [填充数据] [JMP ESP地址] [NOP滑块] [Payload] [剩余填充] [高地址]
↑ ↑ ↑ ↑
填满缓冲区 覆盖返回地址 安全缓冲 恶意代码
1.2.1.2 栈内存状态变化图
函数返回前栈布局:
高地址
├─────────────────┤
│ Payload │ ← 实际在返回地址之后
├─────────────────┤
│ NOP滑块 │
├─────────────────┤ ← ESP移动到这里(ret执行后)
│ JMP ESP地址 │ ← 返回地址(被覆盖)
├─────────────────┤ ← ESP初始位

最低0.47元/天 解锁文章
1818





