问题描述
在做pwn题时,有时候会遇到下图中的代码,这是因为IDA无法识别函数中的跳表造成的。
Screenshot from 2021-09-13 23-29-57.png
解决该问题的办法也比较简单,就是需要我们手动告诉IDA如何解析跳表。
解决方法
-
用tab键找到指令"jmp rax"对应的汇编代码片段,可以看到以下汇编指令片段。
Screenshot from 2021-09-13 23-32-51.png
分析下代码逻辑可以发现跳表的实现原理:跳表是数组,数组中的第i个元素是跳表基地址-目标代码地址。程序只要给定数组的下标i,即可通过一系列操作跳转到目标地址。
感觉这种实现有以下特点:- 可以适应PIE(直接在跳表中存储目标地址的做法无法达到这一点);
- 通常对应于switch语句。此类switch语句中,value的值是连续的;
-
把光标放到unk_3330上,然后选择 "edit/other/specify switch idiom",可以进入以下界面:
Screenshot from 2021-09-13 23-43-58.png
其中个选项的含义如下:
1. Address of jump table 跳表的起始地址
2. Number of elements 跳表中元素的个数
3. size of table element 元素的大小
4. Element Shift amount 不知道
5. Element Base value 可能是跳表中元素的起始地址
6. Start of the switch idiom Switch 语句起始地址
7. Input register of switch switch语句的输入寄存器
8. First Input Value
9. Default jump address
10 Separate Value table is present
11. Signed jump table elements 跳表元素是有符号的
12. Subtract table element 计算目标地址时,用减法计算
13. Table element is insn
根据自己的需求设置好参数即可。在本例子中,参数设置如下:
Screenshot from 2021-09-13 23-52-46.png
点击"OK"并重新反汇编即可恢复出switch语句,如下
Screenshot from 2021-09-13 23-53-15.png
网友评论