我想在程序中隔离自定义操作码,以捕获无效的操作码异常(如果有)。如果我写了一个空的main,我将看到如下汇编顺序:
(gdb) list
1 void main()
2 {
3 }
(gdb) disass /r main
Dump of assembler code for function main:
0x00000000004004ed <+0>: 55 push %rbp
0x00000000004004ee <+1>: 48 89 e5 mov %rsp,%rbp
0x00000000004004f1 <+4>: 5d pop %rbp
0x00000000004004f2 <+5>: c3 retq
End of assembler dump.
如果我写一个随机字节,例如__asm__(".byte 0x01");
,我会看到它会自动在其后附加5d和c3,因为它假定操作码为ADD,因此需要多个字节。
0x00000000004004f1 <+4>: 01 5d c3 add %ebx,-0x3d(%rbp)
汇编程序转储结束。
如果在此前后添加一些NOP(0x90),它也无济于事,它将自动在0x01后面附加一些0x90。
0x00000000004004f1 <+4>: 90 nop
0x00000000004004f2 <+5>: 90 nop
0x00000000004004f3 <+6>: 90 nop
0x00000000004004f4 <+7>: 01 90 90 90 90 90 add %edx,-0x6f6f6f70(%rax)
0x00000000004004fa <+13>: 90 nop
0x00000000004004fb <+14>: 5d pop %rbp
0x00000000004004fc <+15>: c3 retq
通过执行该ADD,我得到分段错误错误。因此,我无法区分段错误和无效的指令/操作码。我想隔离该操作码。如何与不同的页面对齐并处理页面错误?
有何评论?