了解由 objdump 创建的转储
Understanding this dump created by objdump
我对汇编语言还很陌生。我已经研究了 2 周了。
这是 objdump 生成的转储。 objdump -Mintel -d stack
00000560 <function>:
560: 55 push ebp
561: 89 e5 mov ebp,esp
563: 83 ec 10 sub esp,0x10
566: e8 26 00 00 00 call 591 <__x86.get_pc_thunk.ax>
56b: 05 95 1a 00 00 add eax,0x1a95
570: 90 nop
571: c9 leave
572: c3 ret
00000573 <main>:
573: 55 push ebp
574: 89 e5 mov ebp,esp
576: e8 16 00 00 00 call 591 <__x86.get_pc_thunk.ax>
57b: 05 85 1a 00 00 add eax,0x1a85
580: 6a 03 push 0x3
582: 6a 02 push 0x2
584: 6a 01 push 0x1
586: e8 d5 ff ff ff call 560 <function>
58b: 83 c4 0c add esp,0xc
58e: 90 nop
58f: c9 leave
590: c3 ret
我目前正在学习堆栈。我不确定 prolog 是否只适用于函数。我在 main 函数的第三行没有看到 sub
。不确定序言是否总是使用该模式。
我也很困惑 <__x86.get_pc_thunk.ax>
不知道是什么。
我也想知道为什么它要将 0x1a95 添加到 eax 并且我不确定它为什么选择那个数字。基本上,添加到 eax 的值是 0x1a85.
这是我用gcc编译的c。我用了 gcc -m32 -ggdb stack.c -o stack
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1, 2,3 );
}
现在我试图在反汇编代码中找到 buffer1 和 buffer2。我猜 buffer1[5] 是 0x05,buffer2[10] 是 0x0a。我在反汇编代码中找不到。
数组buffer1
和buffer2
分配在栈上,使用指令
sub esp, 0x10
它所做的是从堆栈指针的当前值减去 0x10
或 16
,即 esp
,这会增加函数中的堆栈 space 16 个字节(char
是一个字节,buffer1
中有 5 个字节,buffer2
中有 10 个字节,出于对齐原因,结果四舍五入为 16 个字节, AFAIK)。 main()
中没有这样的指令,因为它没有局部变量,因此不需要堆栈 space.
(这在本书的第 4 章中有更详细的解释:http://pacman128.github.io/pcasm/)
我对汇编语言还很陌生。我已经研究了 2 周了。
这是 objdump 生成的转储。 objdump -Mintel -d stack
00000560 <function>:
560: 55 push ebp
561: 89 e5 mov ebp,esp
563: 83 ec 10 sub esp,0x10
566: e8 26 00 00 00 call 591 <__x86.get_pc_thunk.ax>
56b: 05 95 1a 00 00 add eax,0x1a95
570: 90 nop
571: c9 leave
572: c3 ret
00000573 <main>:
573: 55 push ebp
574: 89 e5 mov ebp,esp
576: e8 16 00 00 00 call 591 <__x86.get_pc_thunk.ax>
57b: 05 85 1a 00 00 add eax,0x1a85
580: 6a 03 push 0x3
582: 6a 02 push 0x2
584: 6a 01 push 0x1
586: e8 d5 ff ff ff call 560 <function>
58b: 83 c4 0c add esp,0xc
58e: 90 nop
58f: c9 leave
590: c3 ret
我目前正在学习堆栈。我不确定 prolog 是否只适用于函数。我在 main 函数的第三行没有看到 sub
。不确定序言是否总是使用该模式。
我也很困惑 <__x86.get_pc_thunk.ax>
不知道是什么。
我也想知道为什么它要将 0x1a95 添加到 eax 并且我不确定它为什么选择那个数字。基本上,添加到 eax 的值是 0x1a85.
这是我用gcc编译的c。我用了 gcc -m32 -ggdb stack.c -o stack
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1, 2,3 );
}
现在我试图在反汇编代码中找到 buffer1 和 buffer2。我猜 buffer1[5] 是 0x05,buffer2[10] 是 0x0a。我在反汇编代码中找不到。
数组buffer1
和buffer2
分配在栈上,使用指令
sub esp, 0x10
它所做的是从堆栈指针的当前值减去 0x10
或 16
,即 esp
,这会增加函数中的堆栈 space 16 个字节(char
是一个字节,buffer1
中有 5 个字节,buffer2
中有 10 个字节,出于对齐原因,结果四舍五入为 16 个字节, AFAIK)。 main()
中没有这样的指令,因为它没有局部变量,因此不需要堆栈 space.
(这在本书的第 4 章中有更详细的解释:http://pacman128.github.io/pcasm/)