用GDB工具詳細分析SSD4 Exercise 1

2021-05-10 06:15:42 字數 3131 閱讀 2192

用gdb工具

詳細分析

ssd4 exercise 1

此次試驗的目的是利用

gdb除錯工具除錯一段程式(此程式要求正確輸入四個引數

key1

,key2,key3,key4

從而輸出正確的資訊)來猜想

key1

,key2,key3,key4.

先用引數

1 2 3 4

試探性的執行程式。

先看看process_keys12(&key1, &key2)

函式,函式引數

key1

的值等於主函式裡

key1

的位址。

key1

所指向的值為主函式裡

key1

的值(第乙個密碼引數)。顯然,這是乙個更改某個記憶體的語句。該記憶體以主函式裡

key1

的位址為基準,偏移量為

key1

,即為位址(

&key1 key1

)。對該位址賦值,其值為主函式裡

key2

的值(第二個密碼引數)。

所以,函式

process_keys12(*key1,*key2)

用來修改某些位址所存放的值。

由start = (int)(*(((char *) &dummy)));

stride = (int)(*(((char *) &dummy) + 1));

可知extract_message1

呼叫的兩個引數

start

,stride

是dummy

的第乙個位元組和第二個位元組。看上去跟

key1,key2

沒關係,由此推想呼叫函式

process_keys12(&key1, &key2)

改變了dummy

的值從而改變

start

和stride

的值。那麼

key1

和dummy

的位址偏移量就是

key1

的值。dummy

改變後的值就是

key2

的值。用

gdb檢視

key1

,和dummy

的位址如下:

位址相差1個

int,因此猜想key1=1

然後看extract_message1

的**:

char * extract_message1(int start, int stride)

message[i] = *(((char *) data) + j);}}

message[i] = '/0';

return message;

}start

控制data

中的起始位置,

stride

控制一次連續存入

message

內的個數。

再看data

裡放的值:

而題目提示

message

開頭是from:

由上面data

值可知可能從

10個字元開始,但由於內層迴圈取出

stride-1

個字元後會跳過乙個字元(兩次

j++)所以start=9,stride=3

由此求出

dummy

的值為777

(0000001100001001

),即key2=777.

key=1,key2=777

代入程式執行入選:

說明key1

,key2

的值正確

下面接key3,key4

的值:看下面**,

process_keys34

被呼叫了兩次,為什麼呼叫兩次呢?

我們先把兩次

process_key34

和extract_message1

隱藏掉,看執行結果:

得出了正確結果。這說明兩次

process_key34

的執行根本沒有改變

start

和stride

的值,也就是說

start=9

,stride=3

可以使函式

extract_message2

得到正確的結果。

於是我們猜想第一次

process_key34

的呼叫改變了函式返回位址,使得程式跳過了**段:

msg1 = extract_message1(start, stride);

if (*msg1 == '/0') {

process_keys34(&key3, &key4);

而直接執行了

extract_message2

,因此process_key34

將函式的返回位址改變成了第二個

process_key34

的下一條指令的位址。

由process_key34

的**可知

key3

為key3

和process_key34

的返回位址在棧裡的位址差值

.在執行

process_key34

第一條指令之前,用

x/20 $esp

檢視棧的內容:

由上圖可知原本的返回位址為

0x080486c8

在棧裡儲存位址與

key3

差值為-1

,因此key3=-1;

用下圖可知第二個

process_key34

的下一條指令位址如下:

位址為0x080486f9

;因此差值為

0x080486f9-0x080486c8=49

;於是key4=49;

將key1=1

,key2=777 key3=-1,key4=49

代入程式執行結果如下:

結果正確。

因此key1=1,key2=777,key3=-1,key4=49.

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

約數詳細分析

約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...

vue cli 詳細分析

vue lic 是 vue 官方提供的腳手架工具,預設搭建好乙個專案的基本架子,我們只需要在此基礎上進行相應的修改即可。注意 安裝 vue cli 前需要事先配置好 node 環境 npm install g vue cli 如果是 mac 電 sudo表示以管理員的許可權 sudo install...