关于是否进行栈对齐的分析
栈对齐的判断规则(两步法)
栈对齐的核心要求:执行函数(如 system)时,rsp寄存器的值必须是 16 的整数倍(rsp % 16 == 0)。判断你的 payload 是否需要对齐,只需两步:
步骤 1:计算 payload 到 system_addr 的总长度
1 | payload2 = ( |
总长度(到执行 system 前)= offset + 8 + 8(因为执行pop_rdi_ret_addr后,rsp会指向binsh_addr,执行完pop_rdi; ret后,rsp指向system_addr,此时调用 system)。
步骤 2:检查长度是否满足 16 字节对齐
执行system_addr时,rsp的偏移 = offset + 8 + 8;
若 (offset + 16) % 16 != 0 → 需要栈对齐;若 (offset + 16) % 16 == 0 → 无需对齐。
实操判断示例(以 payload 为例)
假设offset = 0x88(136 字节):
计算总长度:0x88 + 8 + 8 = 0x98(152 字节);
检查对齐:0x98 % 16 = 8(≠0)→ 需要栈对齐;
解决方法:在pop_rdi_ret_addr前加一个单独的ret Gadget(8 字节),
总长度变为0x88 + 8 + 8 + 8 = 0xA0,0xA0 %16 =0,满足对齐。
1 | payload2 = ( |
更新: 2026-02-10 21:22:41
原文: https://www.yuque.com/idcm/wnemg9/fwxv1ngdwc2ptgd3