ret2dl

ret2dl-resolve

32bit

_dl_fixup(write)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
0xf7fe77e0 <_dl_fixup>:	push   ebp
0xf7fe77e1 <_dl_fixup+1>: push edi
0xf7fe77e2 <_dl_fixup+2>: mov edi,eax
0xf7fe77e4 <_dl_fixup+4>: push esi
0xf7fe77e5 <_dl_fixup+5>: push ebx
0xf7fe77e6 <_dl_fixup+6>: call 0xf7ff28ed <__x86.get_pc_thunk.si>
0xf7fe77eb <_dl_fixup+11>: add esi,0x15815
0xf7fe77f1 <_dl_fixup+17>: sub esp,0x2c
0xf7fe77f4 <_dl_fixup+20>: mov ecx,DWORD PTR [edi+0x7c]
0xf7fe77f7 <_dl_fixup+23>: mov eax,DWORD PTR [eax+0x34]
0xf7fe77fa <_dl_fixup+26>: mov DWORD PTR [esp+0x8],esi
0xf7fe77fe <_dl_fixup+30>: add edx,DWORD PTR [ecx+0x4] #edx=0x20 .rel.plt=[ecx+0x4] reloc[0x20]=[write.got,r_info(0x607)]
0xf7fe7801 <_dl_fixup+33>: mov eax,DWORD PTR [eax+0x4] #eax=.dynstr
0xf7fe7804 <_dl_fixup+36>: mov ecx,DWORD PTR [edi+0x38]
0xf7fe7807 <_dl_fixup+39>: mov DWORD PTR [esp+0xc],eax
0xf7fe780b <_dl_fixup+43>: mov ebp,edx
0xf7fe780d <_dl_fixup+45>: mov edx,DWORD PTR [edx+0x4] #edx=0x607 取出r_info
0xf7fe7810 <_dl_fixup+48>: mov eax,DWORD PTR [ebp+0x0]
0xf7fe7813 <_dl_fixup+51>: mov esi,edx
0xf7fe7815 <_dl_fixup+53>: shr esi,0x8 #右移r_info,得到index_dynsym(0x6)
0xf7fe7818 <_dl_fixup+56>: mov ebx,esi
0xf7fe781a <_dl_fixup+58>: shl ebx,0x4 #右移index_dynsym得到偏移量 每个dynsym大小为0x10
0xf7fe781d <_dl_fixup+61>: add ebx,DWORD PTR [ecx+0x4] #ebx为得到dynsym[6]保存的dynstr偏移量(0x4c)
0xf7fe7820 <_dl_fixup+64>: mov ecx,DWORD PTR [edi]
0xf7fe7822 <_dl_fixup+66>: add eax,ecx
0xf7fe7824 <_dl_fixup+68>: cmp dl,0x7 #检测是否r_info中的type
0xf7fe7827 <_dl_fixup+71>: mov DWORD PTR [esp+0x1c],ebx
0xf7fe782b <_dl_fixup+75>: jne 0xf7fe796f <_dl_fixup+399>
....
0xf7fe7882 <_dl_fixup+162>: mov eax,DWORD PTR [esp+0xc] #eax=dynstr
0xf7fe7886 <_dl_fixup+166>: add eax,DWORD PTR [ebx] #eax=address("write")
...
0xf7fe789d <_dl_fixup+189>: call 0xf7fe2a60 <_dl_lookup_symbol_x> #解析函数

References

http://pwn4.fun/2016/11/09/Return-to-dl-resolve/