我编写了一个启用了 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 对齐的,因此第二个条目将被加载到包含二进制文件的第二页中(从偏移量0xeb0到0xeb0+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) 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 符号表?
我正在用 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) 我想知道 ELF 格式是否已指定每个部分应与 4kb 边界对齐?或者,仅在 x86 平台上,ELF 的“实现”应将每个部分与 4kb 边界对齐。
是否有任何规范可以对此进行判断?
我正在生成一个 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) 我在 .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 上使用的类似于 PEiD 的封隔器检测器?ELF 和 PE 格式。
我试图找到一个类似的工具,但我发现的只是在可执行文件中搜索字符串的手动方法,这不是一种非常有效和有效的方法。
你如何在 QEMU 上运行 elf 文件?这是我最好的猜测:
qemu-system-i386 -hda kernel.elf
Run Code Online (Sandbox Code Playgroud)
这行得通吗?elf 文件是从本教程生成的内核。
我下载了 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)
最后,执行 …
如何强制 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)