在ARM汇编代码中我可以看到类似这样的东西...... (特别是在shellcode中)
svc 0x0090003f
svc 0x001ff3bf
swi 0x0900ff0b
我知道'svc(或swi)'是'supervisor call',比如英特尔的'int 0x80'或'SYSENTER'。但是,我怎么能解释'svc'数字?我在哪里可以获得它的信息列表?拇指'svc'指令怎么样?
手臂使用说明书似乎没有解释这些......
有人能帮助我吗? 提前谢谢。
答案 0 :(得分:1)
SVC值存储在ESR寄存器的16位低位中
ARMv8 Architecture Reference D12.2.36“ ESR_EL1,异常综合症寄存器(EL1)”表示,如果EC位为0b010101,则ISS字段记录为“针对HVC或SVC指令执行的异常的ISS编码”
该节然后说低16位是imm16
,如果您查看SVC定义,则是给16位自变量的名称。
最后,您在问题上显示的SVC调用在ARMv8 GNU GAS中无效,因为它们大于16位。例如:
SVC 0xABCDE
正确组装失败:
Error: immediate value out of range 0 to 65535 at operand 1 -- `svc 0xABCDE
可运行的示例
这是一个极简的aarch64裸机可运行示例,该示例执行SVC并在处理程序中打印出所有寄存器,包括ESR https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b1bfd46efebabcba4f1ab1cbddf99611550e2dc2#arm-svc-instruction
答案 1 :(得分:0)
6.2.8。 SVC处理程序
异常处理程序可能必须确定发生异常时处理器是处于ARM状态还是Thumb状态。
特别是,SVC处理程序可能必须读取处理器状态。这是通过检查SPSR T位来完成的。此位设置为Thumb状态,清除为ARM状态。ARM和Thumb指令集都有SVC指令。从Thumb状态调用SVC时,必须考虑以下事项:
指令地址为lr-2,而不是lr-4。
指令本身是16位,因此需要半字加载,见图6.3。
SVC编号保持8位而不是ARM状态的24位。
在http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203j/Cacdfeci.html
了解详情答案 2 :(得分:0)
从6.2.8开始。 SVC处理程序
每当遇到任何svc / swi时,控制权就会转移到svc处理程序。在SVC处理程序中,这些数字将用于标识需要调用哪些子例程,因此这些是处理程序将获取并进行相应处理的索引值。
示例6.11。 C函数中的SVC处理程序
void C_SVC_handler (unsigned number)
{
switch (number)
{
case 0 : /* SVC number 0 code */
...
break;
case 1 : /* SVC number 1 code */
...
break;
...
default : /* Unknown SVC - report error */
}
}
参考- 6.2.8。 SVC处理程序