首先,就在此谢谢大家了……本人没什么本事,只是把刚学到的东西整理成笔记。
方便日后,以及其他跟我一样程度的人。
====[ 0x110 简单介绍下register
简单的来说,register就是当系统运行机器码时,负责管理那些系统的暂时性变数,或者是负责“导入”源文件。
在此列下:
EAX = Accumulator register
ECX = Counter register
EDX = Data register
EBX = Base register
还有些比较特殊的有ESP, EBP, ESI 和 EDI。虽然有的时候,它们被叫成了pointer,但是技术上还是被归类为register。主要的功能还是差不了多少,都是负责指向系统要读取还是写入的文件。
ESP = Stack register
EBP = Base pointer
ESI = Source index
EDI = Destination index
EIP = Intruction pointer === 比较特殊,负责指向目前执行的机器码指令
EFLAGS register === 标记一个指令的状况((包含状态旗标比如进位、溢出、结果为零,等等
每个暂存器(register)都有各自不同的功能,例如ECX可以被用来作loop指令的计数器那样
----[ 0x120 通过简单的helloworld程序深入了解register
作为一个程序员,我们大可以只着重于代码整洁,思路啊,结构就行了。但是作为一个黑客,逆向破解爱好者,我们必须从底层下手,深入了解程序的运作方式,这就是其魅力之所在。
现在,这里是一个C语言写的helloworld程序,功能就是打印10行hello, world!
// filename: helloworld.c 这是注释,不被机器读取
# include <stdio.h> // 链接 stdio.h 函数库, 接下来我们会用到里面的其中一个函数
int main() // main程序,C语言的主体部位
{
int i;
for(i=0; i < 10; i++) // 循环10次
{
printf("Hello, World!\n"); // 打印 Hello, World!
}
return 0; // 初始化 main 程序
}
一个C带源码,是单单起不了作用的,这只是方便程序员阅读的格式而已。我们要将它转换成机器码。linux下大可以用gcc或是cc。
$ gcc heloworld.c
$ ls
a.out
(gcc默认output文件名为 a.out)
然后运行:
$./a.out
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
----[ 0x130 认识机器码
话不多说,直接 objdump,系统默认的是AT&T语法。由于intel语法比较简洁,所以我们今天用的是intel语法。(( 由于显示资料量大,我们取 main() 的首二十行。
(( 较常用的汇编语法之中,就数 intel 和 AT&T 语法。
都是大同小异的,其中最大的不同点就是 % 和 $ 的出现。只有AT&T有这些符号,原因不详
$ objdump -D -M intel a.out | grep -A20 main.:
0804840c <main>:
804840c: 55 push ebp
804840d: 89 e5 mov ebp,esp
804840f: 83 e4 f0 and esp,0xfffffff0
8048412: 83 ec 20 sub esp,0x20
8048415: c7 44 24 1c 00 00 00 mov DWORD PTR [esp+0x1c],0x0
804841c: 00
804841d: eb 11 jmp 8048430 <main+0x24>
804841f: c7 04 24 d8 84 04 08 mov DWORD PTR [esp],0x80484d8
8048426: e8 c5 fe ff ff call 80482f0 <puts@plt>
804842b: 83 44 24 1c 01 add DWORD PTR [esp+0x1c],0x1
8048430: 83 7c 24 1c 09 cmp DWORD PTR [esp+0x1c],0x9
8048435: 7e e8 jle 804841f <main+0x13>
8048437: b8 00 00 00 00 mov eax,0x0
804843c: c9 leave
804843d: c3 ret
804843e: 90 nop
804843f: 90 nop
由上面的显示数据,依序排列的是 :
804840c, 804840d 啊这些都是位址,是标记这指令的位置的位址。
55, 89 e5 啊这些都是机器码。
然后后半段都是汇编啦!汇编是其中一种底层编程语言,每个指令都对应着各自的机器码
==== TO BE CONTINUED ====
先此致谢,望大家海涵本人的笨黜发水文了
[培训]《安卓高级研修班(网课)》月薪三万计划