2011-04-14 32 views

回答

6

執行shell代碼,你可以直接編輯功能的內容:

(gdb) b foo 
Breakpoint 1 at 0x400608 
(gdb) run 
Breakpoint 1, 0x0000000000400608 in foo() 
(gdb) x/16bx foo 
0x400604 <foo>:  0x55 0x48 0x89 0xe5 0x53 0x48 0x81 0xec 
(gdb) set ((unsigned char *)foo)[6] = 0x85 
(gdb) x/16bx foo 
0x400604 <foo>:  0x55 0x48 0x89 0xe5 0x53 0x48 0x85 0xec 
(gdb) cont 

我不知道該怎麼從gdb內執行操作碼,但是你一定可以用寄存器來做任何你想要的操作。例如,而不是mov %rbx, %rax您可以使用set $rax = $rbx

(gdb) p $rax 
$1 = 3671197290184 
(gdb) set $rax = $rbx 
(gdb) p $rax 
$2 = 0 
(gdb) 
+0

'let'和'set'有什麼區別? – compiler 2011-04-14 09:46:06

+0

對不起,這是一個錯字,它應該讀取'set'。我會修復這個帖子。 – 2011-04-14 10:13:16

+0

是否有像彙編代碼的Python外殼? – 2017-08-15 10:08:40

-1

我不認爲gdb包含彙編程序,所以我不希望能夠直接輸入程序集。

可以使用shell GDB命令來運行shell命令:

(gdb) shell uname -m 
x86_64 
+0

但在C,我們可以assebmly直接嵌入了吧?在這裏我的意思是像'\ x23 \ x24 ...'由shellcode代碼 – compiler 2011-04-14 09:29:45

+0

這樣的東西,編譯器意味着一種特定類型的[二進制代碼](http://en.wikipedia.org/wiki/Shellcode)被執行由CPU。 – 2011-04-14 09:40:07

相關問題