0%

实习面试准备

最近想投实习(主要是不想跟着学校的,但这样的话给分又低,就开始纠结,反正不管最后怎么决定,就当学习了),搜集并准备了一些专业方面的面试问题,有些东西还没写完,实时更新。。

Windows方面

调试器原理,异常分发流程,反调试及反反调试

x86系列处理器从其第一代英特尔8086开始就提供了一条专门用来支持调试的指令,即INT3。简单的说,这条指令的目的就是使CPU中断(break)到调试器,以供调试者对执行现场进行各种分析。当我们调试程序时,可以在可能有问题的地方插入一条INT3指令,使CPU执行到这一点时停下来。这便是软件调试中经常用到的断点功能,因此INT3指令又称为断点指令。

在调试器下,我们看不到动态替换到程序的INT 3指令。大多数调试器的做法是在调试目标被中断到调试器之前,会先将所有断点位置被替换为INT 3的指令恢复成原来的指令,然后再把控制权交给用户。

调试寄存器一共有8个名字分别从Dr0-Dr7。所以我们也把调试寄存器简单的称为Drx。

DR4和DR5是保留的,当调试扩展功能被启用(CR4寄存器的DE位设为1)时,任何对DR4和DR5的引用都会导致一个非法指令异常,当此功能被禁止时,DR4和DR5分别是DR6和DR7的别名寄存器,即等价于访问后者。其他的6个寄存器:

  • 4个32位的调试地址寄存器(DR0-DR3),64位下是64位的
  • 1个32位调试控制寄存器(DR7),64位时,高32位保留未用
  • 1个32位调试状态寄存器(DR6),64位时,高32位保留未用

步入和步过

对于ROM中执行的程序,无法动态增加软件断点。因为目标内存是只读的,无法动态写入断点指令。这时就需要使用硬件断点。

在中断向量表或中断描述表(IDT)没有准备好或遭破坏的情况下,这类断点是无法或不能正常工作的,比如系统刚刚启动时或IDT被病毒篡改后,这时只能用硬件级的调试工具

SEH是window操作系统默认的异常处理机制,逆向分析中,SEH除了基本的异常处理功能外,还大量用于反调试程序(这里SEH时保存在栈中的,漏洞利用的时候会用到)

1.SEH

SEH是windows操作系统异常处理机制,在程序源代码中使用try,except,finally关键字来具体实现。

2.OS异常处理的办法

2.1正常运行时候的异常处理方法

进程运行过程中若发生异常,OS会委托进程进行处理。若进程代码中存在具体的异常处理(如SEH异常处理器)代码,则能够顺利处理相关异常,程序继续运行,但如果进程内部没有具体实现SEH,那么相关异常就无法处理,OS就会启动默认的异常处理机制,终止进程运行

2.2 调试运行时的异常处理方法

被调试的进程内部发生异常,OS会首先把异常抛给调试进程处理。调器拥有被调试者的所有权限。被调试者内部发生的异常都由调试器处理。调试过程中的所有异常都先由调试器管理。被调试者发生异常时,调试器会停止运行,必须采取相应的措施来处理异常,完成后续的调试。遇到异常的时候的处理方法如下。

1)直接修改异常:代码、寄存器、内存

2)将异常泡杯被调试程序,使用od的shift+f7/f8/f9直接将异常抛还给被调试者

3)OS默认异常处理机制

SEH和TopLevelEH无法捕获异常的情况。
只有处于手写的汇编代码中才有这样的问题。经过试验,增加vch后能正常捕获到异常。
众所周知,windows上32位程序的栈回溯依靠ebp及pdb文件。当调用链不存在FPO时,通过ebp即可以遍历所有的堆栈,否则需要依靠pdb中存储的FPO信息来完成完整的堆栈回溯。
而x64环境中,rbp作为普通的非易失寄存器,已经不具备栈帧寄存器的作用,那么64位的堆栈回溯如何实现呢?
其实我们思考一下就能知道,只能通过rsp来回溯整个堆栈。一个典型的函数调用堆栈的数据分布(从高到底)为:调用参数,返回地址,局部变量地址。如果我们能知道局部变量占用了多少栈空间,就能根据当前的rsp地址定位到返回地址的地址。
其实在x86中我们也能做类似操作。在pdb遗失的情况下,我们检查汇编中返回地址的地址与当前esp的差值,就能找到fpo的函数的返回地址。
当时x86与x64有一些差异,导致使用这种方法回溯的难度不同。x86对堆栈的push或者sub操作可以遍布在整个函数中,我们经常能看到调用子函数之前的push操作,这样就增加了计算当前esp到ret addr 偏移的难度。
而x64保证了对栈的push和sub操作只存在在prolog中。我们只要看函数的开头就能知道rsp与ret addr的偏移。
另外x86的SEH链直接在栈上保存(资料很多),而x64的SEH异常处理信息保存在PE文件中。具体可以查看:https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64?view=vs-2019
我们可以在windbg中使用 .fnent 来查看prolog 信息。

