x86 汇编设计有指令后缀,如l(long), w(word), b(byte)。
所以我认为这jmpl是long jmp
但是当我编译它时它的工作很奇怪。
见下面的例子。
测试1:组装
main:
jmp main
Run Code Online (Sandbox Code Playgroud)
测试1:编译结果
eb fe jmp 0x0804839b <main>
Run Code Online (Sandbox Code Playgroud)
测试2:组装
main:
jmpl main # added l suffix
Run Code Online (Sandbox Code Playgroud)
测试2:编译结果
ff 25 9b 83 04 08 jmp *0x0804839b
Run Code Online (Sandbox Code Playgroud)
与Test1相比,Test2的结果出乎意料。
我认为它应该与Test1一样编译。
问:
是jmpl什么不同的指令在8086的设计?
(根据这里,jmpl在 SPARK 中意味着 jmp 链接。是这样的吗?)
...或者这只是 gnu 汇编程序上的错误?
据我所知,PLT并且GOT是处理动态链接功能的部分。
如果代码调用printflibc 的函数,
1. 首先它调用PLTgetprintf的地址。
2. 并将此地址写入GOT部分。
3. 从第二次调用开始,代码使用编写的函数GOT。
当我仔细查看 ELF 二进制文件时,
- 我发现PLTELF 中的section名称是<.plt>.
-GOT在 ELF 中部分的名称是<.got.plt>.
但是...... <.got>ELF中也有部分。
我无法理解如何使用此部分。
Q.<.got>节的用法是什么?和部分有
什么区别?<.got><.got.plt>
PS 1. 这个<.got>部分非常小,(在我的示例二进制文件中它只包含 4byte。)
在这里我附上<.got>部分的IDA 视图:
.got:08049FFC ; ===========================================================================
.got:08049FFC
.got:08049FFC ; Segment type: Pure data
.got:08049FFC ; Segment permissions: Read/Write
.got:08049FFC _got segment …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用'gdb'设置断点。
从这里我了解了如何打破特定的功能。
但是我想打破功能的特定偏移量。
0xb7eecfa8 <error+184> mov eax, dword ptr [ebx - 0x40]
0xb7eecfae <error+190> sub esp, 4
0xb7eecfb1 <error+193> push dword ptr [eax]
gdb> break error+184
Function "error+184" not defined.
Run Code Online (Sandbox Code Playgroud)
有没有要中断的命令0xb7eecfa8 <error+184>?
(除了输入b *0xb7eecfa8)
在 intel 指令中,idiv(integer divsion) 表示有符号除法。
我得到了 的结果idiv,但我不太明白结果。
- 例子
0xffff0000 idiv 0xffff1100
Run Code Online (Sandbox Code Playgroud)
- 我的错误预测
据我所知,quotient应该是 0,并且remainder应该是 0xffff0000 并且因为...
0xffff0000 / 0xffff1100 = 0
0xffff0000 % 0xffff1100 = 0xffff0000
Run Code Online (Sandbox Code Playgroud)
——然而,结果却是……
之前idiv
eax 0xffff0000 # dividend
esi 0xffff1100 # divisor
edx 0x0
Run Code Online (Sandbox Code Playgroud)
后 idiv
eax 0xfffeedcc # quotient
edx 0x7400 29696 # remainder
Run Code Online (Sandbox Code Playgroud)
- 问题。
结果是我无法预料的价值。
有人可以解释一下签名除法(idiv)吗?
- 附加。
这是有关idiv.
idiv使用 eax 寄存器作为源寄存器。
作为执行的结果,商存于eax,余数存于edx。
这是我得到的一些信息program_invocation_name:
<.bss>or中<.data>。stack内存区域中。这很奇怪......)这是调试器视图program_invocation_name:
pwndbg> x/s program_invocation_name
0xbffff302: "/tmp/my_program"
Run Code Online (Sandbox Code Playgroud)
问题)
我从程序开始到结束都遵循执行流程,但我找不到设置的那一刻。program_invocation_name
问题)
Q1 . 谁(什么函数)设置了这个值?(loader设置这个值..?)
Q2。global variable尽管该值位于 ? 中,但程序如何知道将其识别为stack?
Q3 . 有时,某些二进制文件运行时没有此值。在这种情况下,问题是loader?
我得到了一些不一致的教学结果.
我不知道为什么会这样,所以我怀疑%es寄存器做的很奇怪,但我不确定.
请看下面的代码段.
08048400 <main>:
8048400: bf 10 84 04 08 mov $HERE,%edi
8048405: 26 8b 07 mov %es:(%edi),%eax # <----- Result 1
8048408: bf 00 84 04 08 mov $main,%edi
804840d: 26 8b 07 mov %es:(%edi),%eax # <----- Result 2
08048410 <HERE>:
8048410: 11 11 adc %edx,(%ecx)
8048412: 11 11 adc %edx,(%ecx)
Run Code Online (Sandbox Code Playgroud)
结果1:
%eax : 0x11111111
Run Code Online (Sandbox Code Playgroud)
看到这个结果,我猜想 mov %es:(%edi),%eax有点像mov (%edi),%eax.
因为0x11111111存储在HERE.
结果2:
%eax : 0x048410cc
Run Code Online (Sandbox Code Playgroud)
但是,结果2的结果完全不同.
我假设%eax是0x048410bf …