2016-01-30 77 views
0

我試圖誘導故障在特定的彙編指令運行過程中的故障。我能夠更改說明,但我不確定如何可靠地創建故障。創建彙編指令以儘可能少的字節儘可能

我想,以確保其他指令保持不變,並執行特定的指令時,過程只崩潰。因此,如果可能的話,我需要用1或2個字節的組件創建故障。如果原始說明較大,我可以用NOP填充它。

例如:我怎樣才能改變這2個字節,所以執行時就會死機。

7f a9  | jg 

我想過將操作碼設置爲任意值,但我不確定這實際上是否工作。

任何指針是極大的讚賞! 謝謝,佩德羅!

+4

這是什麼架構?對於x86,請嘗試「HLT」,「0xf4」。這是一條特權指令,當由非特權代碼執行時會導致GPF。 –

+3

0xcc只需要一個字節。 –

+1

您不需要使用NOP進行填充。如果用錯誤insn替換第一個字節,它將會出錯。如果它後字節解碼廢話,這並不重要,因爲他們不會在所有被執行(或者,如果你寫一個調試器,直到你把復出後的原始字節和SIGILL或SIGTRAP返回。) –

回答

3

的最短路程,在大多數情況下是使用

CCh int 3 

爲一個字節的操作碼觸發調試異常。

如果你正在尋找一個崩潰的用戶應用程序的另一種簡單,耐調試,這樣,你總是可以使用它僅適用於CPL0又名內核模式,如特權指令

0f 08 invd (invalidate internal caches) 
    f4 hlt (enter Halt state) 
0f 0b ud2 (invalid opcode) 

而且在大多數情況下非常有效和CPL0也正在被跳轉到一些隨機地址有兩個一個字節的操作碼狀

50  push eax 
c3  ret 

當然,還有其他的可能性。只是因爲它比程序更容易崩潰:)

編輯:包括HLT,UD2由於建議在評論。在每種情況下,例如CLISTI都不會#GP。 IOPL = CPL = 3。

+1

注意在Unix系統中,'INT3'通常會產生'SIGTRAP'而不是'SIGSEGV',這可能是也可能不是想要的。 –

+0

'cli' /'sti' /'hlt'是單字節,而不是隨機地址使用'NULL'指針。 – Jester

+1

@Jester:是的,我想過包括CLI。關於NULL-ptr:我嘗試用兩個字節編碼NULL-ptr-memory訪問,但失敗了。有什麼建議麼? – zx485