Protostar net3
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,This level is at /opt/protostar/bin/net3Source code#include "../common/common.c"#define NAME "net3"#
千家信息网最后更新 2025年12月02日Protostar net3This level is at /opt/protostar/bin/net3
This level is at /opt/protostar/bin/net3Source code
#include "../common/common.c"
#define NAME "net3"
#define UID 996
#define GID 996
#define PORT 2996
/*
* Extract a null terminated string from the buffer
*/
int get_string(char **result, unsigned char *buffer, u_int16_t len)
{
unsigned char byte;
byte = *buffer;
if(byte > len) errx(1, "badly formed packet");
*result = malloc(byte);
strcpy(*result, buffer + 1);
return byte + 1;
}
/*
* Check to see if we can log into the host
*/
int login(unsigned char *buffer, u_int16_t len)
{
char *resource, *username, *password;
int deduct;
int success;
if(len < 3) errx(1, "invalid login packet length");
resource = username = password = NULL;
deduct = get_string(&resource, buffer, len);
deduct += get_string(&username, buffer+deduct, len-deduct);
deduct += get_string(&password, buffer+deduct, len-deduct);
success = 0;
success |= strcmp(resource, "net3");
success |= strcmp(username, "awesomesauce");
success |= strcmp(password, "password");
free(resource);
free(username);
free(password);
return ! success;
}
void send_string(int fd, unsigned char byte, char *string)
{
struct iovec v[3];
u_int16_t len;
int expected;
len = ntohs(1 + strlen(string));
v[0].iov_base = &len;
v[0].iov_len = sizeof(len);
v[1].iov_base = &byte;
v[1].iov_len = 1;
v[2].iov_base = string;
v[2].iov_len = strlen(string);
expected = sizeof(len) + 1 + strlen(string);
if(writev(fd, v, 3) != expected) errx(1, "failed to write correct amount of bytes");
}
void run(int fd)
{
u_int16_t len;
unsigned char *buffer;
int loggedin;
while(1) {
nread(fd, &len, sizeof(len));
len = ntohs(len);
buffer = malloc(len);
if(! buffer) errx(1, "malloc failure for %d bytes", len);
nread(fd, buffer, len);
switch(buffer[0]) {
case 23:
loggedin = login(buffer + 1, len - 1);
send_string(fd, 33, loggedin ? "successful" : "failed");
break;
default:
send_string(fd, 58, "what you talkin about willis?");
break;
}
}
}
int main(int argc, char **argv, char **envp)
{
int fd;
char *username;
/* Run the process as a daemon */
background_process(NAME, UID, GID);
/* Wait for socket activity and return */
fd = serve_forever(PORT);
/* Set the client socket to STDIN, STDOUT, and STDERR */
set_io(fd);
/* Don't do this :> */
srandom(time(NULL));
run(fd);
}
乍一看,好长的代码~~~但是还是得看~~~:-)程序先读一个长度,这个长度就是待会客户端即将发过来的字符串的长度,第二次读时获取一个字符串,首先先判断第一个字符的值是否为23,是则继续然后分析get_string()函数,先读第一个字符,也是长度的意思,然后取出该长度的字符保存在那指针里面,如果三次取出的字符分别是net3,awesomesauce,password的话即可success。以下是代码:
#!/usr/bin/env python
from socket import *
from struct import *
from optparse import OptionParser
import select
def main(hostname,port):
s = socket(AF_INET,SOCK_STREAM)
s.connect((hostname,port))
send_str = ("\x17"
"\x05net3\x00"
"\x0dawesomesauce\x00"
"\x09password\x00")
send_len = len(send_str)
s.send(pack(">H", send_len))
s.send(send_str)
print s.recv(1024)
s.close()
if __name__=="__main__":
parse = OptionParser("usage: %prog [options]")
parse.add_option("-H",dest="hostname",default="127.0.0.1",type="string",help="The ip of the target")
parse.add_option("-P",dest="port",default=2996,type="int",help="The port of the host")
(options,args)=parse.parse_args()
main(options.hostname,options.port)
运行结果:
字符
长度
代码
字符串
函数
客户
客户端
就是
意思
指针
程序
结果
还是
分析
运行
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
虚拟主机创建数据库
为什么无尽对决一直在连接服务器
西科大网络安全技术
数据库对账系统
东莞无限软件开发价目表
ipv6网络技术
如何加入通勤人员数据库
为什么热点不能使用代理服务器
阿里云数据库事业部待遇
手机怎么更新电脑服务器
登录软件服务器忙是什么问题
sql 数据库复制技术
网络安全培训师资格证书
仁怀网络安全系统
软件开发团队证明
以下能作为网络安全的特性
南宁找软件开发公司
上海智能软件开发调试
王者荣耀安卓微信区服务器
dns服务器开放端口
服务器怎么改ip地址
天刀服务器平均功力
数据库ip类型
乐视手天气服务器
网络安全中一般采用什么技术
重庆大坪医院网络安全
怎么查看达梦数据库密码
操作系统在软件开发中的应用
软件开发 质量
服务器桥接模式是什么意思