我怎样才能让 IDA 理解带有签名跳转表的这个 switch 语句?

逆向工程 艾达 拆卸 反编译
2021-07-09 11:33:34

我采用了以下 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 语句?

1个回答

我想到了。这是配置的外观,重要的是将“元素基值”设置为跳转表的偏移量并检查“带符号的跳转表元素”。此外,如果您没有将“开关的输入寄存器”设置为正确的寄存器,您的图形视图看起来不错,但反编译将失败并显示“开关分析失败”。