我采用了以下 C 代码并在 Ubuntu 16.04 和 GCC 5.4.0 上编译它:
int main() {
int a = 0;
for (int i = 0; i < 5; i++) {
switch (i) {
case 0:
a = 1;
break;
case 1:
a = 2;
break;
case 2:
a = 3;
break;
case 3:
a = 4;
break;
case 4:
a = 5;
break;
default:
a = 6;
break;
}
}
}
我编这是一个PIE二进制使用此命令:gcc -pie -fPIE test.c。您可以在下面的 IDA 6.95 中看到反汇编:
请注意,IDA 无法识别 switch 语句。因为我将其编译为 PIE,位于 0x824 的表不包含要跳转到的绝对地址,而是带符号的相对偏移量:
.rodata:0000000000000824 ; signed int dword_824[5]
.rodata:0000000000000824 dword_824 dd 0FFFFFF2Ah, 0FFFFFF33h, 0FFFFFF3Ch, 0FFFFFF45h, 0FFFFFF4Eh
我试图通过转到 来指定这是一个 switch 语句Edit -> Other -> Specify Switch Idiom,但 IDA 仍然无法弄清楚。例如,这是我尝试过的一组值:

我在这里尝试了几种不同的配置选项排列,但我什么也做不了。我到底需要做什么来教 IDA 关于这个 switch 语句?

