2015-02-23 61 views
1

我想知道如何查看傳遞給使用gdb函數的命令行參數。使用gdb檢查字符串

爲了驗證這一點,我整理了以下代碼

.global main 
main: 
    pushl %ebp 
    movl %esp, %ebp 
    movl $1, %eax 
    movl $0, %ebx 
    int $0x80 

gcc -Wall -Wextra -g -m32 args.s 

調用匯編器和鏈接。

我的系統是x86_64 ubuntu(但爲了學習,我開始創建32位應用程序)。

我發起的gdb,並通過2命令行參數與

start test 12345 

在這一點上,我希望堆棧看起來像這樣:

  • 地址參數2 < - $ EBP + 20
  • 地址參數1 < - $ ebp + 16
  • 程序的地址名稱< - $ ebp + 12
  • ARGC < - $ EBP + 8
  • 老EIP < - $ EBP + 4
  • 老EBP < - $ EBP

讀取參數計數器

(gdb) x /d $ebp+8 

給出了預期的輸出:

0xffffd110: 3 

現在我試圖檢查已通過的命令行參數。我預計

x /x $ebp+16 

給出內存中第一個參數的第一個字符的地址。輸出是:

0xffffd118: 0xb4 

但是當我試圖訪問該地區

(gdb) x /x 0xb4 

我:

0xb4: Cannot access memory at address 0xb4 

這使我對我試圖訪問某個位置的結論,與我的命令行參數存儲的位置不同。

任何人都可以給我一些指向命令行參數的真實位置的指針嗎?

回答

2

C的主函數以不同於Linux loader的第一個調用函數的方式獲取參數。在C:int main(int argc, char *argv[])中重述main的聲明(如標準中所述)。主函數將獲得一個值和一個指向字符串數組的指針,即指向幾個指向字符串的指針的指針。

鉈; DR:

argc: x /d $ebp+8 
argv[0]: x /s **(int)($ebp+12) 
argv[1]: x /s *(*(int)($ebp+12)+4) 
argv[2]: x /s *(*(int)($ebp+12)+8)