我正在從安全角度學習 lldb。我正在嘗試在下面的示例代碼中執行緩沖區溢位。
#include<stdio.h>
void return_input(void) {
char array[30];
gets(array);
printf("%s\n", array);
}
int main(){
return_input();
return 0
}
gets 函式是這里的目標。
在 lldb 控制臺中,我需要輸入將覆寫return地址的長字串。如果我嘗試像 (lldb) AAAAAAA\x01\x02 這樣的字串,它們將被視為單個字符而不是十六進制值。
如何在 LLDB 會話中傳入十六進制值作為輸入?基本上,我試圖覆寫記憶體。
還有其他答案,我們將字串作為引數傳遞,但我想在會話中自己鍵入資料。
更新 lldb 會話。

在下圖中,您可以看到十六進制實際上已轉換為字串

謝謝。
uj5u.com熱心網友回復:
您正試圖通過gets()將任意位元組輸入到您的變數中array。這不是直接的和部分不可能的,因為標準輸入流gets()通常不會采用所有代碼并過濾一些代碼。
例如,如果您想要輸入中的位元組 0x0D(或 0x0A,取決于您的終端),您可以嘗試鍵入Enter. 但是這個鍵會被過濾掉,gets()因為它認為你已經完成了你的輸入。
您可以通過組合種類繁多的代碼,Ctrl并A以Z變音符號或者字符或重音符號。但是很難準確地獲得您想要的代碼序列。
你可以試試這個:在文本編輯器中準備一個類似于你的十六進制位元組的字符序列。在gets()需要輸入時將它們復制到控制臺中。
要查看哪個字符產生什么代碼,請考慮撰寫一個小實驗程式來呼叫gets()并列印接收到的代碼:
#include <stdio.h>
int main(void) {
char line[30];
gets(line);
for (int i = 0; i < sizeof line; i) {
printf("%d: %X\n", i, line[i]);
}
return 0;
}
注意:請采用代碼風格并堅持下去。您的來源根本沒有縮進。
uj5u.com熱心網友回復:
嗯,十六進制只是意味著你如何表示某事。通過輸入 ascii 字符,您已經在撰寫十六進制,而不是您想要的十六進制。如果您輸入 \x01 ascii,您實際上輸入了 0x5C 0x78 0x31 0x32 (由我發現的第一個 ascii 表之一提供)。
你應該做相反的程序。如果要鍵入 0x01 0x2,則必須輸入 SOX 和 STX 符號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/338288.html
上一篇:如何在JSON模式中定義嵌套陣列,其中陣列項的基本型別是特定型別
下一篇:前端安全-是否可以限制訪問范圍?
