【问题标题】:Raw socket programming - Why does printf() affect the packet sending?原始套接字编程 - 为什么 printf() 会影响数据包发送?
【发布时间】:2013-02-06 03:38:18
【问题描述】:

好的,这是一个非常奇怪的问题。我试图创建一个原始套接字 ICMP 数据包来欺骗 ping 请求。

int s;
s = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);

然后

int one; // I should initialize it as 1, but I didn't. 
const int *val = &one;
setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof(one));
....

事实证明,由于我没有将一个初始化为 1,所以被欺骗的客户端无法收到 ping 回复。但是,当我添加一个

unsigned char *ch = (unsigned char *)spoof;

就在之前

close(s);,

事实证明,被欺骗的客户端可以收到 ping 回复。 这是为什么呢?

【问题讨论】:

  • 对不起,我没有提到 printf() 的事情。但是当第一个问题得到一些解释时,它就会出现。
  • 您是否可以在调试模式下运行程序?在调试模式下,大多数编译器会将未初始化的变量初始化为默认值(取决于编译器)。

标签: c sockets raw-sockets


【解决方案1】:

当您未能初始化自动存储时,它获得的值取决于您的程序最后一次使用它的用途,甚至是之前在同一 VM 空间中运行的程序。因此,任何事情都可能发生。添加这行代码只是导致堆栈上one 值的对齐方式不同。该变量中的垃圾在其新位置允许原始套接字工作。另一个没有。这是运气。

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2010-11-05
    • 2018-01-17
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多