我在2014年7月1日参加了猎豹移动(原金山网络)反病毒工程师的电话面试,但是很遗憾,由于我当时准备不足,加上自身水平不够,面试官向我提出的很多技术问题我都没能答出来(这里面既有基础类的问题,也有比较高深的问题),结果没能通过那次的面试。痛定思痛,我认认真真总结出了当时向我提出的所有问题,一共是十多条,我会分为几篇文章来进行剖析。并且根据问题的难易程度,由浅入深进行排序。参考了大量的相关资料,给出了业界较为权威的书籍上的答案,可能对于某些问题,会同时摘录几本书的内容,并且给出知识扩展,以更为全面地看待这个问题。

猎豹移动的反病毒工程师(珠海)职位分为社会招聘和校园招聘,其中社会招聘要求如下:

    工作职责:
     1、样本鉴定;
     2、分析病毒样本并提供解决方案;
     3、信息安全技术研究。
    任职要求:

1、热爱底层工作,对反病毒、逆向工程、系统漏洞等有强烈兴趣;

2、熟悉x86系列汇编语言,能熟练读懂汇编代码;

3、熟练使用IDA、OD等工具进行反汇编;

4、有一定C/C++程序功底;

5、有良好的团队合作意识、善于沟通、有耐心、责任心强;

6、工作细心、积极主动、推动力强、有较快、较好的学习新技术能力。

校园招聘的要求如下:

    工作职责:
     1、样本鉴定;
     2、分析病毒样本并提供解决方案;
     3、信息安全技术研究。
    任职要求:
     1、热爱底层开发工作,对反病毒、逆向工程、系统漏洞等有强烈兴趣;
     2、熟悉x86系列汇编语言,能熟练读懂汇编代码;
     3、具有C/C++程序开发经验者优先。
    这次所讨论的是三个基础问题,主要关于汇编一些指令的用法。那么接下来就是我所总结的技术面试问题:
1、请解释一下汇编中的ADC和REP指令。
    答:(以下内容均选自软件“汇编指令助手 V1.1”)
    带进位加法指令ADC(Addition Carry)
    格式:ADC OPRD1,OPRD2
    功能:OPRD1←OPRD1+OPRD2+CF
    说明:
    (1)OPRD1为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数。OPRD2为立即数,也可以是任意一个通用寄存器操作数。立即数只能用于源操作数。
    (2)OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的,但不允许两个都是存储器操作数。
    (3)加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响。以上标志也称为结果标志。
    (4)该指令对标志位的影响同ADD指令。
    重复前缀的说明
    格式:REP            ; CX<>0重复执行字符串指令
          REPZ/REPE      ; CX<>0且ZF=1重复执行字符串指令
          REPNZ/REPNE    ; CX<>0且ZF=0重复执行字符串指令
    功能:在串操作指令前加上重复前缀,可以对字符串进行重复处理。由于加上重复前缀后,对应的指令代码是不同的,所以指令的功能便具有重复处理的功能,重复的次数存放在CX寄存器中。
    说明:
    (1)REP与MOVS或STOS串操作指令相结合使用,完成一组字符的传送或建立一组相同数据的字符串。
    (2)REPZ/REPE常用与CMPS串操作指令结合使用,可以完成两组字符串的比较。
    (3)REPZ/REPE常与SCAS指令结合使用,可以完成在一个字符串中搜索一个关键字。
    (4)REPNZ/REPNE与CMPS指令结合使用,表示当串未结束(CX=1)且当对应串元素不相同(ZF=0)时,继续重复执行串比较指令。
    知识扩展:
    带借位减去指令SBB(SuBtraction with Borrow)

格式:SBB OPRD1,OPRD2
    功能:是进行两个操作数的相减再减去CF进位标志位,即从OPRD1←OPRD1-OPRD2-CF,其结果放在OPRD1中。
    循环控制指令LOOP
    格式:LOOP 标号
    功能:(CX)←(CX)−1,(CX)<>0,则转移至标号处循环执行,直至(CX)=0,继续执行后继指令。
    说明:
    (1)本指令是用CX寄存器作为计数器,来控制程序的循环。
    (2)它属于段内SHORT短类型转移,目的地址必须距本指令在-128到+127个字节的范围内。
    (以下内容选自《IDA Pro代码破解揭秘》第2.4节)
    EFLAGS寄存器是32位寄存器,包含一组状态、系统标志及控制标志。每个标志由寄存器里一位代表,从0位到31位我们有下面这些标志。
    CF:进位标志,指示在算术运算中是否带有进位或借位。用于无符号算术运算。
    PF:奇偶标志,为机器中传送信息时可能出错提供校验。当目的操作数中1的个数为偶数时置1(PE),否则置0(PO)。
    AF:辅助进位标志,记录运算时低4位(半个字节)产生的进位值。有进位时置1(AC),否则置0(NA)。
    ZF:零标志。运算结果为0时置1(ZR),否则置0(NZ)。

