簡體   English   中英

執行完jmp后,C asm jmp返回jmp

[英]C asm jmp going back to jmp after performing the jmp

我正在C中的一些asm代碼中執行相對跳轉。 我已經按照預期進行了跳轉,但是在跳轉發生並完成了代碼運行之后,它又回到了右邊。

#include <stdio.h>

void function() {
    asm("jmp .+0x31"); //this happens to be where I want to jump to from the function call
}

void main(int argc, char* argv[]) {
    int x;
    x = 0;
    function();
    x = 1;
    x = x + 1;
    printf("%d\n", x);
}

0x000000000040053f <+0>:     push   %rbp
0x0000000000400540 <+1>:     mov    %rsp,%rbp
0x0000000000400543 <+4>:     sub    $0x20,%rsp
0x0000000000400547 <+8>:     mov    %edi,-0x14(%rbp)
0x000000000040054a <+11>:    mov    %rsi,-0x20(%rbp)
0x000000000040054e <+15>:    movl   $0x0,-0x4(%rbp)
0x0000000000400555 <+22>:    mov    $0x0,%eax
0x000000000040055a <+27>:    callq  0x400536 <function>
0x000000000040055f <+32>:    movl   $0x1,-0x4(%rbp)
0x0000000000400566 <+39>:    addl   $0x1,-0x4(%rbp)
0x000000000040056a <+43>:    mov    -0x4(%rbp),%eax
0x000000000040056d <+46>:    mov    %eax,%esi
0x000000000040056f <+48>:    mov    $0x400620,%edi
0x0000000000400574 <+53>:    mov    $0x0,%eax
0x0000000000400579 <+58>:    callq  0x400410 <printf@plt>
0x000000000040057e <+63>:    nop
0x000000000040057f <+64>:    leaveq
0x0000000000400580 <+65>:    retq

下面的調用function()它打印按預期為0,但隨后后回到通過代碼function()被調用並打印2為好。 我是否錯過了jmp工作原理? 有沒有辦法通過asm代碼退出?

目的是跳過

x = 1;
x = x + 1;

並僅打印0,然后退出文件。

由於function不執行ret指令,因此其返回地址仍在堆棧上。 也就是說,當main執行 ret ,它使用的返回地址實際上是function留下的地址,並返回x = 1; 線。

為了實現您的目標,執行跳轉之前的function必須調整堆棧指針,就好像從未調用過它一樣。

就是說, 不要在家嘗試這個

暫無
暫無

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

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