首页
社区
课程
招聘
[原创]2019 Q2 第九题 绝地逃生(pwn) 分析
发表于: 2019-6-23 20:02 7489

[原创]2019 Q2 第九题 绝地逃生(pwn) 分析

2019-6-23 20:02
7489

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编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 592
活跃值: (192)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你可以尝试干干封包  然后发出来 保证出来就是精华帖  哈哈
2019-6-26 13:10
0
游客
登录 | 注册 方可回帖
返回