linux telnetd 编译,telnetd源码分析

telnetd是一个telnet服务端程序

下载地址:

解压缩后进入busybox目录

make defconfig

make

make install

然后会生成 _install 目录,里面就是编译好的可执行文件

源码位于 ./networking/telnetd.c

程序流程图:

uid-26675482-id-3126746.html

程序中非常重要的就是2个buf,位于struct tsession结构体之后

socket接收到远端的数据,写入count个字节到buf1中从rdidx1开始的空闲区域,然后size1 += count;rdidx1 += count;

pty可以写,从buf1中读取count个字节写入pty,然后size1 -= count;wridx1 += count;

pty可以读,写入count个字节到buf2中从rdidx2开始的空闲区域,然后size2 += count;rdidx2 += count;

socket可以发送数据到远端,从buf2中wridx2开始的位置读取count个字节,通过socket发送出去,然后size2 -= count;wridx2 += count;

make_new_session函数非常关键,它调用xgetpty打开一个伪终端,调用vfork创建一个子进程,父进程保存打开的伪终端和相关句柄

后返回,子进程调用setsid,关闭标准输入,打开伪终端,然后将0重定向到标准输出和标准错误,然后执行/bin/login,login执行

验证过程后启动shell程序。

以后只要父进程往获得的伪终端句柄里面写数据,就是把输入写到子进程启动的shell里面,shell执行之后,父进程通过read读取伪

终端句柄,就可以读取到shell的标准输出。 static struct tsession * make_new_session { struct tsession *ts = xzalloc fd = xgetpty(tty_name); ts->ptyfd = fd; pid =vfork(); if(pid > 0) { //父进程 return ts; } //子进程 setsid(); //设置SID close(0); //关闭标准输入 xopen(tty_name, O_RDWR); //打开伪终端,注意这个时候默认返回的是数字号最小的句柄,也就是0 dup2(0,1); //将伪终端句柄重定向到标准输出 dup2(0,2); //将伪终端句柄重定向到标准错误 execvp("/bin/login",); //执行/bin/login _exit(EXIT_FAILURE); //之后直接退出 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值