关于ELF符号表一次随想的记录
只是一次简单的记录
最近遇到一个情况,测试的二进制文件中没有使用system
函数,但是有使用execl
函数,我可以通过内存泄漏的洞来读取到execl
函数的地址,然后获取到libc的基地址。
但是我不想使用execl
函数来利用,太麻烦了,我想使用system
函数来进行利用。一般情况下,如果已知libc版本,就能直接用偏移计算system
地址了。
但是我考虑到,如果不知道libc版本怎么办,假设在一个不知道libc版本的情况下。我怎么获取到system
函数的地址呢?
然后我想到了ELF的符号表,是不是能通过符号表来获取到相应函数的偏移。因为能读取任意内存,并且知道libc的基地址。
- 通过ELF头部获取到section信息:
1 | 1. section_offset = u64(elf_header[0x28:0x30]) section offset |
- 然后读取
section_mem
的内容,获取DNYSYM
和STRTAB
两个块的信息:
1 | 5. for x in range(0, section_number * section_header_size, section_header_size): |
- 读取
DNYSYM
和STRTAB
块的数据:
1 | 6. dynsym_mem = data[dynsym_offset:dynsym_offset+dynsym_size] |
- 搜索相应的符号
1 | 8. for x in range(0, dynsym_size, 0x18): |
但是在实际测试的时候发现,除了运行程序本身符号表块能读,其他lib库的符号表都是不可读不可写不可执行的。权限不够,🤷♂️。
关于ELF符号表一次随想的记录