-
-
[原创]2019 Q2 第九题 绝地逃生(pwn) 分析
-
发表于:
2019-6-23 20:02
7489
-
[原创]2019 Q2 第九题 绝地逃生(pwn) 分析
0x0 checksec
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
FORTIFY: Enabled
0x1 程序分析
实现几个基本功能
abc@abc-vm:~/Desktop/kctf_Q2_9$ ./fastheap
1. malloc
2. fast free
3. puts
4. exit
>>>
漏洞在free中:
启动若干个线程完成free工作:
do
{
if ( pthread_create((pthread_t *)p, 0LL, (void *(*)(void *))start_routine, &Max_2) )
goto gg;
++p;
}
while ( p_base != p );
i = 0LL;
while ( !pthread_join(tid[i], 0LL) )
{
if ( num_1 == ++i )
goto LABEL_13;
}
线程函数:
由于是带原子锁的方式来访问并修改共享变量,这里并没有线程间的竞争漏洞。
漏洞点在于无论当前要free的idx是否小于MAX,idx都会+1。
最简单的情况:MAX=255,线程数=2。线程1访问完idx=255,发现idx>=MAX,于是退出了,然而此时idx+1=0,线程2再来访问时idx就变成了0了,于是从0到MAX又重新free了一圈。
void *__fastcall start_routine(void *pMax)
{
unsigned __int64 v2; // [rsp+0h] [rbp-28h]
while ( 1 )
{
v2 = (unsigned __int8)_InterlockedExchangeAdd8((volatile signed __int8 *)pMax + 8, 1u);
if ( *(_QWORD *)pMax <= v2 )
break;
if ( !ptr[v2] )
exit(-1);
free((void *)ptr[v2]);
}
return 0LL;
}
0x3 利用思路
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2019-6-26 13:39
被mratlatsn编辑
,原因: