尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CTF Pwn模块系列分享:ROP链构造,没有后门也能拿shell

CTF Pwn模块系列分享:ROP链构造,没有后门也能拿shell CTF Pwn模块系列分享ROP链构造没有后门也能拿shell上期我们用ret2text实战搞定了基础栈溢出有朋友问“如果程序里没有backdoor这种现成的后门函数该怎么利用栈溢出呢”这就是今天要解决的核心问题今天咱们进入Pwn栈溢出的进阶环节——ROP链构造Return-Oriented Programming返回导向编程。这是CTF Pwn中最核心的进阶技巧之一核心逻辑是没有后门就自己拼后门——利用程序代码段中现成的小指令片段gadget拼接成我们需要的功能比如执行system(“/bin/sh”)。一、先拆解为什么需要ROPROP的核心逻辑是什么先回顾上一期的ret2text我们是把返回地址改成了程序自带的backdoor函数地址直接调用后门拿shell。但在真实CTF题目中程序几乎不会有这么明显的后门——这时候就需要ROP登场了。为什么需要ROP两个核心原因 ① 程序没有现成的后门函数比如没有调用system(“/bin/sh”)的函数 ② 栈保护机制比如NX栈不可执行——即使我们把shellcode写到栈里也无法执行后续会讲新手先记住ROP可以避开NX保护。ROP的核心逻辑用“现成指令片段”拼功能用大白话拆解ROP通俗例子ROP就像“拼积木”——程序代码段里有很多现成的“积木块”gadget我们不需要自己造积木只要把这些积木按顺序拼起来就能搭出“后门”这个成品。关键前提x86_64函数调用约定再强调一次构造ROP链的核心是“正确传递函数参数”还记得上一期讲的x86_64函数调用约定吗再复习一次必须记住函数的第1个参数 → rdi寄存器函数的第2个参数 → rsi寄存器函数的第3个参数 → rdx寄存器 …所以要调用system(“/bin/sh”)我们需要先把“/bin/sh”的地址放到rdi寄存器里再调用system函数。今天的实战目标构造ROP链完成两个操作——① 把“/bin/sh”的地址传入rdi② 调用system函数 → 最终拿到shell。二、实战准备环境工具漏洞程序我们用“无后门、有system函数”的漏洞程序实战和CTF比赛中的进阶栈溢题逻辑一致先准备好这些环境延续之前的Ubuntu 20.04GDBpwntoolsIDAROPgadget新增工具ROPgadget专门找gadget的神器终端直接安装sudo apt install -y ropgadget编写漏洞程序保存为pwn2.c关键说明程序没有backdoor函数但链接了libc库默认链接所以有system函数libc库中的函数我们的目标通过ROP链调用libc中的system函数并传入“/bin/sh”参数拿到shell。编译程序关闭栈保护开启NX保护——模拟真实题目终端执行命令复制直接用gcc -g -fno-stack-protector -no-pie -o pwn2 pwn2.c参数解释去掉了“-z execstack”默认开启NX保护栈不可执行迫使我们用ROP保留“-fno-stack-protector -no-pie”关闭栈保护和地址随机化新手先避开干扰。三、实战步骤手把手教你构造ROP链拿shell整个解题流程分5步找漏洞→算溢出偏移→找关键gadget→找system地址和/bin/sh地址→构造ROP链攻击一步都不能少第一步找漏洞算溢出偏移和上一期完全一样用IDA分析程序vulnerable_function调用了gets函数确认存在栈溢出用GDBcyclic算偏移方法和上一期完全一致最终算出偏移还是24因为buf大小还是16字节栈帧结构相同。小提醒如果偏移算错后续全白费不确定的话再重新算一次第二步找关键gadget核心用ROPgadget我们需要的核心gadget是“能把参数传入rdi寄存器的gadget”——因为调用system函数需要把“/bin/sh”的地址放到rdi里。用ROPgadget找gadget终端执行命令ROPgadget --binary pwn2 --only “pop|ret”命令解释 - --binary pwn2指定要分析的程序 - --only “pop|ret”只显示包含pop指令和ret指令的gadget我们需要的是“pop 寄存器; ret”格式的gadget。执行后会找到类似这样的gadget0x00000000004011c3 : pop rdi ; ret这就是我们需要的核心gadget记下来这个地址比如0x4011c3每个人的地址可能一样以自己的输出为准。功能执行“pop rdi”把栈顶的数据弹出到rdi寄存器然后执行“ret”跳转到下一个地址。第三步找system函数地址和/bin/sh字符串地址要调用system(“/bin/sh”)需要两个关键地址system函数的地址、“/bin/sh”字符串的地址这两个都在libc库中。找system函数地址用IDA打开IDA把pwn2拖进去等待分析完成按“ShiftF12”打开“Strings window”字符串窗口在搜索框输入“system”找到“system”字符串双击“system”字符串跳转到对应的反汇编代码顶部显示的地址就是system函数的地址比如0x401060以自己IDA显示的为准记下来找/bin/sh字符串地址用ROPgadget终端执行命令ROPgadget --binary pwn2 --string “/bin/sh”执行后会输出“/bin/sh”字符串的地址比如0x402008以自己的输出为准记下来小技巧如果ROPgadget没找到也可以用IDA的“ShiftF12”搜索“/bin/sh”字符串找到对应的地址。第四步构造ROP链核心按顺序拼接结合x86_64函数调用约定和栈溢出原理ROP链的结构如下x86_64架构每个地址占8字节ROP链 垃圾数据偏移字节数 pop rdi; ret gadget地址 /bin/sh字符串地址 system函数地址链的执行逻辑关键一定要懂程序执行到ret时先跳转到“pop rdi; ret” gadget执行“pop rdi”把栈顶的“/bin/sh字符串地址”弹出到rdi寄存器完成参数传递执行“ret”跳转到栈下一个地址——system函数地址调用system函数此时rdi寄存器里是“/bin/sh”的地址所以会执行system(“/bin/sh”)拿到shell结合我们的实战数据假设偏移24、gadget地址0x4011c3、/bin/sh地址0x402008、system地址0x401060用Python构造第五步发送ROP链拿到shell和上一期一样有两种方式发送新手先学第一种方式1GDB中测试确认ROP链有效启动GDBgdb ./pwn2输入r rop_payload把ROP链作为输入发送程序执行后出现“$”提示符——成功拿到shell输入cat flag即可获取Flag。方式2pwntools脚本自动化攻击比赛常用编写完整exp脚本保存为rop_exp.py终端执行脚本python3 rop_exp.py直接拿到shell四、这6个问题最容易卡壳gadget找错一定要找“pop rdi; ret”格式的少了ret不行如果没找到检查程序是否编译正确或换用IDA找gadget。地址填错system地址、/bin/sh地址、gadget地址一定要用自己程序的不能直接抄我的。ROP链顺序错必须是“gadget地址 → 参数 → 函数地址”顺序颠倒会导致执行失败。没加p64所有地址都要用p64转成64位小端字节序直接写字符串地址会失败。偏移算错偏移错了会覆盖不到返回地址重新用cyclic确认偏移。程序有PIE保护如果编译时没加“-no-pie”地址会随机化导致ROP链失效——新手先关闭PIE练手。最后网络安全需要学习那些知识网络安全零基础入门学习路线规划初级1、网络安全理论知识2天①了解行业相关背景前景确定发展方向。②学习网络安全相关法律法规。③网络安全运营的概念。④等保简介、等保规定、流程和规范。非常重要2、渗透测试基础一周①渗透测试的流程、分类、标准②信息收集技术主动/被动信息搜集、Nmap工具、Google Hacking③漏洞扫描、漏洞利用、原理利用方法、工具MSF、绕过IDS和反病毒侦察④主机攻防演练MS17-010、MS08-067、MS10-046、MS12-20等3、操作系统基础一周①Windows系统常见功能和命令②Kali Linux系统常见功能和命令③操作系统安全系统入侵排查/系统加固基础4、计算机网络基础一周①计算机网络基础、协议和架构②网络通信原理、OSI模型、数据转发流程③常见协议解析HTTP、TCP/IP、ARP等④网络攻击技术与网络安全防御技术⑤Web漏洞原理与防御主动/被动攻击、DDOS攻击、CVE漏洞复现5、数据库基础操作2天①数据库基础②SQL语言基础③数据库安全加固6、Web渗透1周①HTML、CSS和JavaScript简介②OWASP Top10③Web漏洞扫描工具④Web渗透工具Nmap、BurpSuite、SQLMap、其他菜刀、漏扫等恭喜你如果学到这里你基本可以从事一份网络安全相关的工作比如渗透测试、Web 渗透、安全服务、安全分析等岗位如果等保模块学的好还可以从事等保工程师。薪资区间6k-15k到此为止大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗想要入坑黑客网络安全的朋友给大家准备了一份282G全网最全的网络安全资料包免费领取7、脚本编程初级/中级/高级在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中面对复杂多变的网络环境当常用工具不能满足实际需求的时候往往需要对现有工具进行扩展或者编写符合我们要求的工具、自动化脚本这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中想要高效地使用自制的脚本工具来实现各种目的更是需要拥有编程能力.零基础入门建议选择脚本语言Python/PHP/Go/Java中的一种对常用库进行编程学习 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP IDE强烈推荐Sublime ·Python编程学习学习内容包含语法、正则、文件、 网络、多线程等常用库推荐《Python核心编程》不要看完 ·用Python编写漏洞的exp,然后写一个简单的网络爬虫 ·PHP基本语法学习并书写一个简单的博客系统 熟悉MVC架构并试着学习一个PHP框架或者Python框架 (可选) ·了解Bootstrap的布局或者CSS。8、超级黑客这部分内容对零基础的同学来说还比较遥远就不展开细说了贴一个大概的路线。网络安全工程师企业级学习路线视频配套资料国内外网安书籍、文档工具当然除了有配套的视频同时也为大家整理了各种文档和书籍资料工具并且已经帮大家分好类了。一些我自己买的、其他平台白嫖不到的视频教程要学习网安其实不难难的是坚持和相信自己我的经验是既然已经选定网安你就要相信它相信它能成为你日后进阶的高效渠道这样自己才会更有信念去学习才能在碰到困难的时候坚持下去。机会属于有准备的人这是一个实力的时代。人和人之间的差距不在于智商而在于如何利用业余时间只要你想学习什么时候开始都不晚不要担心这担心那你只需努力剩下的交给时间这份完整版的学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表