打印节标题的精灵名称

2023-12-01

我有一个 C 程序,我想在其中打印输入文件的节标题的名称。 我所做的一切都是基于研究 ELF 表示法,并帮助解决了互联网上现有的程序,但它仍然不起作用。它只打印 for 循环中的索引,其中也应该是节名称。有人看到我错过的东西吗?

更新: 我更新了代码并删除了导致堆栈溢出的错误(如果将来有人需要它)。

Code:


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <elf.h>

int main(int argc, char *argv[]) {


    int fd;
    int val;

    Elf32_Ehdr elfHdr;
    Elf32_Shdr sectHdr;
    FILE* ElfFile = NULL;
    char* SectNames = NULL;

    if(argc != 2) {
        perror("Error while opening file");
        return 0;
    }   



    ElfFile = fopen(argv[1], "r");
    if(ElfFile == NULL) {
        printf("fopen");
        return -1;
    }

    //preberemo elf header
    fread(&elfHdr, 1, sizeof(Elf32_Ehdr), ElfFile);

    printf("\tVersion: 0x%.2X\n", elfHdr.e_version);

    printf("\tEntry point address: 0x%.8X\n", elfHdr.e_entry);

    printf("\tProgram header offset: 0x%.8X\n", elfHdr.e_phoff);

    printf("\tSection header offset: 0x%.8X\n", elfHdr.e_shoff);

    printf("\tFlags: 0x%.8X\n", elfHdr.e_flags);

    printf("\tSize of this header: 0x%X\n", elfHdr.e_ehsize);

    printf("\tSize of program headers: 0x%X\n", elfHdr.e_phentsize);

    printf("\tNumber of program headers: %d\n", elfHdr.e_phnum);

    printf("\tSize of section headers: 0x%X\n", elfHdr.e_shentsize);

    printf("\tNumber of section headers: %d\n", elfHdr.e_shnum);

    printf("\tSection header string table index: 0x%X\n", elfHdr.e_shstrndx);

    //premik do section tabele
    fseek(ElfFile, elfHdr.e_shoff + elfHdr.e_shstrndx * elfHdr.e_shentsize, SEEK_SET);
    fread(&sectHdr, 1, sizeof(sectHdr), ElfFile);
    SectNames = malloc(sectHdr.sh_size);
    fseek(ElfFile, sectHdr.sh_offset, SEEK_SET);
    fread(SectNames, 1, sectHdr.sh_size, ElfFile);

    for (int idx = 0; idx < elfHdr.e_shnum; idx++){
        char* name = "";

        fseek(ElfFile, elfHdr.e_shoff + idx * sizeof(sectHdr), SEEK_SET);
        fread(&sectHdr, 1, sizeof(sectHdr), ElfFile);

        // print section name
        if (sectHdr.sh_name);
        name = SectNames + sectHdr.sh_name;
            
        printf("%i %s\n", idx, name);
    }



    close(fd);

    return 0;
}


有人看到我错过的东西吗?

你的程序是在32位模式下编译的吗?

Update:

有一个“明显”的错误,我在第一次阅读时错过了这个错误,并且通过构建暴露了它-fsanitize=address:

Elf32_Ehdr elfHdr;
...
fread(&elfHdr, 1, sizeof(Elf64_Ehdr), ElfFile);

此错误会导致堆栈缓冲区溢出。为了防止此类错误,使用总是更安全sizeof(variable)代替sizeof(Type), e.g.

fread(&elfHdr, 1, sizeof(elfHdr), ElfFile);

这个对我有用:

gcc -w -m32 t.c && ./a.out ./a.out
    Version: 0x01
    Entry point address: 0x000010C0
    Program header offset: 0x00000034
    Section header offset: 0x000038B0
    Flags: 0x00000000
    Size of this header: 0x34
    Size of program headers: 0x20
    Number of program headers: 11
    Size of section headers: 0x28
    Number of section headers: 30
    Section header string table index: 0x1D
0
1 .interp
2 .note.gnu.build-id
3 .note.ABI-tag
4 .gnu.hash
5 .dynsym
6 .dynstr
7 .gnu.version
8 .gnu.version_r
9 .rel.dyn
10 .rel.plt
11 .init
12 .plt
13 .plt.got
14 .text
15 .fini
16 .rodata
17 .eh_frame_hdr
18 .eh_frame
19 .init_array
20 .fini_array
21 .dynamic
22 .got
23 .got.plt
24 .data
25 .bss
26 .comment
27 .symtab
28 .strtab
29 .shstrtab

如果您尝试在 64 位 ELF 文件上运行它,那么您需要更改Elf32_Ehdr and Elf32_Shdr和他们的Elf64_...等价物。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打印节标题的精灵名称 的相关文章

  • C - 计算文件中的单词、字符和行数。字符数

    我必须用 C 编写一段代码 输出给定文件中的字符数 行数和单词数 任务看起来很简单 但我现在真的不确定出了什么问题 所以 这是代码 include
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • Monitor.Pulse & Wait - 意外行为

    http www codeproject com Articles 28785 Thread synchronization Wait and Pulse demystified http www codeproject com Artic
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • 如何将 Boost Spirit 自动规则与 AST 结合使用?

    编辑 当我想在另一个规则上使用它时 我扩展了 sehe 的示例以显示问题 http liveworkspace org code 22lxL7 http liveworkspace org code 22lxL7 17 我正在尝试提高 Bo
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal

