2015-11-13 86 views
-2

以下是三個不同的.s文件的一部分。 .c文件已經編有三個不同的選項:此機器代碼如何防止緩衝區溢出?

  1. -fno-直列-fstack保護器強,
  2. -fno-直列-fsanitize =地址,
  3. -fno內聯-fno -stack-protector -zexecstack。

以下是的.S文件的內容:

handle_read: 
.LFB20: 
    .cfi_startproc 
    pushq %r12 
    .cfi_def_cfa_offset 16 
    .cfi_offset 12, -16 
    pushq %rbp 
    .cfi_def_cfa_offset 24 
    .cfi_offset 6, -24 
    movq %rsi, %r12 
    pushq %rbx 
    .cfi_def_cfa_offset 32 
    .cfi_offset 3, -32 
    movq 8(%rdi), %rbx 
    movq %rdi, %rbp 
    movq 160(%rbx), %rsi 
    movq 152(%rbx), %rdx 
    cmpq %rdx, %rsi 
    jb  .L394 
    cmpq $5000, %rdx 
    jbe  .L421 

handle_read: 
.LASANPC20: 
.LFB20: 
    .cfi_startproc 
    pushq %r15 
    .cfi_def_cfa_offset 16 
    .cfi_offset 15, -16 
    pushq %r14 
    .cfi_def_cfa_offset 24 
    .cfi_offset 14, -24 
    pushq %r13 
    .cfi_def_cfa_offset 32 
    .cfi_offset 13, -32 
    pushq %r12 
    .cfi_def_cfa_offset 40 
    .cfi_offset 12, -40 
    pushq %rbp 
    .cfi_def_cfa_offset 48 
    .cfi_offset 6, -48 
    movq %rdi, %rbp 
    addq $8, %rdi 
    pushq %rbx 
    .cfi_def_cfa_offset 56 
    .cfi_offset 3, -56 
    movq %rdi, %rax 
    shrq $3, %rax 
    subq $24, %rsp 
    .cfi_def_cfa_offset 80 
    cmpb $0, 2147450880(%rax) 
    jne  .L1170 
    movq 8(%rbp), %rbx 
    leaq 160(%rbx), %r13 
    movq %r13, %r15 
    shrq $3, %r15 
    cmpb $0, 2147450880(%r15) 
    jne  .L1171 
    leaq 152(%rbx), %r14 
    movq %rsi, %r12 
    movq 160(%rbx), %rsi 
    movq %r14, %rax 
    shrq $3, %rax 
    cmpb $0, 2147450880(%rax) 
    jne  .L1172 
    movq 152(%rbx), %rdx 
    leaq 144(%rbx), %rcx 
    cmpq %rdx, %rsi 
    jb  .L1054 
    cmpq $5000, %rdx 
    jbe  .L1055 
    movl $httpd_err400form, %eax 
    shrq $3, %rax 
    cmpb $0, 2147450880(%rax) 
    jne  .L1173 
    movl $httpd_err400title, %eax 
    movq httpd_err400form(%rip), %r8 
    shrq $3, %rax 
    cmpb $0, 2147450880(%rax) 
    jne  .L1174 


handle_read: 
.LFB20: 
    .cfi_startproc 
    pushq %r12 
    .cfi_def_cfa_offset 16 
    .cfi_offset 12, -16 
    pushq %rbp 
    .cfi_def_cfa_offset 24 
    .cfi_offset 6, -24 
    movq %rsi, %r12 
    pushq %rbx 
    .cfi_def_cfa_offset 32 
    .cfi_offset 3, -32 
    movq 8(%rdi), %rbx 
    movq %rdi, %rbp 
    movq 160(%rbx), %rsi 
    movq 152(%rbx), %rdx 
    cmpq %rdx, %rsi 
    jb  .L384 
    cmpq $5000, %rdx 
    jbe  .L411 

誰能告訴我這些代碼如何防止緩衝區溢出?

+0

看看每個選項的文檔,這應該有助於你理解在每種情況下正在做什麼。 'fstack-protector-strong':https://lwn.net/Articles/584225/。你可以谷歌其他人。 – EkcenierK

+2

鑑於第一和第三個功能是相同的,我會說這裏有些奇怪。此外,該函數沒有導致緩衝區溢出的訪問模式。我會說:**發佈整個功能,不只是其中的一部分** – EOF

回答

2

您的handle_read函數不會最終在堆棧中分配任何東西,因此-fstack-protector-strong沒有任何功能可以保護,因此此選項沒有任何區別。 -zexecstack選項在生成的可執行文件中設置一個標誌,告訴操作系統應該允許執行存儲在堆棧中的代碼。它對生成的程序集沒有影響。

只有-fsanitize=address選項具有顯示在您已發佈的生成裝配輸出中的效果。它負責出現在第二個生成裝配塊中的shrq $3, rXX; cmp $0, 2147450880(%rXX); jne .LXXXX序列。這些指令查找函數在「影子內存」表中訪問的內存中的每個地址。該表格記錄哪些位置已被分配,哪些沒有。如果插入的代碼檢測到程序嘗試訪問尚未分配的內存位置,則會導致程序退出並顯示錯誤消息。

有關影子內存表如何工作以及AddressSanitizer如何工作的更多詳細信息,請閱讀作者的Usenix文件AddressSanitizer: A Fast Address Sanity Checker