gpt4 book ai didi

assembly - 此调用(汇编)后的以下指令是什么

转载 作者:行者123 更新时间:2023-12-02 20:51:50 24 4
gpt4 key购买 nike

我目前正在分析一个恶意软件。我已经识别了几种类型的 shell,其中一种是 icmp shell。在下面的屏幕截图中,您可以看到压入堆栈的 0x804af87 处的值,即“icmp”。这是为了满足 getprotobyname 中的“char *name”。

icmp_shell asm screenshot

但是,在调用电话后,有一些指示对我来说没有意义。我理解这些说明本身,但我无法理解它们对此 icmp shell 可能执行的操作。

例如,在 getprotobyname 调用之后,0x10 会立即添加到堆栈指针中。这样做的目的是什么?并按顺序执行以下说明。

最佳答案

这是您正在分析的文本形式的代码:

mov   DWORD PTR [ebp-0x1c], 0x1f90
sub esp, 0xc
push 0x804af87
call 0x8048cc0 <getprotobyname@plt>
add esp, 0x10
mov DWORD PTR [ebp-0x102c], eax
sub esp, 0x4
mov eax, DWORD PTR [ebp-0x102c]

让我们一次看一条指令,以确保我们理解他们在做什么:

  1. mov DWORD PTR [ebp-0x1c], 0x1f90

    这存储常量 0x1f90在堆栈上,特别是在位置ebp-0x1c ,位于当前基指针 ( ebp ) 后面 28 个字节。

  2. sub esp, 0xc

    这会从堆栈指针 ( esp ) 中减去 12 个字节,这实际上会在堆栈上分配一些空间。您这样做要么是因为您需要在那里存储一些数据,要么是因为您要在需要特定对齐方式的 ABI 下进行函数调用(例如 the System V ABI for x86 )。

  3. push 0x804af87

    这会插入常量值 0x804af87到堆栈上,这会隐式地将堆栈指针减少 4 个字节并将值存储在那里。

    这很可能是为了准备函数调用而完成的,因为许多 x86 调用约定在堆栈上传递参数。

  4. call 0x8048cc0 <getprotobyname@plt>

    这称为 getprotobyname函数,位于绝对地址 0x8048cc0 .

  5. add esp, 0x10

    这会向堆栈指针 ( esp ) 添加 16 个字节,从而清理我们之前在堆栈上占用的空间。回想一下,我们之前将堆栈指针递减 12 个字节,然后将 4 字节值压入堆栈,总共 16 个字节。该指令有效地“撤消”了这一点,释放了我们不再需要的堆栈空间。

    某些调用约定要求调用者在函数调用后清理堆栈;显然,这段代码正在使用这样的调用约定。

  6. mov DWORD PTR [ebp-0x102c], eax

    在此代码的调用约定中,函数的返回值存储在eax中。登记。 (对于我所知道的所有 x86 调用约定中的所有整数大小的返回值都是如此。)因此, getprotobyname 的结果函数(在 eax 中)将存储在内存中的位置 ebp-0x102c ,位于当前基指针 ( ebp ) 后面 4140 字节。

  7. sub esp, 0x4

    这会从堆栈指针中减去 4 个字节,从而有效地在堆栈上分配 4 个字节的存储空间。

  8. mov eax, DWORD PTR [ebp-0x102c]

    这将检索内存中位置 ebp-0x102c 处的值,并将其存储在eax中注册。

现在我们了解了这里发生的情况,很明显这是次优代码,并且其中一些指令是多余的/多余的。

特别是getprotobyname函数的返回值从 eax 开始,存储到内存中,然后从内存中检索并放回 eax 。这些都没有必要。所有这些指令都可以消除。

此外,向堆栈指针添加 16 个字节,然后从堆栈指针减去 4 个字节,与向堆栈指针添加 12 个字节相同。因此,这些addsub指令可以合并为一个。没有明显的理由将它们分开说明。

我猜测这是您正在查看的未优化代码(例如可能由禁用优化的 C 编译器生成),或者这是程序员故意完成的用于填充(而不是插入 nop 指令)。

更优化(也更理智)的代码版本如下:

mov   DWORD PTR [ebp-0x1c], 0x1f90     ; store value in memory
sub esp, 0xc ; allocate 12 bytes of stack space
push 0x804af87 ; push function argument
call 0x8048cc0 <getprotobyname@plt> ; call function
add esp, 0xc ; clean up stack space
; function's return value is now in EAX—use as desired
; ...
; if you like, store it in memory:
; mov DWORD PTR [ebp-0x102c], eax

正如 Gene 在评论中建议的那样,请务必了解标准 x86 调用约定,特别是 __cdecl调用约定。详细信息可以查看标签维基。

关于assembly - 此调用(汇编)后的以下指令是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41971481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com