0%

在glibc中,当一个程序调用glibc中的exit函数时,exit函数内部会调用_dl_fini,而_dl_fini函数会调用程序中的fini_array段的函数指针去执行。查看glibc源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void
internal_function
_dl_fini (void)
{
..........
/* First see whether an array is given. */
if (l->l_info[DT_FINI_ARRAY] != NULL)
{
ElfW(Addr) *array =
(ElfW(Addr) *) (l->l_addr
+ l->l_info[DT_FINI_ARRAY]->d_un.d_ptr);
unsigned int i = (l->l_info[DT_FINI_ARRAYSZ]->d_un.d_val
/ sizeof (ElfW(Addr)));
while (i-- > 0)
((fini_t) array[i]) ();
}
............
}

我们注意到,有一个函数指针数组的遍历调用执行。我们来看看ld.so中相应的汇编。

阅读全文 »

首先,检查一下程序的保护机制

然后,我们用IDA分析一下,在show功能里,如果cur_id为0,即admin账户,则v36为定值5,这样使得n变大,memcpy就有可能造成栈溢出,如果能让name长一些,那么info的内容就可以溢出更多一点。

阅读全文 »