在glibc中,当一个程序调用glibc中的exit函数时,exit函数内部会调用_dl_fini,而_dl_fini函数会调用程序中的fini_array段的函数指针去执行。查看glibc源码如下
1 | void |
我们注意到,有一个函数指针数组的遍历调用执行。我们来看看ld.so中相应的汇编。
在glibc中,当一个程序调用glibc中的exit函数时,exit函数内部会调用_dl_fini,而_dl_fini函数会调用程序中的fini_array段的函数指针去执行。查看glibc源码如下
1 | void |
我们注意到,有一个函数指针数组的遍历调用执行。我们来看看ld.so中相应的汇编。
首先,检查一下程序的保护机制
然后,我们用IDA分析一下,在show功能里,如果cur_id为0,即admin账户,则v36为定值5,这样使得n变大,memcpy就有可能造成栈溢出,如果能让name长一些,那么info的内容就可以溢出更多一点。
首先,检查一下程序的保护机制
然后,我们用IDA分析一下,在add函数里的scanf(“%256s”,&s)存在null off by one,其结果是将在栈里的rbp值低1字节覆盖为0。