标签: elf

使用libelf提示生成ELF

我正在尝试使用libelf生成一个简单的静态ELF,但我似乎遇到了麻烦.

我不希望生成一个目标文件然后用LD链接它,而是希望我自己生成它.

该程序的主要目的是生成具有一个LOAD段的静态ELF并执行代码.

主要问题不在于shellcode本身,而是在我试图以错误的方式生成的一些标题中.当我尝试运行生成的ELF时,它会被杀死,好像内核无法找到它刚刚加载的段等.

如果你们能暗示我,我会很喜欢.

create_elf.3.c

#include <err.h>
#include <fcntl.h>
#include <libelf.h>
#include <stdio.h>
#include <stdlib.h>
#include <sysexits.h>
#include <unistd.h>

unsigned char code[] =
"\x0b\x58\x99\x52\x66\x68\x2d\x70"
"\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61"
"\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52"
"\x51\x53\x89\xe1\xcd\x80";

int main(int argc, char *argv[])
{
  int           fd;
  Elf           *e;
  Elf_Scn       *scn;
  Elf_Data      *data;
  Elf32_Ehdr    *ehdr;
  Elf32_Phdr    *phdr;
  Elf32_Shdr    *shdr;
  if (argc != 2)
    errx(EX_USAGE,"input... ./%s filename\n",argv[0]);
  if (elf_version(EV_CURRENT) == EV_NONE)
    errx(EX_SOFTWARE,"elf_version is ev_none, wtf? %s\n",elf_errmsg(-1));
  if ((fd = open(argv[1], O_WRONLY | O_CREAT, 0777)) < 0)
    errx(EX_OSERR, "open %s\n",elf_errmsg(-1));
  if ((e = …
Run Code Online (Sandbox Code Playgroud)

c linux elf abi

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

程序可以读取自己的精灵部分吗?

我想使用ld的--build-id选项,以便将构建信息添加到我的二进制文件中.但是,我不确定如何在程序中提供此信息.假设我想编写一个程序,每次发生异常时都会写一个回溯,以及一个解析这些信息的脚本.该脚本读取程序的符号表并搜索在回溯中打印的地址(我被迫使用这样的脚本,因为程序是静态链接的,并且backtrace_symbols不起作用).为了使脚本正常工作,我需要将程序的构建版本与创建回溯的程序的构建版本相匹配.如何从程序本身打印程序的构建版本(位于.note.gnu.build-id elf部分)?

linux elf backtrace

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

强制符号到ELF文件的顶部

在通过GCC链接器生成的ELF文件中,ELF文件的顶部始终是可执行代码的版本标识符.

这是通过创建version.c文件并将结果对象文件作为link命令中的第一个可链接对象来实现的.

然而,对于一个可执行文件,它无法工作,我们可以找到的唯一区别是可执行文件包含C和C++代码的混合,并且版本符号正在其他地方重定位.

因此,有一种方法可以保证符号在ELF文件中的绝对位置,这样符号总是通过链接器命令或代码属性指令位于文件的顶部?

c c++ linker symbols elf

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

libxml-ruby无法在x86_64加载

我们在服务器端遇到libxml-ruby gem问题可能因为它使用了x86_64架构:

$ uname -a Linux ip-10-228-171-64 2.6.21.7-2.fc8xen-ec2-v1.0#1 SMP Tue Sep 1 10:25:30 EDT 2009 x86_64 GNU/Linux

require 'libxml'
LoadError: /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/libxml-ruby-1.1.4/lib/libxml_ruby.so: invalid ELF header - /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/libxml-ruby-1.1.4/lib/libxml_ruby.so
from /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/libxml-ruby-1.1.4/lib/libxml_ruby.so
from /usr/local/ruby-enterprise/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:156:in `require'
from /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:521:in `new_constants_in'
from /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:156:in `require'
from /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/libxml-ruby-1.1.4/lib/libxml.rb:9
from /usr/local/ruby-enterprise/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
from /usr/local/ruby-enterprise/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:156:in `require'
from /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:521:in `new_constants_in'
from /usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:156:in `require'
from (irb):1
Run Code Online (Sandbox Code Playgroud)

宝石版1.1.4

重新安装宝石没有帮助可以有人建议做什么?

ruby elf libxml2 libxml-ruby

5
推荐指数
3
解决办法
5625
查看次数

访问附加到ELF二进制文件的数据

我有一个静态ELF二进制文件,它从zip文件中读取数据.为了简化分发,我想将zipfile附加到二进制文件,如下所示:

$ cat mydata.zip >> mybinary
Run Code Online (Sandbox Code Playgroud)

我知道这样做不会损害mybinary,但我不知道如何访问mydata.zip的内容.可能吗?如果是这样,怎么样?

在过去,我使用了附加数据然后附加数据长度的技巧,因此我所要做的就是打开二进制文件,读取流的最后一个int,回退那个长度然后开始解压缩,但是由于各种原因在这里不起作用(例如,我不能保证当需要zipfile时文件仍然在光盘上).

如果解决方案适用于OS X和MinGW,那么全面超级双倍加分.

linux gcc build elf

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

为什么Go使用自己的Code生成器?

Go的当前官方编译器(http://code.google.com/p/go/)目前使用手工制作的,可以说是神秘的代码生成器,其中包括将自定义部分注入ELF二进制文件.

这种方法产生了很多与直接读取和/或写入ELF信息的实用程序相关的错误,例如ldd,objdumpstrip.

我相信这可以通过使用经过良好测试的跨平台代码生成器(例如LLVM)来防止,然后只使用OS附带的链接工具,例如ld在Unix/Linux(或ld.exe在Windows link.exe上使用MinGW),或在Windows上使用视觉工作室.

那么为什么Go使用它自己的代码生成器呢?它真的只是重新发明轮子吗?或者背后有更重要的原因吗?

code-generation elf go

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

奇怪的ELF二进制文件

我有一个奇怪的ELF二进制文件.我可以在32位linux中运行这个二进制文件.

但是如果我用IDA反汇编程序打开这个二进制文件,IDA会说"无效入口点".

readelf的结果如下:

root@meltdown-VirtualBox:/home/meltdown# readelf -S -l SimpleVM 

There are no sections in this file.

Elf file type is EXEC (Executable file)
Entry point 0xc023dc
There are 2 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00c01000 0x00c01000 0x013c7 0x013c7 RWE 0x1000
  LOAD           0x00019c 0x0804b19c 0x0804b19c 0x00000 0x00000 RW  0x1000
Run Code Online (Sandbox Code Playgroud)

没有部分.我以为这个二进制文件很紧凑.但是,第一个LOAD段的最后一个虚拟地址是0xc023c7.入口点的虚拟地址为0xc023dc,超出范围......

谁能告诉我发生了什么事?

先感谢您.

  • / proc/PID/maps如下(创建了两个进程......)

    root@meltdown-VirtualBox:/proc/3510# cat maps
    00110000-00111000 rwxp 00000000 00:00 0 
    006c0000-006c1000 r-xp 00000000 00:00 0          [vdso]
    007d2000-007d4000 …
    Run Code Online (Sandbox Code Playgroud)

linux reverse-engineering elf

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

在C程序中设置堆起始地址?

有没有办法在Linux中的GCC编译C程序中设置堆起始地址?在x86_64系统中,我的测试程序将堆地址设置为4字节引用的地址(小于FFFFFFFF).我想将此设置为8字节引用的地址进行一些测试(> FFFFFFFF).GCC是否提供了设置堆起始地址的方法?

c gcc heap-memory elf

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

如何找到PIE二进制文件的负载重定位?

我需要在运行的进程中获取堆栈的基地址。这将使我能够打印将由addr2line理解的原始堆栈跟踪(已剥离运行二进制文件,但addr2line可以访问符号)。我通过检查以下内容的elf标头成功做到了这一点argv[0]:我读取了入口点并将其从中减去&_start

#include <stdio.h>
#include <execinfo.h>
#include <unistd.h>
#include <elf.h>
#include <stdio.h>
#include <string.h>
void* entry_point = NULL;
void* base_addr = NULL;
extern char _start;

/// given argv[0] will populate global entry_pont
void read_elf_header(const char* elfFile) {
  // switch to Elf32_Ehdr for x86 architecture.
  Elf64_Ehdr header;
  FILE* file = fopen(elfFile, "rb");
  if(file) {
    fread(&header, 1, sizeof(header), file);
    if (memcmp(header.e_ident, ELFMAG, SELFMAG) == 0) {
        printf("Entry point from file: %p\n", (void *) header.e_entry);
        entry_point = (void*)header.e_entry;
        base_addr = …
Run Code Online (Sandbox Code Playgroud)

c linux elf aslr position-independent-code

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

在 AWS Lambda 上使用 libxmljs 的“无效 ELF 标头”

我有一个使用无服务器、express 和libxmljs(将 JavaScript 绑定到 libxml)的超级基本 AWS Lambda 函数:

代码

无服务器.xml:

service: xmltest

provider:
  name: aws
  runtime: nodejs10.x
  stage: dev
  region: us-east-1

functions:
  app:
    handler: index.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'

plugins:
  - serverless-offline
Run Code Online (Sandbox Code Playgroud)

索引.js:

const serverless = require('serverless-http');
const express = require('express');
const libxml = require("libxmljs");

const app = express();

app.use(express.json());

app.post('/lookup', async function (req, res) {
  res.send({result: "hello world"});
});

module.exports.handler = serverless(app);
Run Code Online (Sandbox Code Playgroud)

在本地工作但不在 AWS 上工作

当我在本地运行时:

$ curl -X POST http://localhost:3000/lookup -d …
Run Code Online (Sandbox Code Playgroud)

elf libxml2 amazon-web-services aws-lambda serverless-framework

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