两道PWN题目

发布时间:2026/6/30 21:05:39
两道PWN题目 easy_overflow先查保护该程序为 64 位非 PIE 二进制无栈 Canary、栈可执行且存在 RWX 段开启了 SHSTK 和 IBT但由于没有 PIE 且缺少栈保护仍然容易受到栈溢出攻击并可通过固定地址构造利用用64位的IDA查看可以看到有函数win、vuln、main分别查看vuln 中 buf只有 64 字节但是 read(0, buf, 0x100) 可以读 256 字节返回地址可以被覆盖存在后门函数可以利用vuln中的read溢出覆盖返回地址修改成返回到win执行system现在需要找到返回地址的偏移和指定的返回地址——函数win的地址算出返回的偏移地址0x40 0x8 72win0x4011FB这里不能直接 ret2win因为 win() 里会调用 system(/bin/sh)amd64 下直接进 system 可能遇到栈 16 字节对齐问题。直接跳 win 没有正常拿到 shell前面补一个单独的 ret 后就可以稳定执行。最后的payloadpayload bA * 72 p64(0x401214) p64(0x4011FB)本地的远程的修改最后得到flagflag{11059077-0539-46a7-9277-2014346573fd}hidden_menu查保护该程序为 64 位非 PIE 二进制开启 NX、SHSTK 和 IBT采用 Partial RELRO未开启栈 Canary虽然栈不可执行但由于地址固定且缺少栈保护仍可能通过 ROP 等方式利用栈溢出漏洞IDA查看能看到main 、vuln 、menu、secret、backdoor等函数查看这些函数主函数里表示意思是如果输入 1进入 vuln()如果输入 1337进入 secret()否则退出先查看backdoor后门函数函数vulnvuln()栈溢出buf只有 64 字节但是 read(0, buf, 0x100) 可以读 128 字节可覆盖 saved RBP 和返回地址从而劫持控制流可以将返回的地址修改成后门函数backdoor的地址进入执行system注意对齐-------------第一种方法secret()中也存在栈溢出buf只有32字节但是read却可以读64字节和vuln() 一样可以覆盖到返回地址从而将返回的地址修改成后门函数地址直接返回到后门函数执行system。 ----------------第二种方法但是这个方法又绕远了按照secret()的顺序往下if (strncmp(buf, OpenTheDoor, 0xB))return puts(Permission denied!);比较buf缓冲区输入的字符和OpenTheDoor的前11个字节如果相等为0后面进入后门函数backdoor() -------第三种方法最简单如果不等为非0输出“Permission denied!结束函数退出第一种方法找返回地址的偏移0x400x872backdoor0x40127Dret0x401296用来对齐payloadbA * 72 p64(0x401296) p64(0x40127D)第二种方法与第一种方法相同但是重新计算偏移地址0x200x840payloadbA * 40 p64(0x401296) p64(0x40127D)secret()里面的strncmp比较 不影响栈溢出的实现第三种方法最简单输入1337进入secret(),像缓冲区输入OpenTheDoor比较相等进入后门函数执行本地实现远程先nc再同上。最后得到flagflag{9d756719-bc0d-4703-942e-1cb2942941cb}