Assembly 继续获取e8 00作为调用程序集中函数的机器代码
我知道在我的文件中使用Assembly 继续获取e8 00作为调用程序集中函数的机器代码,assembly,linker,x86,disassembly,machine-code,Assembly,Linker,X86,Disassembly,Machine Code,我知道在我的文件中使用objdump-dr时,call在机器代码中显示为e8 00,因为它尚未链接。但是我需要找出链接器完成工作后,00将变成什么。我知道它应该计算偏移量,但我对此有点困惑 作为下面代码的一个示例,链接器部分完成后,e8 00应该如何处理?我怎么才能得到这个答案呢 我正在使用以下示例代码进行测试:(我正在尝试调用moo) 节的反汇编。文本: 0000000000000000 : 0:55推送%rbp 1:48 89 e5 mov%rsp,%rbp 4:89 7d fc mov%e
objdump-dr
时,call
在机器代码中显示为e8 00
,因为它尚未链接。但是我需要找出链接器完成工作后,00
将变成什么。我知道它应该计算偏移量,但我对此有点困惑
作为下面代码的一个示例,链接器部分完成后,e8 00
应该如何处理?我怎么才能得到这个答案呢
我正在使用以下示例代码进行测试:(我正在尝试调用moo)
节的反汇编。文本:
0000000000000000 :
0:55推送%rbp
1:48 89 e5 mov%rsp,%rbp
4:89 7d fc mov%edi,-0x4(%rbp)
7:8b 45 fc mov-0x4(%rbp),%eax
a:83 e8 0a子$0xa,%eax
d:5d pop%rbp
e:c3 retq
000000000000000 F:
f:55%按需付费
10:48 89 e5 mov%rsp,%rbp
13:89 7d fc mov%edi,-0x4(%rbp)
16:b8 01 00 mov$0x1,%eax
1b:5d pop%rbp
1c:c3 retq
00000000000000 1D:
1d:55%推送rbp
1e:48 89 e5 mov%rsp,%rbp
21:48 83欧共体10分$0x10,%rsp
25:c7 45 fc 8e 0c 00移动$0xc8e,-0x4(%rbp)
2c:8b 45 fc mov-0x4(%rbp),%eax
2f:89 c7 mov%eax%edi
31:e8 00呼叫36
32:R_X86_64_PC32 moo-0x4
36:89 45 fc mov%eax,-0x4(%rbp)
39:b8 00 mov$0x0,%eax
3e:c9-q
3f:c3 retq
使用objdump-r
您可以使用反汇编-d
打印重新定位:
31: e8 00 00 00 00 callq 36 <main+0x19>
32: R_X86_64_PC32 moo-0x4
如果要编译代码而不重新定位,请显示源代码和编译选项。我知道的几种体系结构上的目标文件和可执行文件不一定在链接时修复跳转目标 这是一个提供灵活性的功能 在指令执行之前,跳转目标地址不必固定。它们不需要在链接时甚至在程序启动时修复 大多数系统(Windows、Linux、Unix、VAX/VMS)在目标代码中将这些位置标记为需要调整的地址。还有关于目标地址是什么、它是什么类型的引用(如绝对或相对;16位、24位、32位、64位等)的附加信息 那里的零值不一定是占位符,而是用来计算结果的基值。例如,如果指令出于任何原因-
调用5+外部地址
,则目标代码中可能存在5
(e8 05 00
)
如果要查看执行时的地址,请在调试器下运行程序,在该指令处放置断点,然后在指令执行前查看该指令
一种常见的反病毒、增强安全性的功能称为ASLR(),它故意在不一致的地址加载程序段,以阻止恶意代码更改程序或数据。在此环境中运行的程序可能在程序运行一段时间后才分配某些目标地址
(与此相关的是,VAX/VMS特别有一个复杂的修正模式,其中一个方程描述了计算值所需的运算。运算包括加法、减法、乘法、除法、移位、旋转,可能还有其他。我从未见过实际使用它,但思考如何应用上限是很有趣的能力。)但您清楚地知道如何执行所有这些操作。您知道如何在链接之前进行反汇编,而只是在链接之后进行反汇编,以查看链接器如何修改这些说明
asm(".globl _start; _start: nop\n");
unsigned int foo ( unsigned int x )
{
return(x+5);
}
unsigned int moo ( unsigned int x )
{
return(foo(x)+3);
}
int main ( void )
{
return(moo(3)+2);
}
0000000000000000 <_start>:
0: 90 nop
0000000000000001 <foo>:
1: 55 push %rbp
2: 48 89 e5 mov %rsp,%rbp
5: 89 7d fc mov %edi,-0x4(%rbp)
8: 8b 45 fc mov -0x4(%rbp),%eax
b: 83 c0 05 add $0x5,%eax
e: 5d pop %rbp
f: c3 retq
0000000000000010 <moo>:
10: 55 push %rbp
11: 48 89 e5 mov %rsp,%rbp
14: 48 83 ec 08 sub $0x8,%rsp
18: 89 7d fc mov %edi,-0x4(%rbp)
1b: 8b 45 fc mov -0x4(%rbp),%eax
1e: 89 c7 mov %eax,%edi
20: e8 00 00 00 00 callq 25 <moo+0x15>
25: 83 c0 03 add $0x3,%eax
28: c9 leaveq
29: c3 retq
000000000000002a <main>:
2a: 55 push %rbp
2b: 48 89 e5 mov %rsp,%rbp
2e: bf 03 00 00 00 mov $0x3,%edi
33: e8 00 00 00 00 callq 38 <main+0xe>
38: 83 c0 02 add $0x2,%eax
3b: 5d pop %rbp
3c: c3 retq
0000000000001000 <_start>:
1000: 90 nop
0000000000001001 <foo>:
1001: 55 push %rbp
1002: 48 89 e5 mov %rsp,%rbp
1005: 89 7d fc mov %edi,-0x4(%rbp)
1008: 8b 45 fc mov -0x4(%rbp),%eax
100b: 83 c0 05 add $0x5,%eax
100e: 5d pop %rbp
100f: c3 retq
0000000000001010 <moo>:
1010: 55 push %rbp
1011: 48 89 e5 mov %rsp,%rbp
1014: 48 83 ec 08 sub $0x8,%rsp
1018: 89 7d fc mov %edi,-0x4(%rbp)
101b: 8b 45 fc mov -0x4(%rbp),%eax
101e: 89 c7 mov %eax,%edi
1020: e8 dc ff ff ff callq 1001 <foo>
1025: 83 c0 03 add $0x3,%eax
1028: c9 leaveq
1029: c3 retq
000000000000102a <main>:
102a: 55 push %rbp
102b: 48 89 e5 mov %rsp,%rbp
102e: bf 03 00 00 00 mov $0x3,%edi
1033: e8 d8 ff ff ff callq 1010 <moo>
1038: 83 c0 02 add $0x2,%eax
103b: 5d pop %rbp
103c: c3 retq
asm(“.globl\u start;\u start:nop\n”);
无符号整数foo(无符号整数x)
{
返回(x+5);
}
无符号整数moo(无符号整数x)
{
返回(foo(x)+3);
}
内部主(空)
{
回报率(moo(3)+2);
}
0000000000000000 :
0:90不
0000000000000001 :
1:55%rbp
2:48 89 e5 mov%rsp,%rbp
5:89 7d fc mov%edi,-0x4(%rbp)
8:8b 45 fc mov-0x4(%rbp),%eax
b:83 c0 05添加$0x5,%eax
e:5d pop%rbp
f:c3 retq
0000000000000010 :
10:55%rbp
11:48 89 e5 mov%rsp,%rbp
14:48 83 ec 08分$0x8,%rsp
18:89 7d fc mov%edi,-0x4(%rbp)
1b:8b 45 fc mov-0x4(%rbp),%eax
1e:89 c7 mov%eax%edi
20:e8 00 00 callq 25
25:83 c0 03添加$0x3,%eax
28:c9-Q
29:c3 retq
00000000000000 2A:
2a:55%的rbp
2b:48 89 e5 mov%rsp,%rbp
2e:bf 03 00 mov$0x3,%edi
33:e8 00呼叫38
38:83 C002添加$0x2,%eax
3b:5d pop%rbp
3c:c3 retq
0000000000001000 :
1000:90不
0000000000001001 :
1001:55%rbp
1002:48 89 e5 mov%rsp,%rbp
1005:89 7d fc mov%edi,-0x4(%rbp)
1008:8b 45 fc mov-0x4(%rbp),%eax
100b:83 c0 05添加$0x5,%eax
100e:5d pop%rbp
gdb ./program
(gdb) start
(gdb) disassemble main
asm(".globl _start; _start: nop\n");
unsigned int foo ( unsigned int x )
{
return(x+5);
}
unsigned int moo ( unsigned int x )
{
return(foo(x)+3);
}
int main ( void )
{
return(moo(3)+2);
}
0000000000000000 <_start>:
0: 90 nop
0000000000000001 <foo>:
1: 55 push %rbp
2: 48 89 e5 mov %rsp,%rbp
5: 89 7d fc mov %edi,-0x4(%rbp)
8: 8b 45 fc mov -0x4(%rbp),%eax
b: 83 c0 05 add $0x5,%eax
e: 5d pop %rbp
f: c3 retq
0000000000000010 <moo>:
10: 55 push %rbp
11: 48 89 e5 mov %rsp,%rbp
14: 48 83 ec 08 sub $0x8,%rsp
18: 89 7d fc mov %edi,-0x4(%rbp)
1b: 8b 45 fc mov -0x4(%rbp),%eax
1e: 89 c7 mov %eax,%edi
20: e8 00 00 00 00 callq 25 <moo+0x15>
25: 83 c0 03 add $0x3,%eax
28: c9 leaveq
29: c3 retq
000000000000002a <main>:
2a: 55 push %rbp
2b: 48 89 e5 mov %rsp,%rbp
2e: bf 03 00 00 00 mov $0x3,%edi
33: e8 00 00 00 00 callq 38 <main+0xe>
38: 83 c0 02 add $0x2,%eax
3b: 5d pop %rbp
3c: c3 retq
0000000000001000 <_start>:
1000: 90 nop
0000000000001001 <foo>:
1001: 55 push %rbp
1002: 48 89 e5 mov %rsp,%rbp
1005: 89 7d fc mov %edi,-0x4(%rbp)
1008: 8b 45 fc mov -0x4(%rbp),%eax
100b: 83 c0 05 add $0x5,%eax
100e: 5d pop %rbp
100f: c3 retq
0000000000001010 <moo>:
1010: 55 push %rbp
1011: 48 89 e5 mov %rsp,%rbp
1014: 48 83 ec 08 sub $0x8,%rsp
1018: 89 7d fc mov %edi,-0x4(%rbp)
101b: 8b 45 fc mov -0x4(%rbp),%eax
101e: 89 c7 mov %eax,%edi
1020: e8 dc ff ff ff callq 1001 <foo>
1025: 83 c0 03 add $0x3,%eax
1028: c9 leaveq
1029: c3 retq
000000000000102a <main>:
102a: 55 push %rbp
102b: 48 89 e5 mov %rsp,%rbp
102e: bf 03 00 00 00 mov $0x3,%edi
1033: e8 d8 ff ff ff callq 1010 <moo>
1038: 83 c0 02 add $0x2,%eax
103b: 5d pop %rbp
103c: c3 retq
20: e8 00 00 00 00 callq 25 <moo+0x15>
1033: e8 d8 ff ff ff callq 1010 <moo>