Assembly 组件x86开关盒混淆

Assembly 组件x86开关盒混淆,assembly,Assembly,在function switch_的例子中,当它实现跳转表时,与更简单的L1:、L2:、L3:等相比,我在查看它时遇到了问题 080483ec <switch_case>: 80483ec: push %ebp 80483ed: mov %esp,%ebp 80483ef: sub $0x10,%esp //create stack space 80

在function switch_的例子中,当它实现跳转表时,与更简单的L1:、L2:、L3:等相比,我在查看它时遇到了问题

     080483ec <switch_case>:    
     80483ec:           push   %ebp
     80483ed:           mov    %esp,%ebp
     80483ef:           sub    $0x10,%esp  //create stack space
     80483f2:           mov    0x8(%ebp),%eax  //param x
     80483f5:           mov    %eax,-0x4(%ebp)  //x moved into -0x4(%ebp)
     80483f8:           mov    0xc(%ebp),%eax  //param n moved into %eax
     80483fb:           sub    $0x21,%eax   //subtract 21 from n
     80483fe:           cmp    $0x4,%eax    //compare 4 with n
     8048401:           ja     8048420 <switch_case+0x34> // jumping to 804820
     8048403:           mov    0x80484e0(,%eax,4),%eax
     804840a:           jmp    *%eax
     804840c:           subl   $0x2,-0x4(%ebp)
     8048410:           jmp    8048427 <switch_case+0x3b>
     8048412:           addl   $0x2,-0x4(%ebp)
     8048416:           jmp    8048427 <switch_case+0x3b>
     8048418:           shll   $0x3,-0x4(%ebp)
     804841c:           addl   $0x1,-0x4(%ebp)
     8048420:           movl   $0xa,-0x4(%ebp) // default starts here x=10
     8048427:           mov    -0x4(%ebp),%eax // n=x
     804842a:           leave
     804842b:           ret

我知道一个例子是x+=2;另一个是x-=2;另一个可能是x,
subtract 21
一开始是十六进制的,所以这就是十进制的
subtract 33
。在使用跳转表之前也会发生这种情况。逻辑是:

unsigned tmp = n - 33;
if (tmp > 4) goto default;
goto table[tmp];

这意味着,
tmp
可能是
0
3
包括在内,这反过来意味着
n
的范围是
33
36
。至于代码在哪里,您需要查看跳转表。从地址
0x80484e0
开始,您将有4个指针,对于这4种情况。

问题是?我不确定我是否理解你所说的
我看不到指令地址中的偏移量
-标有问号的行跳转到0x8048420-指令段中清晰可见。已修复-不确定我为什么遗漏了它
unsigned tmp = n - 33;
if (tmp > 4) goto default;
goto table[tmp];