小编Jiw*_*won的帖子

x86 中的 jmpl 指令是什么?

x86 汇编设计有指令后缀,如l(long), w(word), b(byte)
所以我认为这jmpllong 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 汇编程序上的错误?

x86 assembly gnu-assembler att

6
推荐指数
2
解决办法
2507
查看次数

ELF 中的 &lt;.got&gt; 部分是什么?

据我所知,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)

binary x86 elf bin got

5
推荐指数
1
解决办法
2722
查看次数

使用“ gdb”在函数内的特定偏移量中设置断点

我正在尝试使用'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

debugging gdb

5
推荐指数
1
解决办法
1719
查看次数

什么是带符号除法(idiv)指令?

在 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。

x86 assembly division integer-division signed-integer

5
推荐指数
1
解决办法
2439
查看次数

什么函数设置“program_incall_name”?什么时候?

这是我得到的一些信息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设置这个值..?)
Q2global variable尽管该值位于 ? 中,但程序如何知道将其识别为stack
Q3 . 有时,某些二进制文件运行时没有此值。在这种情况下,问题是loader

binary x86 assembly executable elf

0
推荐指数
1
解决办法
695
查看次数

为什么在加载附近的代码字节时会出现意外的"0xcc"字节?是因为段寄存器%es?

我得到了一些不一致的教学结果.
我不知道为什么会这样,所以我怀疑%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 …

debugging x86 assembly segment

0
推荐指数
1
解决办法
81
查看次数