Assembly 组件x86开关盒混淆
在function switch_的例子中,当它实现跳转表时,与更简单的L1:、L2:、L3:等相比,我在查看它时遇到了问题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
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];