深入理解File descriptor(附pwnable-fd解題步驟)

0x01 前言

首先我們先普及一下什麼是File descriptor?

維基百科中說:is an abstract indicator (handle) used to access a file or other input/output resource
一個文件或其他輸入/輸出資源的抽象指示符
imge

在操作系統中可以這樣去理解:

在這裏插入圖片描述
進程(數值+指針)->系統(文件表中一系列操作)->引節點表(描述文件系統對象)
那麼進程中的file descriptor的這個數值其實就是 is an abstract indicator (handle) used to access a file or other input/output resource 然後他是指向相應的file table

0x02 走進File descriptor

我們來看

在這裏插入圖片描述
四個file descriptor的值會以此增加,他們只想不同的操作
那麼爲什麼從3開始?是不是巧合?012去哪呢?
在證明0、1、2的去向之前,我們先看一下file descriptor值的分配規則:
在這裏插入圖片描述
fd0與fd1從3開始依次遞增,我們剛纔的第二個問題就不是巧合,然後我們把fd0的句柄close掉,也就說剛纔的3關閉了,重新開始一個fd2,發現fd2的值爲3,而不是5,也就是佔用了剛纔關閉的fd0的值

我們就不妨這麼猜測,如下圖


假如繼續fd3=open,那麼fd3值爲5,也就是在紅色區域
那麼我們可以初步得出一個結論,分配原則:尋找沒有被佔用的最低的值,然後去佔用
那麼我們證實我們的結論和探尋0、1、2在哪?
其實
在這裏插入圖片描述

那麼,我們關閉stdin標準輸入來看下會發生什麼?

在這裏插入圖片描述
運行fd後直接輸入數值,兩次不一樣,也就是標準輸入被關閉,in自動填充一個隨機值
繼續關閉stdout
在這裏插入圖片描述
輸入hello後,沒有執行printf輸出函數,然後我們將stdout關閉調,新開一個fd,按照我們之前的推斷那麼fd值應該爲1
在這裏插入圖片描述

0x03 pwnable-fd

把結論進行驗證,使得對file descriptor更深刻了,我們來做一下pwnable的fd題目鞏固一下:

ssh連上後,cat fd.c
在這裏插入圖片描述
在這裏插入圖片描述
只需要讓buf的值爲 LETMEWIN 即可cat flag,buf的是read()函數從fd中獲取的,fd又是atoi(argv[1]) - 0x1234得來的,可以控制。
那麼根據我們剛纔學習的file descriptor的知識,只需要讓fd爲0,那麼buf的值就是可以通過輸入控制的,計算可以知道argv[1]的值4660
在這裏插入圖片描述
雖然flag得到了,爲了學習pwn,練習寫一下exp
在這裏插入圖片描述
在這裏插入圖片描述

0x04 尾記

想學習二進制的pwn弟弟還需要努力,希望我的小白學習經驗記錄下來可以幫助更多和我一樣的小白。

另見:http://bey0nd.xyz/2020/02/07/1/

發佈了6 篇原創文章 · 獲贊 9 · 訪問量 8353
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章