2014-09-26 38 views
1
0x0804889a <+361>: mov %eax,0xc(%esp) 
    0x0804889e <+365>: movl $0x2b,0x8(%esp) 
    0x080488a6 <+373>: movl $0x1,0x4(%esp) 
    0x080488ae <+381>: movl $0x8048ab0,(%esp) 

程序尤指將數據添加到%ESP讀取(最後一行是從存儲器中的字符串,我可以探測)如何使用gdb

目前我打破在上述的最後一行。和info registers顯示

esp   0xffffd704  0xffffd704 

當我嘗試display我得到它

$esp = (void *) 0xffffd704 

,如果我嘗試傾倒

(gdb) dump memory mem2 0xffffd704 0xffffffff 
Cannot access memory at address 0xffffd704 

(gdb) info mem 
Using user-defined memory regions. 
There are no memory regions defined. 

我怎麼能看到的ESP的全部價值?

+1

'0xffffd704'在進程的內核空間中,'gdb'不能轉儲內核空間。你應該使用'kgtp'來幫助你。從'ebp'的值來看,我認爲堆棧空間被溢出損壞了。 – 2014-09-28 03:39:22

+1

@NanXiao如果你在64位的linux下運行32位程序,你將得到該範圍內的堆棧,並且這通常是可訪問的用戶空間。但是,如問題所示,'gdb'確實無法轉儲該內存。 – Jester 2014-09-28 21:46:47

+0

確實在64位linux上運行。但該程序作者聲稱已經編譯爲64位。即使我只能在gdb上運行它,如果拱=== i386。 – gcb 2014-09-30 01:33:26

回答

1

錯誤消息是誤導性的。根據我的測試,gdb打印出如果該範圍內的任何字節不可訪問。因此,問題在於最終地址。您可以從/proc/<pid>/maps取得棧頂,例如我的測試程序我得到:

$ grep stack /proc/8277/maps 
fffdd000-ffffe000 rw-p 00000000 00:00 0 [stack] 

gdb能,將內存轉儲範圍內沒有問題。

當然,如果您只想讀取感興趣的特定值,可以使用x檢查)命令。