我正在寻找解释.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
我正计划编写自己的小型反汇编程序。我想解码我在读取可执行文件时获得的操作码。我看到以下操作码:
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 指令集。
我有一个小程序,希望将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'?
谢谢,问候,
希里希什·穆拉利
我正在查看说明及其相应的操作码.诸如"je"和"jz"之类的指令具有相同的操作码:
je,jz - 0x74 (8 bit)
je,jz - 0x0f84 (16/32 bit).
Run Code Online (Sandbox Code Playgroud)
为什么我们有这样的冗余指令?
是因为它使汇编编码更容易吗?也就是说,在某些情况下更容易理解"跳跃如果相等",而在其他情况下则更容易理解"跳跃于零".但是这些天我们并没有真正编写汇编代码,它有帮助吗?
在我尝试为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 arch 的 Linux 编写一个小型反汇编程序的过程中,我遇到了一个小问题。这是关于强制前缀和重复前缀的。查看英特尔文档 [1],据说重复前缀是0xf2或0xf3,强制前缀是0x66、0xf2或0xf3。
有两条指令具有以下基本操作码:
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
我有一个要求,我需要在没有Android模拟器的情况下直接在我的主机PC上安装.apk文件.我想直接在我的Linux机器上安装它(x86 arch).关于同样的问题,我有几个菜鸟问题:
我没有Android和.apk文件的非常好的背景,因此这些问题.
感谢致敬,
Hrishikesh Murali
在解码 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" …