我们正在为客户端架构开发GNU Assembler的端口.现在面临的问题是:
如果指令的立即操作数是涉及多个可重定位符号的表达式,那么它是如何在elf格式的输出文件中处理的.在这种情况下产生的搬迁信息是什么?
例如:
j label1 + label2
Run Code Online (Sandbox Code Playgroud)
其中label1和label2在可重定位部分中定义,它们可能是相同的部分或不同的可重定位部分.
只是好奇.这显然不是一个非常好的实际编程解决方案,但是我想在Bless(十六进制编辑器)中创建一个可执行文件.
我的架构是x86.我能制作一个非常简单的程序是什么?你好世界?无限循环?与此问题类似,但在Linux中.
嘿,我手工创建了一个ELF文件,它有两个部分(.text和.shstrtab)和一个加载.text部分的程序头..text部分非常小,它只包含以下三条指令......
# and exit
movl $0,%ebx # first argument: exit code
movl $1,%eax # system call number (sys_exit)
int $0x80 # call kernel
Run Code Online (Sandbox Code Playgroud)
当我在这个elf文件上运行时,readelf不会抱怨.如果我执行此文件,那么一旦执行它,它就会被杀死并且屏幕上会出现"Killed"消息.我在stackoverflow上看到了以下帖子,我仍然会经历它.
现在我担心的是这个程序不会要求任何(额外的)内存,而且是否真的可以手动执行ELF并期望系统可以容忍它?
谢谢,
假设我有一个动态链接的ELF二进制文件,我想覆盖/重定向某些库调用.我知道我可以这样做LD_PRELOAD,但我想要一个在二进制文件中永久存在的解决方案,独立于环境,并且适用于setuid/setgid二进制文件,其中没有一个LD_PRELOAD可以实现.
我想做的是从其他目标文件添加代码(如果需要,可能在新的部分中),并将这些目标文件中的符号添加到二进制符号表中,以便使用新添加的代码版本代替共享库代码.我相信这应该是可能的,而不需要在现有代码中实际执行任何重定位; 即使它们在同一个文件中,它们也应该能够在运行时以通常的PLT方式解析(因为我只关心函数而不是数据).
请不要给我答案"你不想这样做!" 或者"那不便携!" 我正在研究的是一种将二进制文件与稍微ABI不兼容的备用共享库实现连接起来的方法.有问题的平台是i386-linux(即32位),如果重要的话.除非我弄错了什么是可能的,否则我可以编写一些工具来解析ELF文件并执行我的黑客攻击,但我怀疑有一种奇特的方法可以使用GNU链接器和其他工具来完成此操作而无需编写新代码.
我有一个内存泄漏的应用程序的核心转储.我已经使用strings命令和xdd来检查文件,并且我已经了解了程序的哪个部分可能导致泄漏的一些想法.我可以使用应用程序在gdb中运行核心文件,但是我不能用它做很多测试,因为它是一个嵌入式应用程序,有很多复杂的基于时间的I/O,我无法在办公室模拟.
我还听说运行各种内存泄漏检测实用程序会降低我们无法负担的应用程序,因为它已经在接近CPU容量运行.
所以我现在所拥有的只是这个核心文件.我正在寻找的示例:是否有一个指针表我可以检查以找到已分配的内存,然后我可以使用它来尝试找到本应该已被释放但尚未被释放的内容?
我有一个静态链接到libc的精灵二进制文件.我无法访问其C代码.我想使用OpenOnload库,它在用户空间中实现了套接字,因此与标准libc版本相比可以提供更低的延迟.OpenOnload实现标准套接字api,并使用LD_PRELOAD覆盖libc版本.但是,由于此elf二进制文件是静态链接的,因此无法使用套接字API的OpenOnload版本.
我相信可以通过以下步骤将此二进制文件转换为与OpenOnload动态链接:
作为第一个剪辑,我尝试添加3个PT_LOAD段.在现有PT_LOAD段标头之后添加了新的段标头.此外,未修改现有段的vm_addr.基于p_align将现有段的文件偏移量下移到下一个对齐的地址.在文件末尾的文件中添加了新的PT_LOAD段.
在重新编写文件之后,当我运行它时,它被内核正确加载,但随后它立即发生了故障.
我的问题是:
在不使用递归的C程序中,理论上应该可以计算出调用给定函数所需的最大/最坏情况堆栈大小,以及它调用的任何内容.是否有任何免费的开源工具可以从源代码或编译的ELF文件中执行此操作?
或者,有没有办法从ELF文件中提取函数的堆栈帧大小,所以我可以尝试手动解决它?
我正在使用MSPGCC 3.2.3编译MSP430(我知道它是旧版本,但在这种情况下我必须使用它).要分配的堆栈空间在源代码中设置,并且应该尽可能小,以便其余的内存可以用于其他事情.我已经读过你需要考虑中断使用的堆栈空间,但我正在使用的系统已经考虑到了这一点 - 我正在尝试计算出多少额外的空间来添加.另外,我已经读过函数指针使这很困难.在这里使用函数指针的少数地方,我知道它们可以调用哪些函数,因此如果已知调用函数和调用函数所需的堆栈空间,则可以手动考虑这些情况.
静态分析似乎比运行时的堆栈绘制更强大,但如果没有好的静态方法,那么在运行时进行静态分析是一种选择.
编辑:
我找到了GCC的-fstack-usage标志,它在编译时保存了每个函数的帧大小.不幸的是,MSPGCC不支持它.但是对于那些试图在不同平台上做类似事情的人来说,这可能是有用的.
我用GCC 4.8编译了一个应用程序,我试图在一个没有GDB 7.5+的旧系统上调试它(据说它增加了对DWARF-4的支持).在该系统上升级GDB不是一种选择.我无法调试它,因为GDB输出以下消息:
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module a.out]
Run Code Online (Sandbox Code Playgroud)
我尝试使用-gdwarf-2 -gstrict-dwarf进行编译,如其他问题所示,但编译器会继续插入一些版本4的编译单元头:
/tmp> readelf --debug-dump=info a.out | grep -A2 'Compilation Unit @'
readelf: Warning: CU at offset 6b contains corrupt or unsupported version number: 4.
readelf: Warning: CU at offset 1eb contains corrupt or unsupported version number: 4.
Compilation Unit @ offset 0x0:
Length: 0x67 (32-bit)
Version: 2
--
Compilation Unit @ offset 0x6b:
Length: 0x84 (32-bit)
Version: 4
--
Compilation …Run Code Online (Sandbox Code Playgroud) 全局偏移表(GOT):用于重定位ELF符号(实现GCC),它有助于共享相同的二进制文件,而不需要为每个进程进行任何特定链接.因此减少了存储器中相同二进制图像的副本.
我的问题是,有没有办法禁用R_386_GOT32,R_386_GOTOFF在可重定位的ELF图像中键入重定位条目?我的意思是,我可以强制GCC使用R_386_PC32或R_386_32键入重定位而不是GOT类型重定位吗?
如果没有,你能解释实施GOT的方式吗?我正在为ELF编写动态链接和加载库.
编辑:
参考链接
https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-74186.html
http://man7.org/linux/man-pages/man8/ld.so.8 .html
http://wiki.osdev.org/ELF
我不小心在该.data部分中编写了我的汇编代码。我编译并执行了它。该程序在Linux下正常运行5.4.0-53-generic,即使我没有指定就像一面旗帜execstack。
之后,我在 Linux 下执行了该程序5.9.0-050900rc5-generic。该程序得到了SIGSEGV。我通过阅读检查了虚拟内存权限/proc/$pid/maps。事实证明,该部分不可执行。
我认为 Linux 上有一个配置可以管理该权限。但我不知道在哪里可以找到。
ammarfaizi2@integral:/tmp$ uname -r
5.4.0-53-generic
ammarfaizi2@integral:/tmp$ cat test.asm
[section .data]
global _start
_start:
mov eax, 60
xor edi, edi
syscall
ammarfaizi2@integral:/tmp$ nasm --version
NASM version 2.14.02
ammarfaizi2@integral:/tmp$ nasm -felf64 test.asm -o test.o
ammarfaizi2@integral:/tmp$ ld test.o -o test
ammarfaizi2@integral:/tmp$ ./test
ammarfaizi2@integral:/tmp$ echo $?
0
ammarfaizi2@integral:/tmp$ md5sum test
7ffff5fd44e6ff0a278e881732fba525 test
ammarfaizi2@integral:/tmp$
Run Code Online (Sandbox Code Playgroud)
## Debug
gef? shell …Run Code Online (Sandbox Code Playgroud)