SF:符号标志,记录运算结果的符号。结果为负时置1(NG),否则置0(PL)。
    TF:陷阱标志,用于单步方式操作。当TF为1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF为0时,CPU正常工作,不产生陷阱。
    IF:允许中断标志。当IF为1(EI)时,允许中断;IF为0(DI)时关闭中断。
    DF:方向标志,在串处理指令中控制处理信息的方向。当DF置1(DN)时每次操作后,变址寄存器SI和DI减量,这样就使串处理从高地址向低地址方向处理;当DF置0(UP)时,则反之。
    OF:溢出标志。在运算过程中,若操作数超出了机器能表示的范围则称为溢出,此时OF标志位为1(OV);否则置0(NV)。
    IOPL(12位到13位):I/O特权级标志。指出当前运行任务的I/O端口的特权级。
    NF:嵌套任务标志。只在当前任务是前一任务的子任务时设置。
    RF:回复标志。控制处理器对调试异常的响应。
    VM:虚拟8086标志。控制是否启用虚拟8086模式。
    AC:对齐检查标志。设置为启用存储器的对齐检查的参考。
    VIF:虚拟中断标志。IF的虚拟映像,与VIP标志联合使用。
    VIP:虚拟中断标志。确定是否有中断被挂起。
    ID:标识标志,确定CPU是否支持CPUID指令。
    第22到31位当前被保留。
    (以下内容选自《黑客免杀攻防》第9.3节)

013A13CC  lea edi,dword ptr ss:[ebp-0xC0]
013A13D2  mov ecx,0x30
013A13D7  mov eax,0xCCCCCCCC
013A13DC  rep stos dword ptr es:[edi];向EDI指向的地址处依次填入EAX中的内容,循环ECX次(也就是填0xCC操作)。这是因为汇编指令;“int 3”的OpCode就是0xCC,很显然这样做会大大提高程序的排错能力,如果由于某些不可知的原;因导致代码跑到了不该去的地方,那么这些成排的“int 3”指令会马上将其断下来。

2、请说明寄存器EBP与ESP的功能,并解释在大多数函数入口点处的反汇编代码中,这两个寄存器的作用。
    答:(以下内容选自《0day安全:软件漏洞分析技术 第2版》第2.1.4节)
    每一个函数都独占自己的栈帧空间。当前正在运行的函数的栈帧总是在栈顶。Win32系统提供两个特殊的寄存器用于标识位于系统顶端的栈帧。
    (1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
    (2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
    注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念,本书在叙述中将坚持使用“栈帧底部”这一提法以示区别;ESP所指的栈帧顶部和系统栈的顶部是同一个位置,所以后面的叙述中并不严格区分“栈帧顶部”和“栈顶”的概念。请您注意这里的差异,不要产生概念混淆。
函数栈帧:ESP和EBP之间的内存空间为当前栈帧,EBP标识了当前栈帧的底部,ESP标识了当前栈帧的顶部。
    (以下内容选自《0day安全:软件漏洞分析技术 第2版》第2.1.5节)
    函数调用大致包括以下几个步骤
    ……
    (4)栈帧调整:具体包括。
    保存当前栈帧状态值,以备后面恢复本栈帧时使用(EBP入栈);
    将当前栈帧切换到新栈(将ESP值装入EBP,更新栈帧底部);
    给新栈帧分配空间(把ESP减去所需空间的大小,抬高栈帧);
    ……

push ebp             ;保存旧栈帧的底部
mov ebp,esp          ;设置新栈帧的底部(栈帧切换)
sub esp,xxx          ;设置新栈帧的顶部(抬高栈帧,为新栈帧开辟空间)

(以下内容选自《黑客免杀攻防》第9.3节)

013A13C0 >push ebp       ;EBP入栈保存(一般情况下将某个寄存器入栈保存的目的只有两个,一个
013A13C0                 ;是需要将其通过栈传递给某个函数或代码使用,另外一种情况就是后面的
013A13C0                 ;代码要使用到这个寄存器,因此要将其原始的值保存起来,
013A13C0                 ;以备恢复)
013A13C1  mov ebp,esp    ;然后将堆栈指针ESP的值传递给EBP,如此一来在这个函数内只需要使用
013A13C1                 ;EBP就可以对栈进行操作了。这样做的好处是不需要对ESP做过多的操
013A13C1                 ;作,从而更好地保证了程序的健壮性(也增加了易读性)
013A13C3  sub esp,0xC0   ;将ESP减0xC0,也就是将栈顶抬高0xC0。这里有一个专业名词叫做
013A13C3                 ;“打开栈帧”。但是通过源代码我们知道根本用不了这么大的空间,这
013A13C3                 ;是编译器在编译Debug版本时为了增强程序的健壮性与可调试性而做
013A13C3                 ;的一件事

3、请说明CALL与RET指令的实现原理。

答:(以下内容选自《汇编语言 第二版》王爽著,第10章,仅针对16位系统,而32位及64位系统也可参考)

call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。

ret指令用栈中数据,修改IP的内容,从而实现近转移;

retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。

CPU执行ret指令时,进行下面两步操作:

(1)(IP)=((ss)*16+(sp))

(2)(sp)=(sp)+2

CPU执行retf指令时,进行下面4步操作:

(1)(IP)= ((ss)*16+(sp))

(2)(sp)=(sp)+2

(3)(CS)= ((ss)*16+(sp))

(4)(sp)=(sp)+2

可以看出,如果我们用汇编语法来解释ret和retf指令,则:

CPU执行ret指令时,相当于进行:

pop IP

CPU执行retf指令时,相当于进行:

pop IP
pop CS

CPU执行call指令时,进行两步操作:

(1)将当前的IP或CS和IP压入栈中;

(2)转移。

call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同。

(以下内容选自《0day安全:软件漏洞分析技术第2版》第2.1.5节)

函数调用大致包括以下几个步骤。

(1)参数入栈:将参数从右向左依次压入系统栈中。

(2)返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行。

(3)代码区跳转:处理器从当前代码区跳转到被调用函数的入口处。

……

call函数地址 ;call指令将同时完成两项工作:a)向栈中压入当前指令在内存中的位置即保存返回;地址。b)跳转到所调用函数的入口地址函数入口处

