【CSAPP】-binarybomb實驗

目錄

實驗目的與要求

實驗原理與內容

實驗設備與軟件環境

實驗過程與結果(可貼圖)

操作異常問題與解決方案

實驗總結


實驗目的與要求

1. 增強學生對于程序的機器級表示、匯編語言、調試器和逆向工程等方面原理與技能的掌握。
2. 掌握使用gdb調試器和objdump來反匯編炸彈的可執行文件,并單步跟蹤調試每一階段的機器代碼,從中理解每一匯編語言代碼的行為或作用,進而設法“推斷”出拆除炸彈所需的目標字符串。
3. 需要拆除盡可能多的炸彈。

實驗原理與內容

一個“binary bombs”(二進制炸彈,下文將簡稱為炸彈)是一個Linux可執行C程序,包含了7個階段(phase1~phase6和一個隱藏階段)。炸彈運行的每個階段要求學生輸入一個特定的字符串,若的輸入符合程序預期的輸入,該階段的炸彈就被“拆除”,否則炸彈“爆炸”并打印輸出 "BOOM!!!"字樣。實驗的目標是拆除盡可能多的炸彈層次。
每個炸彈階段考察了機器級語言程序的一個不同方面,難度逐級遞增:
階段1:字符串比較
階段2:for循環
階段3:switch分支
階段4:遞歸函數
階段5:數組元素按序訪問
階段6:鏈表
隱藏階段:只有在階段4的拆解字符串后再附加一特定字符串后才會出現(作為最后一個階段)
為了完成二進制炸彈拆除任務,需要使用gdb調試器和objdump來反匯編炸彈的可執行文件,并單步跟蹤調試每一階段的機器代碼,從中理解每一匯編語言代碼的行為或作用,進而設法“推斷”出拆除炸彈所需的目標字符串。這可能需要在每一階段的開始代碼前和引爆炸彈的函數前設置斷點,以便于調試。
拆彈密碼的輸入分文兩種模式。
模式1:正常手動輸入,每次程序運行到某一階段會停下來要求用戶輸入數據。這種方式比較原始,不推薦使用。如果使用這種做法,在程序調試到后期時,每次為了進入后期的斷點位置都需要在之前的每一個階段進行手動輸入,極其浪費時間。
模式2:采用輸入重定向。首先將答案文本寫至一個.txt文本中,每個階段的拆彈密碼占一行。


實驗設備與軟件環境

1.Linux操作系統—64位 Ubuntu 18.04
2. C編譯環境(gcc)
3. 計算機

實驗過程與結果(可貼圖)


在Linux中,以下是幾個常見的命令:

"cd"命令用于更改當前工作目錄。通過輸入"cd"命令,然后加上要更改到的目錄路徑,就可以進入該目錄。

"ls"命令用于列出目錄中的文件和子目錄。如果不指定參數,它將顯示當前目錄中的所有文件和子目錄。

"vi"命令是一種文本編輯器,用于創建和編輯文本文件。它允許用戶以不同的模式瀏覽和編輯文件,包括插入模式、命令行模式和普通模式。

"cat"命令可以用于查看文件內容。它將打印文件的內容到終端上。

"objdump"是一個強大的調試工具,它可以用于分析可執行文件和目標文件的二進制代碼。objdump可以顯示程序的匯編代碼、符號表、重定位表等信息,幫助開發人員進行調試和優化。

objdump的語法如下:

objdump [選項] 文件名
其中,文件名參數可以是可執行文件、目標文件或共享庫文件。常用的選項包括:

-d 顯示匯編代碼
-t 顯示符號表
-r 顯示重定位表
-S 顯示源代碼和匯編代碼
例如,要顯示可執行文件"hello"的匯編代碼,可以使用以下命令:

objdump -d hello

本次實驗主要是要學會運用gdb調式器來查看匯編代碼和寄存器。

常用的指令:

break (b)設置斷點,接函數名或者*地址

x 查看地址中的數據,后面可以接/c(數據為字符串),/d(數據為數字)
也可以直接x/s
disas 查看當前函數的匯編代碼

i r 查看寄存器的值

