2016-03-08 89 views
0

EDI是ARGC,RSI則argv的獲取彙編64的argv [2]地址

0x0000000000400535 <+8>: mov %edi,-0x4(%rbp) 
    0x0000000000400538 <+11>: mov %rsi,-0x10(%rbp) 

在這裏我得到的argv指針

(gdb) x/8x $rbp-0x10 
0x7ffdb7cac380: 0xb7cac478 0x00007ffd 0x00000000 0x00000003 
0x7ffdb7cac390: 0x00000000 0x00000000 0x1f130b45 0x00007ff3 

指針0x7ffdb7cac478

所以我的argv [2]在這裏:

(gdb) x/8x 0x7ffdb7cac478+16 
0x7ffdb7cac488: 0xb7cacd8a 0x00007ffd 0x00000000 0x00000000 

在地址0x7f fdb7cacd8a

我需要得到的argv地址[2],所以我想寫這彙編代碼:

僞代碼:

X - 負荷地址$ 8個字節RBP-0x10的//(指針的argv)

ý - 負載從x值的8個字節+ 16 //(指針的argv [2])

我需要稍後JMP爲y。

如何在彙編器x64中編寫?我可以用於x和y的哪個寄存器?

我希望這是可以理解的。我是一名初學者。

我問這裏,因爲我不知道從哪裏開始做我的研究。

UPDATE:

試過這樣:

bits 64 
ldr r8, rbp, #0x10 
ldr r9, r8, #0x10 
jmp r9 

但它甚至不編譯....我使用NASM。

我想上面是ARM arch,對於amd64(x64)應該這樣做。這是對的嗎?

更新2:

bits 64 
lea r8, [rbp-0x10] 
lea r9, [r8+0x10] 
jmp r9 

更新3:

也不起作用......

bits 64 
lea r8, [rbp-0x10] 
mov r9, [r8] 
mov r10, [r9+0x10] 
jmp r10 
+0

沒有什麼比閱讀關於您最喜愛的彙編程序的參考寄存器和程序流程。對於用於'x和y'的寄存器,您可以使用任意兩個通用寄存器。對於「我如何做到這一點」,答案是嘗試,然後發佈你的進展,如果你卡住了。 –

+0

這些是我的第一個彙編程序步驟,沒有任何最喜歡的參考。你可以指向任何?一個很大的幫助是至少告訴哪個指令將x字節加載到一個地址?是ldr,ldi嗎?我應該搜索什麼? –

+0

添加我的代碼我試過...甚至沒有編譯:/ –

回答

1

你寫main()_start

如果您正在編寫main,這是一個正常的函數,它的參數在rdi,rsi之後,遵循常規調用約定。請參閱標記wiki以獲取指向x86-64 ABI的鏈接。

如果您正在編寫_start,則數據位於堆棧上,如ABI的進程啓動部分所述。

rbp是沒有意義的,除非你初始化它。它具有來電者留下的任何內容。


你的代碼片段也很愚蠢:你永遠不會初始化rbp。你應該假設它在進程輸入時保存垃圾。只有rsp保證有用。

lea只是一個轉變&添加使用有效地址語法/編碼的指令。 mov是加載/存儲的助記符。

bits 64 
    lea r8, [rbp-0x10]  ; r8 = rbp-0x10 
    mov r9, [r8]   ; should have just done mov r9, [rbp-0x10] 
    mov r10, [r9+0x10] 
    jmp r10     ; jump to argv[2]??? 

你把機器碼字節放在argv[2]

當然,由於rbp未初始化,因此實際上並未訪問argv[2]


; get argc and argv from the stack, for x86-64 SysV ABI 
global _start 
_start: 
    mov ecx, [rsp]    ; load argc (assuming it's smaller than 2^32) 

    cmp ecx, 3 
    jb .argc_below_3 

    mov rsi, [rsp+8 + 0x10] ; argv[2] (the 3rd element) 
    mov al, [rsi]    ; first char of argv[2] 

    ; if you stop here in a debugger, you can see the character from the second arg. 

.argc_below_3: 
    xor edi, edi 
    mov eax, 231     ; exit_group(0) 
    syscall