[英]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.