如何解决标头擦除功能完成后,编辑自己标头的程序将发送SEGFAULT
在SearchAndDestroy()之后调用的第一个外部函数中,我一直从GDB收到错误消息,提示“找不到../elf/dl-runtime.c:73文件”。 这是功能
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define ELFHeaderLength 0x40
#define ProgramHeaderLength 0x38
#define SectionHeaderLength 0x40
#define AddressLength 12
#define SecondAddressOffset (AddressLength + 1)
#define FileLineBuff 150
typedef int WORD;
int SearchAndDestroy(void)
{
FILE *filePointer;
char line[FileLineBuff];
char lastLine[FileLineBuff];
char addressStr[AddressLength + 1];
long int addressInt;
WORD *start;
WORD *end;
// open /proc/self/maps file
filePointer = fopen("/proc/self/maps","r");
if (filePointer == NULL)
{
return 2;
}
// read the first address from first line from /proc/self/maps into address array
fgets(line,FileLineBuff * sizeof(char),filePointer);
memcpy(addressStr,line,AddressLength);
addressStr[AddressLength] = 0x00;
// make hex then make pointer
addressInt = strtol(addressStr,NULL,16);
start = (WORD *) addressInt;
// trace through until the last line is found
for (; (strstr(line,"MangleS.elf")) != NULL; fgets(line,filePointer))
{
memcpy(lastLine,FileLineBuff);
}
memcpy(addressStr,&lastLine[SecondAddressOffset],16);
end = (WORD *) addressInt;
// close file stream
fclose(filePointer);
// allow write to header spaces with mprotect
mprotect(start,ELFHeaderLength + ProgramHeaderLength,PROT_WRITE);
// clear ELF & Program Headers
for (int i = 0; i < (ELFHeaderLength + ProgramHeaderLength); i++)
{
*(start + i) = 0;
}
// disallow write & allow SectionHeader write
mprotect(start,PROT_READ);
mprotect(end - SectionHeaderLength,SectionHeaderLength,PROT_WRITE);
// clear Section Header
for (int i = 0; i < SectionHeaderLength; i++)
{
*(end - SectionHeaderLength + i) = 0;
}
mprotect(end - SectionHeaderLength,PROT_READ);
return 0;
}
Valgrind在结尾附近产生了错误,无效写入大小4。但是,打印语句显示在正常执行期间不会发生这种情况。目前,GDB突出显示了另一个函数中的if语句是导致崩溃的原因,但应在if语句之前的print语句未在正常执行中出现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。