……

类似地,函数返回的步骤如下。

(1)保存返回值:通常将函数的返回值保存在寄存器EAX中。

(2)弹出当前栈帧,恢复上一个栈帧。

具体包括:

● 在堆栈平衡的基础上,给ESP加上栈帧的大小,降低栈帧,回收当前栈帧的空间。

● 将当前栈帧底部保存的前栈帧EBP值弹入EBP寄存器,恢复出上一个栈帧。

● 将函数返回地址弹给EIP寄存器。

(3)跳转:按照函数返回地址跳回母函数中继续执行。

还是以C语言和Win32平台为例,函数返回时的相关的指令序列如下。

add esp,xxx  ;降低栈帧,回收当前的栈帧
pop ebp      ;将上一个栈帧底部恢复到ebp
retn         ;这条指令有两个功能:a)弹出当前栈顶元素,即弹出栈帧中的返回地址。;至此,栈帧恢复工作完成。b)让处理器跳转到弹出的返回地址,恢复调用前;的代码区

本篇文章参考资料:

1、林文龙,“汇编指令助手 V1.1”,小龙软件工作室。

2、[美]DanKaminsky、Justin Ferguson、Jason Larsen、Luis Miras、Walter Pearce(著),看雪论坛翻译小组(译),《IDA Pro代码破解揭秘》,人民邮电出版社。

3、任晓珲,《黑客免杀攻防》,机械工业出版社。

4、王清(主编),张东辉、周浩、王继刚、赵双(编著),《0day安全:软件漏洞分析技术(第2版)》,电子工业出版社。

5、王爽,《汇编语言(第2版)》,清华大学出版社。