随机推荐

  • 数据缓存如何路由本例中的对象?

    考虑图示的数据缓存架构 ASCII 艺术如下 CPU core A CPU core B Devices Cache A1 Cache B1 with DMA Cache 2 RAM
  • iOS7仅返回'NSInvalidArgumentException',原因:'-[__NSCFString containsString:]: [重复]

    这个问题在这里已经有答案了 我正在使用一个图书应用程序 用户可以点击一个单词 然后为他们播放包含该单词的音频文件的一部分 并且该单词将突出显示 不幸的是 我现在尝试将代码从仅支持 iOS8 优化为支持 iOS7 但遇到了一些错误 这是我得到
  • 如何在 DOM 和 PHP 中获取文本节点?

    我有以下代码来检索 HTML 文档中的所有超链接 我的问题是如何检索每个锚标记内的文本节点 即使文本节点是子节点的子节点 就像锚节点有一个包含文本节点的跨度节点一样
  • Android 上如何从字符串中获取 URL

    我想从中提取网址hi there this is a URL String http mytest com 我尝试使用 EditText getURLs 但它对我不起作用 EditText setText hi there this is
  • Passport.js Passport.initialize() 中间件未使用

    我正在使用带有express mongoose的节点 并尝试将passport js与restful api一起使用 身份验证成功后 我不断收到此异常 我在浏览器上看到回调网址 Users naorye dev naorye myproj
  • 永久禁用和隐藏 Android 导航栏/通知菜单

    我正在为一所学校开发一个android应用程序 我希望这个应用程序在打开时能够阻止用户在设备上执行任何操作 除了我在我的应用程序中提供的内容之外 我的意思是做NOTHING别的 所以首先应该禁用并隐藏导航栏 我看到了这个 但它适用于 4 4
  • .NET Framework 术语中的“替换版本”是什么意思?

    维基百科表示 NET Framework 4 7 取代了版本 4 0 4 6 2 这是否意味着我可以在仅安装 NET Framework 4 7 的情况下运行需要 例如 NET Framework 4 0 的程序 这意味着 4 7 是 4
  • 在 Windows 中更改 my.ini 中 MySQL 5.0 的 tmp 文件夹

    我有一个在 Windows 7 上运行的 MySQL 服务器 版本 5 0 67 当我在 Eclipse 中使用 hibernate 时 出现以下错误 引起原因 java sql SQLException 无法创建 写入文件 C Windo
  • 如何在 opencv 中的实时摄像头输入上绘制透明图像

    我需要在实时摄像头画面上绘制透明图像 下面是要显示为覆盖在相机源上的 png 文件 下面是从相机获取帧并将其显示在屏幕上的代码 我也尝试将圆圈绘制为叠加层 但圆圈不透明 我认为下面的代码是错误的或遗漏了一些东西 include opencv
  • Docker-compose scale 命令为新容器创建随机端口

    目前 docker compose scale 命令为新容器创建随机端口 有没有办法为新容器指定端口 In your docker compose yml postgres image postgres 9 5 environment PO
  • 离子存储以异步方式获取值

    我正在尝试在离子存储中获取 2 个值存储 但该值是以异步方式检索的 并且请求是在检索值之前发生的 这里Auth url都在ionic存储中 import Injectable from angular core import Http Re
  • Node.js,厄运金字塔(即使有异步),你能写得更好吗?

    我认为自己是一位非常有经验的 Node js 开发人员 但我仍然想知道是否有更好的方法来编写以下代码 这样我就不会得到厄运金字塔 现在我对你很宽容 我有一些代码可以让我的金字塔高达 20 层 不开玩笑 这就是使用 async js 问题实际
  • Docker-compose - 设置非文字的环境变量

    我已经在 Docker 容器中设置了 Jenkins 并且正在尝试使用该服务器访问我的私有 Bitbucket 存储库 我需要将我的 SSH 密钥复制到该容器中 以便 Bitbucket 识别它 然后我可以让我的 Jenkins 服务器访问
  • 如何在 Mithril 中将字符串转换为 HTML 元素?

    假设我有一个字符串 span class msg Text goes here span 我需要在我的网页中使用这个字符串作为 HTML 元素 关于如何做到这一点有什么想法吗 秘银提供了m trust方法用于此 在视图中需要 HTML 输出
  • 在服务器端对 CellTable 进行排序

    我目前正在使用 Gwt CellTable 通过 RPC 调用绑定到我的 GAE Objectify 后端 现在好了 然后我想对列进行排序 所以我读了http code google com intl it IT webtoolkit do
  • phpinfo(); 和有什么区别?和 php -i?

    在 DDG 上搜索并在这里没有得到任何有趣的结果 我听说它们是不同的 但我想知道是什么让它们不同以及拥有两种不同的配置有什么优势 EDIT 是的 我从 CLI 运行它们 phpinfo 是一个语言函数 无论执行的脚本是通过 Web SAPI
  • driver = webdriver.Chrome() :: 硒方法的问题 - 如何解决

    嗯 我正在尝试找出从clutch io收集数据的最简单方法 我尝试了各种方法从网站 clutch io 收集数据 但似乎都失败了 see here from bs4 import BeautifulSoup from selenium im
  • Offval属性自定义复选框格式化程序jqGrid

    我正在编写一个自定义复选框格式化程序 但我无法理解offval属性的用途以及它的值应该是什么 特别是当设置了 editoptions 的值时 例如editoptions value Yes No 我可以看到默认的复选框格式化程序总是设置of
  • 将需要 IO 的函数映射到列表的更好方法

    所以最近我有一个字符串列表 需要独立地检查每个字符串并执行一些操作IO功能 所以基本上我所拥有的是这样的 goOverList String gt IO goOverList x do putStrLn x goOverList x xs
  • 打印节标题的精灵名称

    我有一个 C 程序 我想在其中打印输入文件的节标题的名称 我所做的一切都是基于研究 ELF 表示法 并帮助解决了互联网上现有的程序 但它仍然不起作用 它只打印 for 循环中的索引 其中也应该是节名称 有人看到我错过的东西吗 更新 我更新了