簡體   English   中英

用匯編語言解釋這一行?

[英]Interpreting this line in Assembly language?

下面是反匯編C程序的前5行,為了更好地學習匯編語言,我試圖將其反向工程回C代碼。 在此代碼的開頭,我看到它為堆棧騰出了空間,並立即調用

0x000000000040054e <+8>:    mov    %fs:0x28,%rax

我很困惑此行的作用,以及可能從相應的C程序調用此行的原因。 到目前為止,我唯一一次看到這行是在C程序中調用另一種方法時,但是這次沒有任何Callq指令,因此我不太確定...在這方面還有什么想法C程序將進行此調用?

0x0000000000400546 <+0>:    push   %rbp
0x0000000000400547 <+1>:    mov    %rsp,%rbp   
0x000000000040054a <+4>:    sub    $0x40,%rsp
0x000000000040054e <+8>:    mov    %fs:0x28,%rax
0x0000000000400557 <+17>:   mov    %rax,-0x8(%rbp)
0x000000000040055b <+21>:   xor    %eax,%eax
0x000000000040055d <+23>:   movl   $0x17,-0x30(%rbp)
...

我知道這是為緩沖區溢出攻擊提供某種形式的堆棧保護,我只需要知道如果沒有單獨的方法,什么C代碼會提示這種保護。

如您所說,這是用於防止緩沖區溢出的代碼。 編譯器為具有局部變量(可能是可能溢出的緩沖區)的函數生成此“堆棧Canary檢查”。 請注意您要詢問的行上方和下方的說明:

sub  $0x40, %rsp
mov  %fs:0x28, %rax
mov  %rax, -0x8(%ebp)
xor  %eax, %eax

sub在堆棧上分配64個字節的空間,這足以容納至少一個小數組。 然后,將一個秘密值從%fs:0x28復制到該空間的頂部,恰好在前一個幀指針和返回地址的下面,然后從寄存器文件中將其刪除。

函數的主體對數組做一些事情; 如果它在數組末尾寫入足夠遠的數據,它將覆蓋秘密值。 在函數的末尾,將有如下代碼:

    mov    -0x8(%rbp), %rax
    xor    %fs:28, %rax
    jne    1
    mov    %rbp, %rsp
    pop    %rbp
    ret
1:
    call    __stack_chk_fail   # does not return

這驗證了機密值未更改,並且如果更改了程序,則使程序崩潰。 這個想法是,試圖利用一個簡單的緩沖區溢出漏洞的人,就像您在使用gets ,將無法在不修改秘密值的情況下更改返回地址。

編譯器具有幾種不同的啟發式方法 ,可通過命令行選項進行選擇,以決定何時需要生成堆棧canary保護代碼。

您不能自己編寫與此匯編語言相對應的C代碼,因為它使用了不同尋常的%fs:nnnn尋址模式。 堆棧型Canary代碼有意使用了其他任何代碼生成都不依賴的尋址模式,從而使對手盡可能難於學習秘密值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM