gpt4 book ai didi

c - 从 C 中的 ELF 部分中提取字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:15 24 4
gpt4 key购买 nike

我创建了一个新的 ELF 部分并在其中添加了一行文本。我按照此处看到的示例执行此操作:Adding section to ELF file .我创建了一个名为“.mydata”的部分,并将字符串“mydata saved string”放入其中。我正在尝试匹配在 C 中的命令中执行以下操作的功能:

$ readelf -p .mydata TEST
String dump of section '.mydata':
[ 0] mydata saved string

我可以用代码找到节的偏移量和节的大小

void print_item(FILE* fd, Elf64_Ehdr eh, Elf64_Shdr sh_table[])
{
int i;
char* sh_str;
char* buff;

buff = malloc(sh_table[eh.e_shstrndx].sh_size);

if(buff != NULL)
{
fseek(fd, sh_table[eh.e_shstrndx].sh_offset, SEEK_SET);
fread(buff, 1, sh_table[eh.e_shstrndx].sh_size, fd);
}
sh_str = buff;

for(i=0; i<eh.e_shnum; i++)
{
if(!strcmp(".mydata", (sh_str + sh_table[i].sh_name)))
{
printf("Found section\t\".mydata\"\n");
printf("at offset\t0x%08x\n", (unsigned int)sh_table[i].sh_offset);
printf("of size\t\t0x%08x\n", (unsigned int)sh_table[i].sh_size);
break;
}
}

/*Code to print or store string data*/
}

int main()
{
FILE* fp = NULL; //Pointer used to access current file
char* program_name;
Elf64_Ehdr elf_header; //Elf header
Elf64_Shdr* sh_table; //Elf symbol table

program_name = "/home/Testing/TEST";
fp = fopen(program_name, "r");

fseek(fp, 0, SEEK_SET);
fread(elf_header, 1, sizeof(Elf64_Ehdr), fp);
sh_table = malloc(elf_header.e_shentsize*elf_header.e_shnum);

print_item(fp, elf_header, sh_table);

return 0;
}

既然我有了位置,我不确定从该位置提取字符串的正确方法。 ELF Section Header 表条目(即 sh_name、sh_type ...)似乎都与提取字符串无关。

最佳答案

在我们回答您的问题之前,您的代码存在几个问题:

  1. 没有包含。
  2. fread(elf_header,... 应该是 fread(&elf_header,...
  3. sh_table 永远不会从 ELF 文件中读取。

一旦这些被修复,.mydata 部分中的字符串数据可以通过复制 sh_table[i].sh_size 字节的数据从 sh_table[ i].sh_offset 在 ELF 文件中,其中 i.mydata 部分的索引。

这是工作代码:

#include <stdio.h>
#include <stdlib.h>
#include <elf.h>
#include <string.h>

void print_item(FILE* fd, Elf64_Ehdr eh, Elf64_Shdr sh_table[])
{
int i;
char* sh_str;
char* buff;

buff = malloc(sh_table[eh.e_shstrndx].sh_size);

if(buff != NULL)
{
fseek(fd, sh_table[eh.e_shstrndx].sh_offset, SEEK_SET);
fread(buff, 1, sh_table[eh.e_shstrndx].sh_size, fd);
}
sh_str = buff;

for(i=0; i<eh.e_shnum; i++)
{
if(!strcmp(".mydata", (sh_str + sh_table[i].sh_name)))
{
printf("Found section\t\".mydata\"\n");
printf("at offset\t0x%08x\n", (unsigned int)sh_table[i].sh_offset);
printf("of size\t\t0x%08x\n", (unsigned int)sh_table[i].sh_size);
break;
}
}

/*Code to print or store string data*/
if (i < eh.e_shnum) {
char *mydata = malloc(sh_table[i].sh_size);
fseek(fd, sh_table[i].sh_offset, SEEK_SET);
fread(mydata, 1, sh_table[i].sh_size, fd);
puts(mydata);
} else {
// .mydata section not found
}

}

int main()
{
FILE* fp = NULL; //Pointer used to access current file
char* program_name;
Elf64_Ehdr elf_header; //Elf header
Elf64_Shdr* sh_table; //Elf symbol table

program_name = "/home/Testing/TEST";
fp = fopen(program_name, "r");

fseek(fp, 0, SEEK_SET);
fread(&elf_header, 1, sizeof(Elf64_Ehdr), fp);
sh_table = malloc(elf_header.e_shentsize*elf_header.e_shnum);

fseek(fp, elf_header.e_shoff, SEEK_SET);
fread(sh_table, 1, elf_header.e_shentsize*elf_header.e_shnum, fp);

print_item(fp, elf_header, sh_table);

return 0;
}

关于c - 从 C 中的 ELF 部分中提取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44289501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com