簡體   English   中英

這個機器碼如何防止緩沖區溢出?

[英]How does this machine code prevent buffer-overrun?

以下是三個不同 .s 文件的一部分。 .c 文件已使用三個不同的選項進行編譯:

  1. -fno-inline -fstack-protector-strong,
  2. -fno-inline -fsanitize=地址,
  3. -fno-inline -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

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

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

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

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

暫無
暫無

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

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