用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...