【发布时间】:2017-01-16 04:57:32
【问题描述】:
我有这个 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 代表基本指针。它的作用是什么?
我看到在第二行中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 是指调用者推送的参数的数量。这对我来说不是很清楚。
你能帮我理解吗?
【问题讨论】:
-
我想知道你为什么要开发漏洞利用程序?当前的 SW 已经很故障了,而且工作多次纯属偶然。如今,通常不通过常规使用来降低它比通过利用来崩溃它要付出更多的努力。害怕做一些真正的编码,所以你想保持简单的一面?
-
我从事信息安全工作,我也想学习漏洞利用开发。简单的。无论如何,这只是一个无害的问候词示例。你能帮我好好理解一下代码吗?
-
我正在尝试,但是您有很多问题,而且您对此很陌生,因此返回一些教程和文档以及一些计算机体系结构书籍等可能会更有意义...我正在写一些部分答案,但不要期望太多。
-
顺便说一句,这个“简单无害的你好世界”看起来像是从动态库中加载
printf。因此,如果您在执行此操作期间以某种方式(通过某种攻击)注入恶意 dll,使用已修补的恶意printf版本,它可能会造成很多伤害(至少在您运行 hello world 的上下文中,除非该恶意代码使用其他一些错误来提升它的权限并转义当前上下文等......)。 ......“无害”就这么多......:D -
甚至还有不同的语法、不同的汇编程序、操作系统和另一个操作系统之间的差异......架构和另一个架构的差异(虽然现在我专注于 x86),所以迷路很容易而且它需要许多先决条件..