stepi n 運行n步(會進入別的函數)

nexti n 運行n部(跳過別的函數,只在當前函數)

phase_1

首先gdb啟動bomb

這時候再使用run指令,讓bomb跑起來

這個時候我們就到了第一階段的答題部分
輸入正確的答案就會提示闖關成功
是否進入下一關
否則就會使炸彈爆炸,顯示bomb字樣

我們可以知道,第一關是讓我們輸入一個特定的字符串
如果字符串的某個字符和比較的字符串不相等,都會引發炸彈爆炸
這個時候我們可以disas phase_1
查看一階段的匯編代碼

首先給了8個字節的空間給rsp
然后加載了一個字符串使得與輸入的字符串進行比較

這個時候我們可以先看一下這個圈中的地址里面的字符串
這是我們要比較的字符串

我們可以看到,這個顯示的字符串會和我們輸入的字符串進行比較
那么也就是說
只要我們輸入的字符串是這個字符串
就會闖關成功
??? 我們來試試看


輸入run使得bomb運行


輸入剛剛我們查看到的指令
And they have no disregard for human life.


可以看到,

也就是說我們第一關已經通過了

Phase_2

來到第二關,第二關是一個for循環的關卡
在解答之前
我們可以把上一關的答案放到一個文本文件中,可以新建也可以放在自己有的空白文本文件中。

這樣做的好處是我們不用每一關都手動輸入前面關卡的答案
只需要運行這個文本文件就可以直接解答下一關。

我們先看一下這個循環的匯編代碼
在這之前
我們可以先打上一個斷點,這樣即使我們的答案有誤
炸彈也不會被引爆


第一個圈是提供這個程序所需的空間,fs是一個防止棧溢出的操作

這個關卡讓我們輸入六個數字,我們可以看到,我們的第一位會和一
進行比較
如果不相等,就會引發45行的bomb指令,發生爆炸
所以我們基本可以確定,第一個數字是1

再往下看63行,這里是將eax的值再加上一個eax也就是
說eax的值乘以兩倍
在六次循環里,eax每次都會以它的二倍進行儲值

到了這一步,我們基本可以確定
六個數字分別為
1 2 4 8 16 32

運行一下我們剛剛保存的文本文件,看看答案是否正確


通過顯示的字符
我們可以確定
答案是正確的

Phase_3


第三關是一個switch循環

我們把上一關的斷點刪除,用delete指令
然后重新打上斷點


我們輸入的第一個字符
會和0-7進行判斷
如果大于7
那么就會引發炸彈
所以我們可以確定這個switch循環有7或8個case語句

再往下看,可以看到有很多的mov和cmpl指令
我這里選擇的是0x6f和0x150

既然我們有7個case語句
我這里用0進入查看case0是否是答案之一


我們用x/s查看這個地址要我們輸入什么
一個整形,一個字符,一個整形
我們可以確定第一個整形是0
第二個應該是0x6f
第三個是0x150

我們用p指令將它們換算成相對應的值

到這里,我們可以知道第三位是336,
那么第二位這個字符是什么呢
這個時候我們借助ascll表進行查看
可以看到111對應的是英語字母o
我們試著輸入一下看看


0 o 336

可以看到顯示闖關成功
那么為了驗證我們的思路沒有問題
我們試著將case1也進行解答


那么case1對應的就是下一段mov和cmpl
0x77和0x12d

119對應的是w


由此我們可以斷定
解題思路是正確的
將答案寫入文本文件中。

Phase_4


先給b打上斷點,然后disas查看匯編代碼

可以看到四階段有重復調用自身代碼的操作,基本可以判斷是
遞歸函數

Mov 0xe
16進制中e是14
也就是說第一位答案應該是在0-14之間

我們接著看一下
0x555555556aaf
里面的要求

要求我們輸入兩個整形
第一個可以確定為0-14
第二個我們可以看

Eax是第一個值存儲在一個臨時變量里面
Rsp此時存的是我們輸入的第二個值
當這個值不等于0x23
也就是16x2+3時
就會發生爆炸

這個時候我們只需要進行不斷的輸入判斷
就可以知道正確答案


