标签: elf

为什么 ELF 程序头有两个 LOAD 条目,而程序布局三个部分

我编写了一个启用了 PIE/PIC 的“hello world”程序。我观察到程序头有 2 个 LOAD 条目:

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
... ...
  LOAD           0x000000 0x00000000 0x00000000 0x00870 0x00870 R E 0x1000
  LOAD           0x000eb0 0x00001eb0 0x00001eb0 0x0015c 0x00164 RW  0x1000
Run Code Online (Sandbox Code Playgroud)

所以在我的理解中,ELF 二进制文件将被加载到 2 个页面中。第 1 页包含从偏移量 0 到文件大小 0x870 的二进制文件,它是 Read & Execute。由于它们是 0x1000 对齐的,因此第二个条目将被加载到包含二进制文件的第二页中(从偏移量0xeb00xeb0+0x15c)。此页面具有读写权限。

当我“pmap”正在运行的进程(或 cat /proc/pid/maps)时,它显示正在运行的程序有 3 个页面:

b7554000      4K rw---   [ anon ]
b7555000   1700K r-x-- libc-2.19.so
b76fe000      4K ----- libc-2.19.so
b76ff000      8K r---- libc-2.19.so
b7701000 …
Run Code Online (Sandbox Code Playgroud)

linux loading elf loader

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

How to not emit local symbols in NASM so that GDB disas won't stop at them?

I'm trying to write some assembly programs using nasm on linux. Everything is good, but I make heavy use of local symbols (.loop, .else, etc.), which is a pain when debugging, because these symbols are emitted to the symbol table, e.g.:

[BITS 32]
global main
section .text
main:
    do stuff
.else:
    do other stuff
Run Code Online (Sandbox Code Playgroud)

will produce a disassembly that looks like:

<main>:
00000000      do stuff
<main.else>:
00000000      do other stuff
Run Code Online (Sandbox Code Playgroud)

这有点烦人,因为 gdb 会认为这些都是单独的函数,所以当我“disas”时,它只会在遇到另一个标签并停止之前反汇编几条指令。

有没有办法在 linux 下使用 nasm 抑制将这些符号发送到 ELF 符号表?

linux assembly linker nasm elf

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

访问位置无关代码中的 .data 部分

我正在用 NASM 构建一个共享库。在那个库中,在某些函数中,我需要我们称之为C 中的静态变量。基本上,我认为它是 .data 部分中的一些空间:

    SECTION .data
last_tok:       dq 0 ; Define a QWORD
Run Code Online (Sandbox Code Playgroud)

当我尝试在我的函数中访问 last_tok时出现问题。

我阅读了NASM 手册:8.2 编写 Linux/ELF 共享库,其中解释了问题并提供了解决方案。

    SECTION .data
last_tok:              dq 0     ; Define a QWORD

    SECTION .text
    EXTERN _GLOBAL_OFFSET_TABLE_
    GLOBAL strtok:function
strtok:
    enter    0, 0
    push     rbx
    call     .get_GOT
.get_GOT:
    pop      rbx
    add      rbx, _GLOBAL_OFFSET_TABLE_ + $$ - .get_GOT wrt ..gotpc

    mov      [rbx + last_tok wrt ..gotoff], rdi ; Store the contents of RDI at last_tok

    mov      rbx, …
Run Code Online (Sandbox Code Playgroud)

linux assembly x86-64 nasm elf

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

32 位可执行会话按 4kb 对齐,它是 elf 格式的一部分吗?

我想知道 ELF 格式是否已指定每个部分应与 4kb 边界对齐?或者,仅在 x86 平台上,ELF 的“实现”应将每个部分与 4kb 边界对齐。

是否有任何规范可以对此进行判断?

linux x86 alignment boundary elf

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

启动期间生成的 ELF 可执行段错误

我正在生成一个 ELF 可执行文件,其中 .text 部分加载到 LOAD 段中。它可以很好地反汇编,但是尝试在下面运行它gdb会给出During startup program terminated with signal SIGSEGV, Segmentation fault.

readelf 给出:

ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x400056
  Start of program headers:          759 (bytes into file) …
Run Code Online (Sandbox Code Playgroud)

compiler-construction posix elf

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

ELF标签地址

我在 .s 文件中有以下代码:

pushq $afterjmp
    nop
afterjmp:
    movl %eax, %edx
Run Code Online (Sandbox Code Playgroud)

它的目标文件有以下内容:

20: 68 00 00 00 00          pushq  $0x0
25: 90                      nop
0000000000000026 <afterjmp>:
26: 89 c2                   mov    %eax,%edx
Run Code Online (Sandbox Code Playgroud)

链接后变成:

400572: 68 78 05 40 00          pushq  $0x400578
400577: 90                      nop
400578: 89 c2                   mov    %eax,%edx
Run Code Online (Sandbox Code Playgroud)

如何争论0x0,以pushq在字节20的目标文件被转换成0x400578在最终的可执行文件?

目标文件的哪个部分包含此信息?

linux x86 assembly elf

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

Linux 上的 PEiD 替代方案

有没有可以在 Linux 上使用的类似于 PEiD 的封隔器检测器?ELF 和 PE 格式。

我试图找到一个类似的工具,但我发现的只是在可执行文件中搜索字符串的手动方法,这不是一种非常有效和有效的方法。

linux reverse-engineering elf

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

如何在 QEMU 上运行裸机 ELF 文件?

你如何在 QEMU 上运行 elf 文件?这是我最好的猜测:

qemu-system-i386 -hda kernel.elf
Run Code Online (Sandbox Code Playgroud)

这行得通吗?elf 文件是从本教程生成的内核。

kernel qemu elf

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

/proc/$pid/maps 中的“删除”是什么意思?

我下载了 libhugetlbfs.so 并有一个简单的测试源:

int glbarr[1024*1024]={0} ;
int main()
{
    char * ptr ;
    ptr = (char *) malloc( 1024 * 1024 * 1 ) ;
    printf(" press any key to go on \n");
    getchar() ;
    for(int idx=0;idx<100;idx++){
        char strtmp[64] = {0} ;
        sprintf(strtmp,"%020d",idx) ;
        strcpy( ptr+1024*idx , strtmp ) ;
    } //for 
    for(int idx=0;idx<100;idx++){
        glbarr[idx] = idx ;
    }
    printf(" press any key to go on \n");
    getchar() ;
} // main
Run Code Online (Sandbox Code Playgroud)

然后设置环境:

export LD_PRELOAD=libhugetlbfs.so
export HUGETLB_MORECORE=yes
export HUGETLB_DEBUG=1
Run Code Online (Sandbox Code Playgroud)

最后,执行 …

elf linux-kernel huge-pages

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

ELF - .symtab 部分

如何强制 GCC 包含 ELF 可执行文件/共享库的 .symtab 部分?我已经尝试使用-static-ggdb但它没有用。

编辑readelf -l产生以下内容:

 Section to Segment mapping:
 Segment Sections...
  00     
  01     .interp 
  02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame 
  03     .init_array .fini_array .dynamic .got .got.plt .data .bss 
  04     .dynamic 
  05     .note.ABI-tag .note.gnu.build-id 
  06     .eh_frame_hdr 
  07     
  08     .init_array .fini_array .dynamic .got 
Run Code Online (Sandbox Code Playgroud)

x86 elf

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