2015-10-27 62 views
0

這是我的函數的彙編代碼。 這是用gcc -02 -fsanitize =未定義溢出時,%rbx,%rsi會做什麼?

0: 55      push %rbp 
    1: 53      push %rbx 
    2: 48 ba ff ff ff ff ff movabs $0x7fffffffffffffff,%rdx 
    9: ff ff 7f 
    c: 48 83 ec 08    sub $0x8,%rsp 
    10: 48 8b 1d 00 00 00 00 mov 0x0(%rip),%rbx  # 17 <testovf+0x17> 
    17: 48 89 dd    mov %rbx,%rbp 
    1a: 48 01 d5    add %rdx,%rbp 
    1d: 70 0d     jo  2c <testovf+0x2c> 
    1f: 48 39 eb    cmp %rbp,%rbx 
    22: 0f 9f c0    setg %al 
    25: 48 83 c4 08    add $0x8,%rsp 
    29: 5b      pop %rbx 
    2a: 5d      pop %rbp 
    2b: c3      retq 
    2c: 48 89 de    mov %rbx,%rsi 
    2f: bf 00 00 00 00   mov $0x0,%edi 
    34: e8 00 00 00 00   callq 39 <testovf+0x39> 
    39: eb e4     jmp 1f <testovf+0x1f> 

我明白,當溢出1a中除了發生,它跳轉到2C運行。然而,在2c之後,mov%rbx,%rsi和mov $ 0x0,%edi做了什麼? 他們需要在那裏嗎?

+1

託尼,停止編輯問題的主體。沒有代碼,這是一個不完整和無用的問題,應該刪除。如果您需要編輯,請同時輸入新內容。如果您有不同的問題,請發佈新的問題 –

回答

2

在地址34你有一個callq到外部函數。您所要求的兩條指令爲該函數設置參數,根據標準的64位調用約定,將在rdirsi寄存器中傳遞。

請注意,通話的目標顯示爲39 <testovf+0x39>,但這不正確。有機會,你從objdump得到這個清單,並忘記使用-r選項,它會顯示你的重定位條目。

+0

當我使用-r選項時,僅添加到代碼中的東西是: 30:R_X86_64_32 .data + 0x20 34:e8 00 00 00 00 callq 39 35:R_X86_64_PC32 __ubsan_handle_add_overflow-0x4 39:eb e4 jmp 1f 你知道這意味着什麼嗎? – Tony

+0

是的,它顯示你調用的函數真的是'__ubsan_handle_add_overflow'。 – Jester