這里1不是我們的正確答案
那么經過我們的逐個判斷
最后確定8 35
是正確答案


將答案保存在文本文件中之后。
關閉terminal
關閉虛擬機。


操作異常問題與解決方案


實驗總結


通過這次實驗,我初步了解了可以通過反匯編指令獲得反匯編代碼。在本次拆彈實驗,對于匯編代碼的查看可以先找到炸彈語句,反推出避免爆炸條件。可以根據函數名初步確定函數功能,再到具體代碼進行詳細分析。根據輸入函數的格式可以初步確定思路內容方向。由跳轉表語句或者數組語句可確定相關結構方向。內存數據可以通過gdb查看。Gdb還可查看跳轉表,數組,鏈表等相關結構。可靈活運用gdb的斷點調試功能確定猜測以及函數功能。了解了匯編代碼在實際一個小工程的運行流程。進一步加深了相關知識點的理解。如內存數據的存取,函數的調用,參數寄存器的設置,棧幀中關于寄存器的保護、臨時變量、數組創建的實現的理解。同時也加深了關于gdb工具的學習使用,受益良多。


學習是循序漸進的,生活中有許多未知的事情等著我們去探索,這個bomb實驗還是挺好玩的,做了一個就想會第二個,學習就是如此,加油吧!騷年!

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

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

相關文章

Python學習篇:PyCharm的基本使用教程(二)

目錄 1 前言 2 創建Python項目 3 創建Python文件 4 編寫 Hello World 并運行 5 PyCharm界面簡介 1 前言 PyCharm的使用貫穿整個Python的學習,所以單獨拿出來出教程不合適,說多了對于新手來說也還是不明白,這里我們先從學習開始前大家需…

【基礎算法總結】分治—快排

分治—快排 1.分治2.顏色分類3.排序數組4.數組中的第K個最大元素5.庫存管理 III 點贊👍👍收藏🌟🌟關注💖💖 你的支持是對我最大的鼓勵,我們一起努力吧!😃😃 1.分治 分治…

搜狐新聞HarmonyOS版本 push 推送開發

背景 搜狐新聞作為HarmonyOS的合作伙伴,于2023年12月成功上架鴻蒙單框架應用市場,成為首批鴻蒙應用矩陣的一員。 新聞類推送作為應用的重要組成部分,在二期規劃中,我們將推送功能列為核心功能模塊。本文將推送集成過程中的步驟和…

JAVA婦產科專科電子病歷系統源碼,前端框架:Vue,ElementUI

JAVA婦產科專科電子病歷系統源碼,前端框架:Vue,ElementUI孕產婦健康管理信息管理系統是一種將孕產婦健康管理信息進行集中管理和存儲的系統。通過建立該系統,有助于提高孕產婦健康管理的效率和質量,減少醫療事故發生的…

新華三通用大模型算力底座方案:為AI時代注入強大動力

在人工智能技術日新月異的今天,大模型作為推動AI進步的重要驅動力,是百行百業不斷追逐的熱點。大模型以其強大的泛化能力、卓越的模型效果和廣泛的應用場景,正改變著人工智能的未來。作為國內領先的ICT解決方案提供商,新華三集團憑…

Linux kfence使用與實現原理

0 背景 為了更好的檢測linux kernel中內存out-of-bounds、mem-corruption、use-after-free、invaild-free等問題,調研了kfence功能(該功能在linux kernel 5.12引入),幫助研發更好的分析與定位這類內存錯誤的問題。 一、kfence介…

【ES】--Elasticsearch的Nested類型介紹

目錄 一、問題現象二、普通數組類型1、為什么普通數組類型匹配不準?三、nested類型四、nested類型查詢操作1、只根據nested對象內部數組條件查詢2、只根據nested對象外部條件查詢3、根據nested對象內部及外部條件查詢4、向nested對象數組追加新數據5、刪除nested對象數組某一個…

2025中國淄博化工展|淄博化工技術展|淄博化工裝備展

CTEE2025第九屆中國(淄博)化工技術裝備展覽會 時間:2025年5月16-18日 地點:山東淄博國際會展中心 主辦單位:山東省機械工業科學技術協會 青島藍博國際會展有限公司 眾所周知,山東省是我國化工大省。2023年上半年&am…

