新手上路
作者胡扯:
第一次接触到博客这种东西,这是加入信息安全的第一篇文章,只是写写自己刚刚学到的知识。
昨天刚刚跟着教程,在学长指导下,搭建了博客,过程很是痛苦,各种指令完全不懂,好在有大佬的指导,勉勉强强搭好了博客,却还有许多需要改进的地方。
而今天才能算学习刚刚开始,一个上午从学长那里初步了解了信安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(大于)即可。(主要介绍如何改动)
接下来进行保存操作
会弹出一个界面,继续右键保存即可
最后运行更改后的程序
修改成功,答案正确!