我正在研究 x86 架构和汇编,以便为研究逆向和开发开发奠定基础。我正在学习关于 opensecuritytraining.info 的课程。
我看到一个 Hello World 示例:
push ebp
mov ebp, esp
push offset aHelloWorld; "Hello world\n"
call ds:__imp__printf
add esp, 4
mov eax, 1234h
pop ebp
retn
此代码由 Windows Visual C++ 2005 生成,关闭缓冲区溢出保护,并使用 IDA Pro 4.9 免费版反汇编。
我试图了解每一行的作用。
第一行是push ebp。
我知道ebp代表base pointer。它的功能是什么?
我看到在第二行中的值esp被移入ebp并在线搜索我看到前两条指令在汇编程序的开头非常常见。
虽然是ebp和esp一开始是空的?我是组装新手。被ebp用于堆栈帧,所以当我们有一个函数在我们的代码是其可选的一个简单的程序?
然后 push offset aHelloWorld; "Hello world\n"
后面的部分;是评论所以它不会被执行对吗?第一部分将包含字符串 Hello World 的地址添加到堆栈中,对吗?但是字符串在哪里声明?我不确定我是否理解。
然后 call ds:__imp__printf
它似乎是对函数的调用,无论如何printf是内置函数,对吗?而且也ds代表数据段寄存器?使用它是因为我们试图访问不在堆栈上的内存操作数吗?
然后 add esp, 4
我们要向 esp 添加 4 个字节吗?为什么?
那么move eax, 1234h 这里的 1234h 是什么?
然后pop ebx..它在开始时被推了。最后有必要弹出吗?
然后retn(我知道ret在调用函数后返回一个值)。我读到 retn 中的 n 是指调用者推送的参数数量。对我来说不是很清楚。你能帮我理解吗?