技术面试问题汇总第001篇:猎豹移动反病毒工程师part1相关推荐

  1. 技术面试问题汇总第004篇:猎豹移动反病毒工程师part4

    这次所讨论的三个问题,比如DLL以及HOOK,很容易被病毒木马所利用,因此必须要比较全面地进行了解.而异常处理机制,则往往与漏洞相关联.它们自身的概念并不难理解,只是由之引申而来的问题,在计算机安全领 ...

  2. 技术面试问题汇总第005篇:猎豹移动反病毒工程师part5

    这是我当初接受面试的最后两个问题,当时,那位面试官问我对漏洞了解多少时,我说一点都不懂,问我懂不懂系统内核时,我同样只能说不知道.后来他跟我说,面试的考查重点不在于我所掌握的知识的广度,而是深度.这也 ...

  3. 技术面试问题汇总第002篇:猎豹移动反病毒工程师part2

    这次拿三个问题来讨论,是关于调试器的.因为对于反病毒工程师而言,类似于OllyDbg和IDA的使用方法是必须掌握的,但是在面试中又不太方便考察,所以只能对其快捷键或者调试器实现原理之类的问题进行提问. ...

  4. 技术面试问题汇总第006篇:腾讯管家反病毒工程师-电话面试

    一.前言 我在2015年的1月5号的中午,很荣幸地参加了腾讯管家反病毒工程师的电话面试.其实能够接到这次的面试让我有些惊讶.首先,能够给腾讯投简历,纯属机缘巧合.其次,简历是1月4号下午投的,竟然还没 ...

  5. 技术面试问题汇总第007篇:腾讯管家反病毒工程师-电话二面

    我在1月8号的下午三点,接到了腾讯电脑管家反病毒工程师的电话二面.腾讯这次又是突然袭击,我丝毫没有准备.不过我上网看到有人竟然在晚上七点多还会接到腾讯的面试电话,这也就说明大家以后如果向腾讯投递了简历 ...

  6. 技术面试问题汇总第003篇:猎豹移动反病毒工程师part3

    从现在开始,面试的问题渐渐深入.这次的三个问题,都是对PE格式的不断深入的提问.从最初的概念,到病毒对PE格式的利用,再到最后的壳的问题.这里需要说明的是,由于壳是一个比较复杂的概念,面试中也仅仅只能 ...

  7. Java方向如何准备BAT技术面试答案(汇总版)

    转自:http://www.jianshu.com/p/1f1d3193d9e3 原文链接:Java方向如何准备BAT技术面试答案(汇总版) 这个主题的内容之前分三个篇幅分享过,导致网络上传播的比较分 ...

  8. 阿里、腾讯等大厂技术面试题目汇总

    Github地址:https://github.com/0voice/interview_internal_reference 每一个程序员估计都想挤进大厂吧,但是大厂不是你想进就能进,竞争程度堪比高 ...

  9. 开源项目推荐!2019阿里,腾讯,百度,美团,头条等大厂技术面试题目汇总

    每一个程序员估计都想挤进大厂吧,但是大厂不是你想进就能进,竞争程度堪比高考,你需要通过层层考验,虽说不需要三年高考五年模拟,但是刷笔试习题肯定是少不了的 像<程序员面试宝典>.<C和 ...

最新文章

  1. 金山网盾监测:游戏玩家下载西西游戏外挂会中大量***
  2. 33 多线程同步之Condition
  3. dojo发布者订阅者模式(topic.publish/topic.subscribe)
  4. spring中容器启动过程中初始化资源使用方法
  5. 689D Magic Odd Square 奇数幻方
  6. Intellij Idea 离线安装插件
  7. SpringCloud大致架构
  8. 采用信号量机制实现消费者与生产者的线程同步_Java线程通信
  9. 【操作系统】SPOOLing技术(外部设备联机并行操作/假脱机技术)
  10. wifi不断重连报错:eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON解决
  11. 同时启动两个android模拟器
  12. linux mint 8812ac网卡,kali虚拟机连接无线网卡comfast cf-812AC(Realtek 8812BU芯片)(不支持wlan0mon)...
  13. hashmap 存取原理图_HashMap原理(二) 扩容机制及存取原理
  14. Java基础内容整理(一)
  15. mooc作业怎么上传附件_社会组织年报附件上传常见问题解决方案
  16. python怎样控制继电器_使用Python和树莓派控制跨阵M2继电器通断
  17. 2019年支付宝集五福秘笈!内含攻略及互助群
  18. 柚鸥ASO优化:aso搜索优化怎么做
  19. 阿里性能调优工具Arthas
  20. java弹窗显示错误代码_打开电脑一直弹出“当前页面的脚本发生错误。代码0”...

热门文章

  1. 每天逛两次社交网站,每次都有新愤怒?​
  2. FPGA之蜂鸣器播放音乐《花海》
  3. 彩色艺术创意Mac动态壁纸
  4. java判断是否是数组_java判断对象是否是数组
  5. 从零开始构建矽璓工业物联操作系统:使用risc-v架构的hifive1 emulator
  6. c语言海伦公式编程注释,c语言 关于海伦公式 求助
  7. QBASIC在win8-64位系统中的编译及运行
  8. Linux测试环境搭建步骤
  9. HR软件切忌过度招标
  10. 人工智能时代,你的数学基础够用吗?