能力值:
( LV6,RANK:90 )
|
-
-
2 楼
想请教一下楼主,nextsize这里是如何利用的。。。
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
glibc 2.19 unlink
#define unlink(P, BK, FD) { \
FD = P->fd; \
BK = P->bk; \
if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \
malloc_printerr (check_action, "corrupted double-linked list", P); \
else { \
FD->bk = BK; \
BK->fd = FD; \
if (!in_smallbin_range (P->size) \
&& __builtin_expect (P->fd_nextsize != NULL, 0)) { \
assert (P->fd_nextsize->bk_nextsize == P); \
assert (P->bk_nextsize->fd_nextsize == P); \
if (FD->fd_nextsize == NULL) { \
if (P->fd_nextsize == P) \
FD->fd_nextsize = FD->bk_nextsize = FD; \
else { \
FD->fd_nextsize = P->fd_nextsize; \
FD->bk_nextsize = P->bk_nextsize; \
P->fd_nextsize->bk_nextsize = FD; \
P->bk_nextsize->fd_nextsize = FD; \
} \
} else { \
P->fd_nextsize->bk_nextsize = P->bk_nextsize; \
P->bk_nextsize->fd_nextsize = P->fd_nextsize; \
} \
} \
} \
}
看这里
} else { \
P->fd_nextsize->bk_nextsize = P->bk_nextsize; \
P->bk_nextsize->fd_nextsize = P->fd_nextsize; \
} \
P->fd_nextsize:你想覆盖的地方 - 20(bk_nextsize在结构偏移20的字节的地方)
P->bk_nextsize:shellcode地址。
要注意的是,在shellcode偏移16字节的地方,会有4个字节会被覆盖,在我的exp代码中,我使用jmp跳过这一块地方。
|
能力值:
( LV6,RANK:90 )
|
-
-
4 楼
哦哦!非常感谢,其实想覆盖的那个地方就是返回地址咯?然后程序返回直接跳转到shellcode的地方?是这样吗?网上对新版本unlink宏的利用方式所述很少,非常感谢指点!
|
能力值:
( LV5,RANK:60 )
|
-
-
5 楼
在我的exp中,被覆盖的地方是函数的返回地址,当程序返回时,就会跳到shellcode执行。
|
能力值:
( LV6,RANK:90 )
|
-
-
6 楼
明白了,明天我再调试一下,多谢大牛指点!
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
还想请教一下楼主,在调试过程中发现了一个比较奇怪的,同样我也是glibc 2.19,但是按照您的说法构造了一个exp,调试的时候会中断报错
_int_free: Assertion `nextchunk->fd_nextsize->bk_nextsize == nextchunk' failed
不知道是什么原因。。。
|
能力值:
( LV5,RANK:60 )
|
-
-
8 楼
看样子是断言失败了,你编译glibc的时候启用debug了?
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
难道是编译环境的问题?我用的是kali2.0版本,应该是没有启用debug吧。。我换一个和你一样的系统版本再调试一下试试。。感谢!
|
能力值:
( LV6,RANK:90 )
|
-
-
10 楼
大大您好,我又仔细分析了一下unlink宏,发现你提到的那一部分else语句,是之前的if语句不成立才能进入,也就是说P->fd_nextsize=null才能进入。。这一部分在exp中并没有体现,我的问题可能也是出现在由于满足条件,所以直接进入if语句中,从而造成某一步判断没有通过产生的断言错误。
所以还是想麻烦您能不能再详细的说一说这一部分。。。large chunk的利用以前从来没接触过,实在很想搞明白。。
|
能力值:
( LV5,RANK:60 )
|
-
-
11 楼
assert在定义了NDEBUG宏时,就不会生效
|
能力值:
( LV5,RANK:60 )
|
-
-
12 楼
} else { \
P->fd_nextsize->bk_nextsize = P->bk_nextsize; \
P->bk_nextsize->fd_nextsize = P->fd_nextsize; \
}
这一部分的需要FD->fd_nextsize != NULL才能进入啊。断言在这个if之前。一般情况下,Relase版本的程序都不会启用assert的。
|
能力值:
( LV15,RANK:531 )
|
-
-
13 楼
想请教一下楼主怎么关闭linux系统的NX
|
|
|