前段时间去面了一个实习,虽然没有要我,但是还是记录下当时的几个面试题吧。
1、硬件断点和软件断点的区别
硬件断点:依赖于顾名思义,他依赖于硬件,DRX调试寄存器。有数量上的限制,X86中好像最多4个,不过他的优点是比较精确,可以精确到字节,由于是依赖硬件的,所以他不改变指令,不会被程序自校验检测到。
软件断点:区别与上面的,不需要硬件支持,所以没有数量上的限制,想要多少就设置多少,他是通过改变内存分页的属性,比如把page_noaccess设置为True,然后运行到这里的时候就不能访问,于是去判断是不是要下的断点,如果是的话就搞定了。不过不怎么精确,分页嘛,所以精确到页,一般是4K。
然后好像还有一种int 3 断点:是通过该改变断点地址处的第一个字节为CC指令,这样程序运行到这也会去判断,不过这种容易被程序给检测到,优点当然就是没有数量限制了。
2、函数调用的第一个参数怎么用ebp表示
这个问题因为问的是第一个参数,所以要考虑是哪一种函数调用规范,一般常用的cdecl和stdcall中参数都是从右向左开始传递的,所以第一个参数是最后一个传入的,然后将函数的返回地址传入堆栈,那么就进入了被调函数内部,首先是执行函数序言
push ebp
mov ebp,esp
这样以后ebp也被传入了堆栈,然后被重新用esp赋值,所以当前函数中ebp就是此时的esp的位置,一般是不会变了。那函数的返回地址是ebp+4,第一个参数就等于ebp+8,第二个参数等于ebp+0xC,后面依次类推。
3、QEMU是如何在x86架构的机子上运行mips程序的
这个问题其实现在我也没怎么明白,讲一下我的理解吧,如果有错误,希望大佬们提出来,我学习下。
一般运行程序,例如C,就是把c的程序代码经过编译以后,转换成了机器语言还要一些其他描述信息什么的,一般是.out后缀,然后就可以执行了,但是这只能在你编译这个程序的机器一样的架构的电脑上才能够运行,如果在x86上编译的那就只能在x86上运行,而不能在MIPS或者arm上运行。
但是有些情况我们必须要在其他机子上运行,而又只有X86怎么办的,那就要用到交叉编译环境了。他就可以让我们在不同架构直接编译。
然后QEMU就跟一个VMWare或者virtualbox一样,就是一个虚拟机,可以在上面运行一个mips 的操作系统,之前用交叉编译环境编译的程序就可以在这里执行了。
QEMU有三种模式,分别为:客户模式,用户模式和内核模式。
- 客户模式:执行用户的非IO操作
- 用户模式:执行用好的IO操作。
- 内核模式:实现客户模式和用户模式的切换
QEMU使用一个微型代码生成器(TCG)将目标指令转换成主机指令。
目标指令===》TCG===>主机指令
然后MIPS系统就可以运行编译后的程序来了。
总的来说,还是自己太菜,达不到人家公司要求,还是要继续学习基础知识啊。。。。。。