生成并捕获无效指令

时间:2019-07-08 12:43:17

标签: c assembly gdb

我想在程序中隔离自定义操作码,以捕获无效的操作码异常(如果有)。如果我写了一个空的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,我得到分段错误错误。因此,我无法区分段错误和无效的指令/操作码。我想隔离该操作码。如何与不同的页面对齐并处理页面错误?

有何评论?

0 个答案:

没有答案