blog1

第一天

汇编语言

余枫洁

字长

8Bit=1Byte 2Byte=1Word 2Word=1Dword 2Dword=1Qward

1.寄存器

32位寄存器有16个,分别是:
4个数据寄存器(EAX、EBX、ECX、EDX)。
2个变址和指针寄存器(ESI和EDI);2个指针寄存器(ESP和EBP)。
6个段寄存器(ES、CS、SS、DS、FS、GS)。
1个指令指针寄存器(EIP);1个标志寄存器(EFlags)。
4个数据寄存器为通用寄存器,有特殊用途但用处不大。ESI、EDI、SI和DI称为变址寄存器,它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器。EBP、ESP、BP和SP称为指针寄存器,主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器。指令指针EIP、IP是存放下次将要执行的指令在代码段的偏移地址,标志寄存器目前只需了解ZF零标志位。

寻址方式

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

汇编语言基本指令(需要熟练掌握的)

cmp a,b 比较a与b;
mov a,b 把b的值送给a;ret 返回主程序
nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面
(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop);
call 调用子程序;
je 或jz 若相等则跳(机器码74 或0F84);
jne或jnz 若不相等则跳(机器码75或0F85);
jmp 无条件跳(机器码EB);
jb 若小于则跳;
ja 若大于则跳;
jg 若大于则跳;
jge 若大于等于则跳;
jl 若小于则跳;
jle 若小于等于则跳;
pop 出栈;
push 压栈。

剩下的查询此链接
【CSDN博客】(https://blog.csdn.net/wangbaochu/article/details/41850779){:target="_blank"}

在ollydbg上的两个练习

(1)

先找到Hellow Word.exe文件的主函数,用F7、F8或字符串检索法寻找。


找到Hellow word复制其地址004092A0

在地址右键点击转到/表达式,确定就可以找到Hellow word的HEX数据进行修改来改变程序输出结果。
第二个任务直接右键点击汇编在图一选中项上,输入jmp与retn的地址,这样程序执行时就不会有弹窗。

(2)

修改fact.exe的错误,同样先找出主函数。

程序功能是数学阶乘运算,输入5发现输出为24,说明可能少乘一个5,分析可知图中这串代码是指大于等于输入值就弹出,所以讲jge(大于等于)改为ja(大于)。

注意:ollydbg的快捷键使用与C语言知识