Responsive image

夜神鸦羽 - 2019-01-04 14:41 [GF]
没办法了,病急乱投医,到处都问问
链接:[https://pan.baidu.com/s/11e3gKbne9qVEbniw_4IMzw]
提取码:pypp
课程代码和题目如度盘链接内所示所示

但是我直接就卡在第一步的make做不下去了
有没大佬来教下我的啊啊啊啊


思弹音 - 2019-01-04 15:03 [B1F]
有那本事的人跑着来无聊~!你也不想想~!


traum - 2019-01-04 16:46 [B2F]
尝试去csdn发贴问问啊,愿意花钱,淘宝更快


任白 - 2019-01-04 17:06 [B3F]
楼主是真的秀


John - 2019-01-04 18:16 [B4F]
没办法,非码农专业


ras - 2019-01-04 18:33 [B5F]
makefile就编译了main.c和hello.c,你看看elf文件就会了


残香覆睫 - 2019-01-04 18:39 [B6F]
elf文件是你头像的那种文件吗(手动滑稽


夜神鸦羽 - 2019-01-04 19:05 [B7F]
第一个问题我靠自己解决了,现在要补充一个LOAD()类让他能够扫描程序头表,装载各装载段到虚拟内存这个我是真的做不来啊……
void loader(char *filename)

{

    FILE *fp = fopen(filename, "r");

  assert(fp != NULL);



  Elf32_Ehdr *elf;

  Elf32_Phdr *ph = NULL, *eph;



  uint8_t buf[4096];

  int ret = fread(buf, 4096, 1, fp);

  assert(ret == 1);

  


夜神鸦羽 - 2019-01-04 19:08 [B8F]
void init_address_space(void) {

  void *ret = mmap((void *)AS_START, AS_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE,

      MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);

  assert(ret != MAP_FAILED);



  uint32_t *p = ret;

  int i;

  for (i = 0; i < AS_SIZE / sizeof(uint32_t); i ++) {

    p = rand();

  }

}

void segv_handler(int signum, siginfo_t *siginfo, void *ucontext) {

  printf("catch SIGSEGV\n");



  // get ebp and eip from the context

  int *regs = ((ucontext_t *)ucontext)->uc_mcontext.gregs;

  uint32_t ebp = regs[REG_EBP];

  uint32_t eip = regs[REG_EIP];



  printf("ebp = %x, eip = %x\n", ebp, eip);



  bt(ebp, eip);



  exit(0);

}

void load_elf_tables(char *filename) {

    int ret;



    FILE *fp = fopen(filename, "rb");

    assert(fp != NULL);



    uint8_t buf[sizeof(Elf32_Ehdr)];

    ret = fread(buf, sizeof(Elf32_Ehdr), 1, fp);

    assert(ret == 1);



    // the first several bytes contain the ELF header

    Elf32_Ehdr *elf = (void *)buf;

    char magic[] = {ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3};



    // check ELF header

    assert(memcmp(elf->e_ident, magic, 4) == 0);        // magic number

    assert(elf->e_ident[EI_CLASS] == ELFCLASS32);        // 32-bit architecture

    assert(elf->e_ident[EI_DATA] == ELFDATA2LSB);        // littel-endian

    assert(elf->e_ident[EI_VERSION] == EV_CURRENT);        // current version

    assert(elf->e_ident[EI_OSABI] == ELFOSABI_SYSV ||     // UNIX System V ABI

            elf->e_ident[EI_OSABI] == ELFOSABI_LINUX);     // UNIX - GNU

    assert(elf->e_ident[EI_ABIVERSION] == 0);            // should be 0

    assert(elf->e_type == ET_EXEC);                        // executable file

    assert(elf->e_machine == EM_386);                    // Intel 80386 architecture

    assert(elf->e_version == EV_CURRENT);                // current version



    // load section header table

    uint32_t sh_size = elf->e_shentsize * elf->e_shnum;

    Elf32_Shdr *sh = malloc(sh_size);

    fseek(fp, elf->e_shoff, SEEK_SET);

    ret = fread(sh, sh_size, 1, fp);

    assert(ret == 1);



    // load section header string table

    char *shstrtab = malloc(sh[elf->e_shstrndx].sh_size);

    fseek(fp, sh[elf->e_shstrndx].sh_offset, SEEK_SET);

    ret = fread(shstrtab, sh[elf->e_shstrndx].sh_size, 1, fp);

    assert(ret == 1);



    int i;

    for(i = 0; i < elf->e_shnum; i ++) {

        if(sh.sh_type == SHT_SYMTAB &&

                strcmp(shstrtab + sh.sh_name, ".symtab") == 0) {

            // load symbol table

            symtab = malloc(sh.sh_size);

            fseek(fp, sh.sh_offset, SEEK_SET);

            ret = fread(symtab, sh.sh_size, 1, fp);

            assert(ret == 1);

            nr_symtab_entry = sh.sh_size / sizeof(symtab[0]);

        }

        else if(sh.sh_type == SHT_STRTAB &&

                strcmp(shstrtab + sh.sh_name, ".strtab") == 0) {

            // load string table

            strtab = malloc(sh.sh_size);

            fseek(fp, sh.sh_offset, SEEK_SET);

            ret = fread(strtab, sh.sh_size, 1, fp);

            assert(ret == 1);

        }

    }



    free(sh);

    free(shstrtab);



    assert(strtab != NULL && symtab != NULL);



    fclose(fp);

}


夜神鸦羽 - 2019-01-04 19:08 [B9F]
const char* find_fun_name(uint32_t eip) {

  static const char not_found[] = "???";



  int i;

  for(i = 0; i < nr_symtab_entry; i ++) {

    if(ELF32_ST_TYPE(symtab.st_info) == STT_FUNC &&

        eip >= symtab.st_value && eip < symtab.st_value + symtab.st_size) {

      return strtab + symtab.st_name;

    }

  }



  return not_found;

}


夜神鸦羽 - 2019-01-04 19:08 [B10F]
题目给出的参考代码


shion - 2019-01-04 19:32 [B11F]
看不懂 精神支持


夜神鸦羽 - 2019-01-12 11:40 [B12F]
反正截止日期早过了,随便找个人最佳算了


ras - 2019-01-12 17:26 [B13F]
那天随便回了一句就准备期末考试去了,后来就忘了。。。






桌面版


Powered by SP Project v1.0 © 2010-2019
Time 0.001819 second(s),query:3 Gzip enabled


Top