汇编1-进制、数据宽度、通用寄存器、汇编指令、内存寻址
系统学习一下免杀,纯属个人笔记。禁止搬运。课是别人的,要删联系我即可。刚考完就火急火燎的来学免杀了,感觉还是网安好啊,正反馈十足,考研这b东西,真恼火。唉,也不知道考得上不这次。
首先记录一些杂七杂八的东西
杂项
位数的知识扩展
比如一个计算机的位数是4,那他的数据宽度就只能存0000-1111(二进制)这么多。也就是0-15
那么以此类推,32位的系统的数据宽度也能算出来。
通用寄存器
哎哟有水印,我这个知识个人笔记哈,这一篇的内容反正百度也能拿到的。
vs的一些基础小用
比如说你要看c语言的代码的反汇编,先下个断点,然后直接运行,右键进入反汇编即可
od
单步走是按f8
od中,改变的寄存器或者说是数据,会变成红色
汇编指令
mov
mov 把后面的参数覆盖掉前面指定的寄存器中去(前后的寄存器的数据宽度必须是一样的,而如果后面的参数是数据的话,那么只会取后8位的数据放到前面的寄存器中去)
add
两个参数,参数相加之后,放到第一个参数的寄存器里面去,这里的寄存器记得也要保持位数相同。
sub
这就是相减了
and
这个就是位运算了,会对每一位都进行运算,
就像这样,有0则全为0,全是1则是1.
这里值得注意的是,od里面的数都是十六进制的哈,而位运算都是基于二进制算的。举个栗子,0x6和0x9进行运算,那就是0110和1001进行运算,那结果就是0.
or
同and,只不过是或的关系。
xor
那异或呢
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
not
就是取非,1变成0,0变成1。
内存寻址
基础指令-取(改)内存里面的值
嘿嘿我的网安,我爱网安。
寄存器是存在于cpu里面的,所以运算速度相比内存来说,就很快。但是cpu的空间不够,
这里值得注意点的是,ESP EBP这两个是存储内存地址的(和堆栈有关),而EAX ECX EDX EBX这四个基本上使用来存储十六进制数据的。acdb,数据的存储数据基本是按照这个顺序存入的。
byte是1字节,8bit。
word是1字,16bit
dword 双字,32bit
qword 64bit
在计算机里面每个字节都有一个编号,这里可以认为内存的编号就是字节,在32位下范围为00000000-FFFFFFFF,最大的殉职范围就是FFFFFFFF+1字节,转换过来就是4G
这时候咱们就举个栗子比如说,我们要将一个8位的通用寄存器里面的内容放到一个8位的内存中去mov m8 r8
mov byte ptr ds:[0x19FF74],al
mov dword ptr ds:[0x19FF74],eax
其中,byte和dword是单位嘛,就是指几位。
而ptr是一个关键字,表示指针,表示后面这个ds:[0x19FF74]是个指针
而ds:[0x19FF74]则是一个内存地址ds 是data segment register,即数据段寄存器。
这里值得注意的是,中括号括起来的东西是一个内存地址,而不是立即数。
lea
这个指令是寻找内存地址的意思,lea eax,dword ptr ds:[ecx]
是取ecx的地址(和c语言的指针差不多)
栗子
第一行,把后面的立即数存到ecx寄存器中
第二行,把ecx存的立即数作为地址,将这个地址中的内容存到eax里面去。
第三行,把立即数存到edx寄存器中
第四行,把后面的立即数存到edx存的地址所指向的内存中去
第五行,表示取edx存的地址,存到eax寄存器中去
第六行,表示讲edx寄存器所指向的内存中存的东西,存到eax中区
(课里面有个好厉害的师傅,感觉什么都能想到,举一反三,我感觉啥也不懂一样像个呆瓜捏。)慢慢学把,加油捏。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。