-
-
[原创][原创]Unsorted Bin 利用后续
-
发表于: 2021-7-31 23:40 5806
-
在ubuntu18.04.5上使用pwndbg调试unsorted_bin_into_stack,对于glibc_2.27,unsorted_bin_into_stack.c的main函数前面增加了:
1 | void jackpot(){ printf( "Nice jump d00d\n" ); exit( 0 ); } |
在main函数结尾处增加了:
1 2 3 4 | intptr_t sc = (intptr_t)jackpot; / / Emulating our in - memory shellcode memcpy((p2 + 40 ), &sc, 8 ); / / This bypasses stack - smash detection / / since it jumps over the canary assert (( long )__builtin_return_address( 0 ) = = ( long )jackpot); |
前面释放victim,使victim 进入unsorted bin list。通过修改stack_buffer[1]和stack_buffer[3]的内容,成功伪造了大小为0x420的chunk。对victim[-1]=0x30和victim[1]=(intptr_t)stack_buffer赋值操作,使victim->bk指向stack_buffer栈(伪造的chunk)。 再次申请堆内存时:
1 | char * p2 = malloc( 0x410 ) |
由于unsorted bin 中第一个空闲chunk的大小已经修改为0x30,该chunk无法满足申请chunk的大小,被转入smallbin。
拆链操作如下:
1 2 | unsorted_chunks (av) - >bk = bck; bck - >fd = unsorted_chunks (av); |
unsorted_chunk的头结点将指向victim->bk指向的chunk,即stack_buffer栈(伪造的chunk),地址值为0x00007fffffffdf90。而0x00007fffffffdf90的前向指针将指向unsorted_chunks (av),即0x00007ffff7dcdca0。
再次进行循环判断,此时申请chunk的大小与unsoted bin中的伪造chunk大小一致,_int_malloc函数将该chunk分配给p2。p2地址为0x00007fffffffdfa0,指向了栈stack_buffer。
后续操作:
1 | intptr_t sc = (intptr_t)jackpot |
将jackpot函数地址赋值给sc,通过memcpy((p2+40), &sc, 8),将jackpot函数地址复制到p2+40处,即0x00007fffffffdfc8处。
观察寄存器的中rsp、rbp:
rbp=0x00007fffffffdfc0,根据函数调用约定,rbp+8处为main函数返回地址,以上memcpy((p2+40), &sc, 8)复制操作,成功将jackpot函数地址复制main函数返回地址处,同时跳过了栈溢出保护机制Canary(Canary保护的机制为rbp位置前插入的一段随机数,此处应该是0x55f199db23a15a00)。
main函数返回时,jackpot函数成功得到执行,打印出“Nice jump d00d”:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创]large chunk分配过程调试 12795
- [原创]BCTF 2018 House of Atum分析 11861
- [原创]HITB CTF 2018 gundam分析 17358
- [原创][原创]Unsorted Bin 利用后续 5807