病毒木马原理,常见隐藏以及通讯方法

木马病毒,是病毒的特殊形式,它与一般病毒的区别是它不仅停留在本机电脑里,更利用一些手段开放电脑端口获得与木马服务器的通信,达到获取用户信息的目的。

启动隐藏,文件隐藏,进程隐藏

通讯方法

  • 正向模式是木马被控端在宿主机器上开放一个端口,等待控制端来主动连接,对一些有公网地址的目标非常有效。
  • 反向通信是被控端在启动后,主动和控制端连接通信的过程,这种方式不要求被控制机器有公网地址,但控制端需要有公网地址。

https://www.cnblogs.com/17bdw/p/9770635.html

常见分析工具比如ida od windbg等用法,及对应的脚本;

常见壳原理,以及脱壳方法和平时操作心得;

如果是upx壳,pushad, 然后看到popad, jump xxx 的时候, 就找到真实的入口地址, 然后把后面的数据dump出来, 生成一个新的exe

vmp壳

1.与传统的加壳工具不同,不是简单的把目标进行压缩、内存解压运行,而是修改目标源码,让目标的部分指令在vmp创建的虚拟环境下运行,虚拟环境中无操作数比较指令、条件跳转和无条件跳转指令;
2.被修改替换的目标指令最终形成的字节码有前后相关性,即你改变其他任意一个字节会影响到所有被vm虚拟化的指令
3.vmp的虚拟机其实是一个字节码解释器,循环的读取指令并执行,并且只有一个入口和一个出口
4.虚假跳转和垃圾指令, vmp会使用大量的虚拟跳转和垃圾指令将原有简单的代码变得复杂
5.vmp是基于堆栈的虚拟机,虚拟机指令不是显示的读取参数,而是把要使用的参数压入堆栈,而后直接从堆栈中读取
6.vmp指令
1)算数运算和移位运算
2)堆栈操作
3)系统相关
4)逻辑运算,这个最复杂,vmp中只有一个逻辑运算指令nor, 它可以模拟not and or xor 四个逻辑运算指令
6.vmp寄存器轮转
mvp将所有的寄存器都放在一个堆栈的结构vm_context中, 结构中的每一项代码一个寄存器或临时变量
在程序运行过程中, vm_context结构中保存的寄存器不是固定的,每当执行完一个操作或一个指令结构中的项与真实寄存器之间的映射关系会发生变化,就像一个齿轮随机的转动了一下, 转动过后原有的映射关系全部改变了
7.字节码加密和随机效验
随机效验比较牛B, vmp会在编译好的字节码中加入自己的一些指令(专属于vmp自动的指令), 每一次执行都会对一段代码随机生成hash值, 然后与另一个随机数相加, vmp要求相加的结果必须为0, 否则会出错.

5.windows编程;
6.tcp通信原理及应用;
7.看雪 52破解上等国外论坛发表的博客;
8.二进制漏洞原理,利用方法,缓解方法和平时分析和挖掘利用等过程;
9.windows内核从xp到现在win10的变化,以及写驱动hook等相关知识;
10.crackme 病毒木马外挂软件破解分析经验。

安卓

la0s

https://la0s.github.io/2019/05/13/chunzhao/

搜集

x86汇编语言,几个跳转指令,堆和栈的区别,函数调用过程

硬件断点和软件断点

webview组件远程代码执行漏洞原理

root判断

elf壳: 说了一下手脱360和爱加密经历

so加密方法: 说了一下section加密和函数加密

资源加密方法: 不会

apktool源码看过吗?讲讲

windows 脱壳技巧

x86汇编问了几个指令对标志寄存器的影响

堆溢出与栈溢出shellcode怎么写

对称加密 AES DES

非对称加密 RSA 详细描述秘钥生成过程