小编Hri*_*ali的帖子

如何解释ELF可执行文件中的动态符号表?

我正在寻找解释.dynsymELF可执行文件的动态符号表().我可以.symtab使用该value属性成功解释符号表(每个符号16个字节),以表示符号和name属性的地址,以表示.strtab段中字符串开头的偏移量.但是我无法.dynsym使用相同的方法解释动态符号表().我用阿里的博客[1]作为参考.

我查看了Ali的另一个博客[2],但我不明白如何使用哈希表来解释动态符号表.显然,它与符号表使用的映射不同.我该如何解释动态符号表(.dynsym)?

另外,我正在查看的ELF可执行文件有两个部分,即.hash.gnu.hash.我在哪个部分引用哈希值?

[1] http://blogs.oracle.com/ali/entry/inside_elf_symbol_tables
[2] http://blogs.oracle.com/ali/entry/gnu_hash_elf_sections

dynamic elf symbol-table

11
推荐指数
2
解决办法
8056
查看次数

从操作码中查找指令中的操作数数量

我正计划编写自己的小型反汇编程序。我想解码我在读取可执行文件时获得的操作码。我看到以下操作码:

69 62 2f 6c 64 2d 6c
Run Code Online (Sandbox Code Playgroud)

必须对应于:

imul   $0x6c2d646c,0x2f(%edx),%esp
Run Code Online (Sandbox Code Playgroud)

现在,“imul”指令可以有两个或三个操作数。我如何从那里的操作码中弄清楚这一点?

它基于英特尔的 i386 指令集。

x86 assembly opcode disassembly

5
推荐指数
2
解决办法
4953
查看次数

如何将\ x00作为参数传递给程序?

我有一个小程序,希望将shellcode作为参数传递。在shellcode中,必须传递\ x00。我尝试了以下命令:

./program `python -c 'print "\x01\x00\x00\x00\x9c\xd8\xff\xbf"'`
Run Code Online (Sandbox Code Playgroud)

但是\ x00根本没有注册!传递给程序的参数是“ \ x01 \ x9c \ xff \ xbf”。

我不认为这是python的问题,而是传递参数的shell。我正在使用bash外壳。

现在,如何强制外壳程序传递参数'\ x00'?

谢谢,问候,
希里希什·穆拉利

shell command-line shellcode

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

为什么多条指令具有相同的操作码并且有效?

我正在查看说明及其相应的操作码.诸如"je"和"jz"之类的指令具有相同的操作码:

je,jz - 0x74 (8 bit)
je,jz - 0x0f84 (16/32 bit).
Run Code Online (Sandbox Code Playgroud)

为什么我们有这样的冗余指令?

是因为它使汇编编码更容易吗?也就是说,在某些情况下更容易理解"跳跃如果相等",而在其他情况下则更容易理解"跳跃于零".但是这些天我们并没有真正编写汇编代码,它有帮助吗?

x86 assembly opcodes

4
推荐指数
2
解决办法
1315
查看次数

拆解'faddl'指令

在我尝试为x86平台上的32位Linux编写反汇编程序时,我遇到了一个问题.当我使用以下方法拆卸简单的ELF-32可执行文件时,我看到了以下操作码序列objdump:

dc 82 04 08 0d 00     faddl  0xd0804(%edx)
Run Code Online (Sandbox Code Playgroud)

但是当我查看英特尔手册时,我没有看到对应的操作码.该fadd指令以0xDC开始,但它需要一个m64fp操作数,即"内存中的内存四字操作数".

现在,这是否意味着操作数是64位地址(这意味着该fadd指令是64位指令,但不以REX字节作为前缀),或者它只是一个32位地址指向到四字(64位)?

我在这里遗漏了一些微不足道的东西,还是我对编码x86指令的理解错了?

x86 instruction-set opcode disassembly x87

4
推荐指数
1
解决办法
472
查看次数

x86 中的重复前缀和强制前缀

在我为特定于 x86 arch 的 Linux 编写一个小型反汇编程序的过程中,我遇到了一个小问题。这是关于强制前缀和重复前缀的。查看英特尔文档 [1],据说重复前缀是0xf20xf3,强制前缀是0x660xf20xf3

有两条指令具有以下基本操作码:

crc32 -- f2 0f 38 f0 (这里,0xf2是强制前缀)
movbe -- 0f 38 f0

因此,只要计数器寄存器非零就必须重复的“movbe”指令的操作码应该是:

代表 movbe == f2 0f 38 f0

当我开始反汇编一条指令时,如果我看到字节0xf2,我如何知道它是crc32指令的强制前缀,而不是movbe指令的重复前缀,反之亦然?我应该将操作码模式“f2 0f 38 f0”与哪条指令相匹配?

我缺少什么?

[1] http://www.intel.com/design/intarch/manuals/243191.HTM

感谢和问候,
Hrishikesh Murali

x86 instruction-set prefixes opcode

3
推荐指数
1
解决办法
1449
查看次数

如何在没有Android模拟器的情况下在Linux上运行Android的.apk文件?

我有一个要求,我需要在没有Android模拟器的情况下直接在我的主机PC上安装.apk文件.我想直接在我的Linux机器上安装它(x86 arch).关于同样的问题,我有几个菜鸟问题:

  • .apk文件是如何组织的?
    • 它只是一个大的二进制文件?
      • 在这种情况下,如果我使用的是带有x86原子处理器的手机,这是否意味着将有一个单独的Android细分市场,其中包含移植到x86 arch的应用程序?
    • 它是由可执行文件组成的存档吗?(像.rpm或.deb这样的东西).
      • 如果是这样,那么档案的格式是什么?
      • 如果是这样,他们是否有不同的.apk文件用于不同的体系结构(x86,ARM等).
      • 如果没有,那么它是如何orgranized?
  • 在x86 arch上运行的Linux PC上直接运行.apk文件有什么要求?

我没有Android和.apk文件的非常好的背景,因此这些问题.

感谢致敬,

Hrishikesh Murali

android apk

3
推荐指数
1
解决办法
3万
查看次数

解码特定 x87 FPU 指令时的歧义

在解码 x87 FPU 指令方面,我面临着一个模棱两可的情况。看看下面的指令取自第 2A 卷英特尔指令集手册 [1] 的第 3-380 页。

D9 /0    --> FLD m32fp --> Push m32fp onto the FPU register stack.
D9 C0+i  --> FLD ST(i) --> Push ST(i) onto the FPU register stack.
Run Code Online (Sandbox Code Playgroud)

这两条指令都具有相同的单字节基本操作码0xD9。第一条指令的扩展操作码为0x00. 扩展操作码将在 ModR/M 字节的“reg”字段中指定。但第二条指令是一个 2 字节的操作码,具有“添加到获取寄存器”功能。这意味着:

D9 C0  --> FLD ST0  
D9 C1  --> FLD ST1  
(and so on)
Run Code Online (Sandbox Code Playgroud)

关于区分这两个指令,我有一个小问题。一个小例子是:

现在,假设我得到操作码序列"D9 C1"。如果我需要检查它是否是指令"FLD m32fp",那么我必须检查 ModR/M 字节的“reg”字段是否为 0x00。如果是这样,那么它确实是"FLD m32fp"正在使用的指令。

的二进制表示C1"1100 0001"。假设bit0是LSB,那么bit3-bit5(含)构成ModR/M字节的'reg'字段"C1" …

fpu opcode x87

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