pwn基础学习日志(六)

动态链接

程序中使用一些动态链接库里的函数,是在需要执行的时候再加载进内存(且只能加载进入数据段),进行地址解析(逻辑地址-->物理地址),这里就需要依托plt表和got表。

plt,程序联动表(内部函数表):汇编后的调用指令  call xxx@plt,而plt表中存放1.jmp [xxx_got]、2.push 偏移、3.jmp plt[0]

got,全局偏移表(全局函数表):存放函数的真实地址,但初次加载后才是,未加载前。(注:got表项前三项不存放地址)

首次调用库函数时,[xxx_got]里存的是上述指令2的地址,plt[0]里存放加载函数并解析地址的方法。函数加载进来后,[xxx_got]里才存真实的函数地址。

got[2]存动态链接器的入口地址,got[1]存参数,plt[0]处指令会将获得的真实的地址绑定到got[偏移x]中。

由此,我们可以知道got表是一个可写对象,同时也是一个可攻击对象。通过修改got表的内容,我们可以实现任意函数调用。

ASLR地址随机化

通过该文件/proc/sys/kernel/randomize_va_space来设定开启地址随机化。

0:关闭。

1:表示保留的随机化,共享库、栈、mmapO以及VDSO随机化。

2:表示完全的随机化 在1的基础上,通过brk()分配的内存空间也将被随机化。

libc,C函数库

泄露libc函数地址的条件:

1.有输出函数(puts,printf,write等)

2.将参数设置为某函数got表地址

执行后就会打印got表的内容。got表中每个函数的偏移,只要用获得的地址减去偏移就可以得到基地址,再通过加上偏移,即可实现任意调用libc中的任意函数。

通过真实的函数地址的后三位可以通过https://libc.blukat.me/知道libc的版本,从而知道其他函数如system的地址偏移。

猜你喜欢

转载自www.cnblogs.com/glodears/p/12549389.html