先说说什么是libc库吧
当一个程序(e)需要执行gets函数(某个函数),而e本身没有这个函数的具体代码,它就需要跳到libc动态链接库中去执行gets函数,在libc动态链接库中gets函数才能够真正的执行,e中的get只是一个指针,指向libc库中get函数的真实地址
即当一个程序中没有某个函数(gets)的时候,它就会连接libc动态链接库,执行其中的gets函数
libc库中包含了所有可执行的函数,你能在其中找到任何你需要的函数
当然了,有动态链接库,自然也有静态链接库,区别就在于,动态链接库与程序是俩个独立的个体,当程序需要libc时才会连接使用其中的函数,而静态链接库与程序是一个整体,会将程序与它放到一个附件中,这样无疑会占用更多的空间,造成空间浪费
因此,大多数情况下都是使用动态链接库,以达到节省空间的作用
libc库里的所有函数地址都是一个偏移后的地址(动态链接库每次生成的偏移后的某函数的地址是一样的,但不同的链接库的生成的偏移后的某地址是不一样的),而程序在运行的时候会随机产生一个libc库的基址libc_base,我们只需要用基址加上偏移后的函数的地址就可以得到函数的真实地址[这边实际上可以把偏移后的函数地址理解为函数的偏移,我们需要用libc基址加上偏移才能得到真实的函数地址,而不同函数的偏移是不一样的,但同一个libc库每次生成的同一个函数的偏移是一样的]
那做题的时候要怎么利用呢?
首先,我们需要知道我们的这个程序在运行之后会产生一个libc基址(libc为一个动态链接库,当我们的程序需要执行一个函数的时候,会从li