我從一個簡單的混淆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,程序將結束執行併爲我提供所需的輸出。
我想要的是永久修改的可執行二進制文件副本,它總是跳過而不使用調試器。
有沒有辦法跳過它或跳過,當我執行程序沒有GDB –
在GDB跳過它不算作解決你的任務,但是,是的,GDB可以跳到任何你想要的。檢查gdb手冊。您甚至可以在調試會話期間用NOP覆蓋「調用」指令。如果這是一個二進制的炸彈實驗室任務,你應該給它不同的輸入,所以執行永遠不會到達該塊。 –
是的,我可以用程序計數器做到這一點,但我正在尋找一種方法來編輯二進制文件,並刪除該函數調用並保存修補文件。 –