首页
论坛
课程
招聘
[原创][原创]Unsorted Bin 利用后续
2021-7-31 23:40 3098

[原创][原创]Unsorted Bin 利用后续

2021-7-31 23:40
3098

在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”:
图片描述


【公告】欢迎大家踊跃尝试高研班11月试题,挑战自己的极限!

最后于 2021-8-1 00:13 被dolphindiv编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回