Go GMP:并發編程實踐

💝💝💝歡迎蒞臨我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:「stormsha的主頁」…

0053__CancelIO的作用:防止為發送的數據丟失

CancelIO的作用:防止為發送的數據丟失-CSDN博客 cancelIoEx 函數 (ioapiset.h) - Win32 apps | Microsoft Learn

【Java】Logbook優化接口調用日志輸出,優雅!

logbook 簡介 很多人可能沒有接觸過 logbook,但它的確是一個很好用的日志框架。引用官網的介紹 Logbook 是一個可擴展的 Java 庫,可以為不同的客戶端和服務器端技術啟用完整的請求和響應日志記錄。它通過以下方式滿足了特殊需求: 允許 Web 應…

計算機網絡期末復習4(武夷學院版)

第四章 網絡層 1、網際協議IP以及配套協議(書P119) 網際協議(IP):IP協議是網絡層的核心協議,負責數據包的編址和路由。它定義了數據包的格式和處理規則。 配套協議:地址解析協議ARP&#xf…

【工具】VS Code使用global插件實現代碼跳轉

🐚作者簡介:花神廟碼農(專注于Linux、WLAN、TCP/IP、Python等技術方向)🐳博客主頁:花神廟碼農 ,地址:https://blog.csdn.net/qxhgd🌐系列專欄:善假于物&#…

粵港聯動,北斗高質量國際化發展的重要機遇

今年是香港回歸27周年,也是《粵港澳大灣區發展規劃綱要》公布5周年,5年來各項政策、平臺不斷為粵港聯動增添新動能。“十四五”時期的粵港澳大灣區,被國家賦予了更重大的使命,國家“十四五”《規劃綱要》提出,以京津冀…

時序約束(二): input delay約束和output delay約束

一、input delay約束 在千兆以太網數據收發項目中,RGMII的數據輸入方式為DDR,源同步輸入方式,可以用之前提到的分析模型進行約束。 在時序約束原理中我們提到,input delay約束的就是發射沿lunch到數據有效的延時,根據…

Vue 3中 <script setup> 與生命周期鉤子函數的詳細解析

Vue 3中 <script setup> 與生命周期鉤子函數的詳細解析 Vue 3 引入了 <script setup> 語法糖&#xff0c;這是一種簡化和集成組件邏輯的新方式。盡管 <script setup> 簡化了組件的編寫&#xff0c;但仍然可以利用 Vue 提供的生命周期鉤子函數來管理組件的生…

【光伏開發】光伏項目開發流程

光伏項目作為可再生能源領域的重要組成部分&#xff0c;其開發過程涉及多個環節&#xff0c;從項目初期的可行性研究到后期的運營維護&#xff0c;每一步都至關重要。本文將按照項目確認、前期階段、中期階段、后期階段的順序&#xff0c;詳細介紹光伏項目的開發流程。 一、項…

Rust 基礎教程

Rust 編程語言教程 Rust是一門注重安全、并發和性能的系統編程語言。本文將從Rust的基本語法、常用功能到高級特性&#xff0c;詳細介紹Rust的使用方法。 目錄 簡介環境配置基礎語法 變量和常量數據類型函數控制流 所有權和借用 所有權借用 結構體和枚舉 結構體枚舉 模塊和包…

一文搞懂 java 線程池:基礎知識

你好&#xff0c;我是 shengjk1&#xff0c;多年大廠經驗&#xff0c;努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注&#xff01;你會有如下收益&#xff1a; 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么&#xff0c;評論或者私信告訴我&#xff01; 文章目錄 …

Linux:網絡基礎1

文章目錄 前言1. 協議1.1 為什么要有協議&#xff1f;1.2 什么是協議&#xff1f; 2. 網絡2.1 網絡通信的問題2.2 網絡的解決方案——網絡的層狀結構2.3 網絡和系統的關系2.4 網絡傳輸基本流程2.5 簡單理解IP地址2.6 跨網絡傳輸 總結 前言 在早期的計算機發展中&#xff0c;一開…