2016-09-16 83 views
2

我從一個簡單的混淆C程序中獲得了以下ASM代碼作爲一個賦值。在ELF二進制文件中修改asm指令

0x00000000004006a0 <+147>: lea -0x20(%rbp),%rax 
    0x00000000004006a4 <+151>: mov %rdx,%rsi 
    0x00000000004006a7 <+154>: mov %rax,%rdi 
    0x00000000004006aa <+157>: callq 0x400713 <SECRET> <====== 
    0x00000000004006af <+162>: movl $0x0,-0x24(%rbp) 
    0x00000000004006b6 <+169>: jmp 0x4006d8 <main+203> 
    0x00000000004006b8 <+171>: mov -0x24(%rbp),%eax 

目標是找到並刪除導致分段錯誤的函數(修補程序二進制文件)。我找到了導致段錯誤的函數,但我不知道如何修補二進制文件。

我的問題是如何修補

0x00000000004006aa <+157>: callq 0x400713 <SECRET> 

,這樣我不會稱之爲保密功能。

如果我使用gdb通過在運行時單步調試程序計數器來跳過/跳轉SECRET,程序將結束執行併爲我提供所需的輸出。

我想要的是永久修改的可執行二進制文件副本,它總是跳過而不使用調試器。

+0

有沒有辦法跳過它或跳過,當我執行程序沒有GDB –

+0

在GDB跳過它不算作解決你的任務,但是,是的,GDB可以跳到任何你想要的。檢查gdb手冊。您甚至可以在調試會話期間用NOP覆蓋「調用」指令。如果這是一個二進制的炸彈實驗室任務,你應該給它不同的輸入,所以執行永遠不會到達該塊。 –

+0

是的,我可以用程序計數器做到這一點,但我正在尋找一種方法來編輯二進制文件,並刪除該函數調用並保存修補文件。 –

回答

1

我很好奇我還可以用GDB做些什麼。我設法用GDB改變程序集,修補程序正常運行。

我試過使用nop,但它沒有工作,然後我期待跳轉功能。我的修補程序的工作原理是:

(gdb) set {unsigned char *}0x4006aa = 0xEB 
(gdb) set {unsigned char *}0x4006ab = 0x0C 

我正在做的是短暫的跳轉。 短跳轉操作碼是EB XX,其中XX是來自IP/PC的相對跳轉。 所以在這種情況下,我必須向前跳12個字節,指令也是2個字節,所以我把它寫在連續的存儲單元中。我將新的修改後的二進制文件寫入硬盤,一切都很好。

我花了一天的時間進行實驗,但最終我學到了很多東西。 :D

+1

你也許可以做'set {unsigned short *} 0x4006aa = 0x0CEB' –

+1

因爲這是我第一次做這樣的事情,所以我一步一步做了。 –