作者胡扯:

第一次接触到博客这种东西,这是加入信息安全的第一篇文章,只是写写自己刚刚学到的知识。
昨天刚刚跟着教程,在学长指导下,搭建了博客,过程很是痛苦,各种指令完全不懂,好在有大佬的指导,勉勉强强搭好了博客,却还有许多需要改进的地方。
而今天才能算学习刚刚开始,一个上午从学长那里初步了解了信安ctf几个方向:web,re,pwn。然后半天速成了下汇编语言,初步了解(实则完全不懂)。对我来说,这是一个新的世界,不过还挺有趣。但还是会有糟糕的事情,win7虚拟机一开机就卡到炸,更不用说使用虚拟机上的吾爱破解工具。最后也只能在物理机上使用。

以下为正经内容:

10种寄存器(4种通用+4种特殊+标志寄存器):

寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
  • EAX:相对其他寄存器,在进行运算方面比较常用。在保护模式中,也可以作为内存偏移指针
  • EBX:通常作为内存偏移指针使用(相对于EAX、ECX、EDX),在保护模式中,同样可以起这个作用。
  • ECX:通常用于特定指令的计数。在保护模式中,也可以作为内存偏移指针
  • EDX:在某些运算中作为EAX的溢出寄存器(例如乘、除)。
  • ESP:常用于椎栈操作。通常,它被高级语言编译器用以建造‘堆栈帧’来保存函数或过程的局部变量
  • EBP:常用于椎栈操作。通常,它被高级语言编译器用以建造‘堆栈帧’来保存函数或过程的局部变量
  • ESI:通常在内存操作指令中作为“源地址指针”使用。ESI可以被装入任意的数值
  • EDI:通常在内存操作指令中作为“目的地址指针”使用。当然,EDI也可以被装入任意的数值,
  • EIP:指令指针,这是一个32位宽的寄存器,同CS一同指向即将执行的那条指令的地址,存放指令的偏移地址。不能够直接修改这个寄存器的值,修改它的唯一方法是跳转或分支指令。
  • 标志寄存器(PSW):

    OF:溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
    DF:方向标志DF位用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
    IF:中断允许标志IF位用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
    (1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求
    (2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
    TF:跟踪标志TF。该标志可用于程序调试。TF标志没有专门的指令来设置或清除。
    (1)如果TF=1,则CPU处于单步执行指令的工作方式,此时每执行完一条指令,就显示CPU内各个寄存器的当前值及CPU将要执行的下一条指
    (2)如果TF=0,则处于连续工作模式。
    SF:符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为非负数时,SF的值为0,否则其值为1。当运算结果没有产生溢出时,运算结果等于逻辑结果(即应该得到的正确的结果),此时SF表示的是逻辑结果的正负,当运算结果产生溢出时,运算结果不等于逻辑结果,此时的SF值所表示的正负情况与逻辑结果相反,即:SF=0时,逻辑结果为负,SF=1时,逻辑结果为非负。
    ZF:零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
    AF:( Assistant Carry Flag)下列情况下,辅助进位标志AF的值被置为1,否则其值为0:
    (1)、在字操作时,发生低字节向高字节进位或借位时
    (2)、在字节操作时,发生低4位向高4位进位或借位时。
    PF:奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
    CF:进位标志CF主要用来反映无符号数运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

五种寻址方式:

  • 立即数寻址MOV EAX,123H
  • 寄存器寻址MOV EAX,EBX
  • 直接寻址MOV EAX,[12345678H]
  • 寄存器寻址MOV EAX,[EBX]
  • 乱七八糟寻址MOV EAX,123[BX][SI]

    汇编小部分常用的指令(只是部分):

  • 数据传送MOV,PUSH,POP,LEA,MOVSX,PUSHAD,POPAD
  • 算数运算:ADD,INC,SUB,DEC,NEG,CMP,MUL,IMUL,DIV,IDIV
  • 逻辑运算:AND,OR,NOT,XOR,TEST,SHL,SAL,SHR,SAR,ROL,ROR,RCL,RCR
  • 转移指令:JMP.J[N]Z[E],J[N]B,JA,JL,JG
  • 循环指令:LOOP,JCXZ
  • 串操作:MOVS[B]W[D],CMPS,SCAS,LODS,STOS,REP
  • 其他指令:INT,RET,NOP,CLD,CALL

    Ollydbg:

    几个常用快捷键

寻找程序中的主函数方法(学长总结):

  • 代码执行法
    与前一方法类似,不过是按住F7,一条一条代码执行,到主函数弹窗。
  • 层层推进法

    使用Ollydbg打开HelloWorld.exe程序后的界面,按住F8可执行程序,与代码执行法不同,它会跳过一些函数,更为效率。直到弹窗弹出,如下图:

    此时紫色条对应的就是主函数或者调用主函数的函数,总而言之,主函数就在这条语句内。
  • 字符串检索法
  • API检索法
  • 特征法(老司机使用)

    编辑更改汇编语言(eg)

    现有fact.exe,用于计算阶乘,程序有误。
    使用Ollydbg打开程序,利用层层推进法找到主函数

    通过阅读汇编语言,找出错误点,该程序问题是要将选中的语句的jge(大于等于)改为jg(大于)即可。(主要介绍如何改动)

    接下来进行保存操作

    会弹出一个界面,继续右键保存即可
    最后运行更改后的程序

    修改成功,答案正确!