任何人都可以解释这种不起眼的行为吗?

时间:2011-08-30 18:51:23

标签: c linux sockets gcc ubuntu

我正在尝试为安全课程编写端口扫描程序。我决定在Linux上用C语言编写它,因为我从未在Java之外做任何与网络相关的事情。我在Ubuntu 10.10上使用GCC 4.4.5。我有一个主函数解析参数,然后用结果变量调用扫描函数。这是我的完整计划:http://pastebin.com/DHU7SEQR

我遇到的问题是它无法正常工作(报告所有端口都处于打开状态),除非我在调用函数之前打印出从用户收到的变量(或重新排列传递给参数的参数的顺序)可执行文件),这对我来说毫无意义。请注意注释掉的行(150),将此行注释掉并使用命令

进行编译
gcc scanner.c -o scanner

然后使用

运行程序
./scanner -a 127.0.0.1 -b 0 -e 1000 -t 1000

导致它报告所有端口都是打开的。但是,取消注释该行(即,在调用函数之前打印出所有变量)会导致正确报告端口的状态。重新排列参数的顺序

./scanner -b 0 -e 1000 -t 1000 -a 127.0.0.1

似乎也能正常工作,就像在每个case块中添加一个printf语句一样(即使不自己打印变量)。

1 个答案:

答案 0 :(得分:5)

$ valgrind ./scanner -a 127.0.0.1 -b 0 -e 1000 -t 1000
==3800== Memcheck, a memory error detector
==3800== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==3800== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==3800== Command: ./scanner -a 127.0.0.1 -b 0 -e 1000 -t 1000
==3800== 
==3800== Syscall param socketcall.getsockopt(optlen) points to uninitialised byte(s)
==3800==    at 0x4F15DCA: getsockopt (syscall-template.S:82)
==3800==    by 0x400BC5: scan (scanner.c:83)
==3800==    by 0x400DBB: main (scanner.c:152)
==3800==  Address 0x7ff000330 is on thread 1's stack
==3800== 
==3800== Syscall param socketcall.getsockopt(optlen_out) points to uninitialised byte(s)
==3800==    at 0x4F15DCA: getsockopt (syscall-template.S:82)
==3800==    by 0x400BC5: scan (scanner.c:83)
==3800==    by 0x400DBB: main (scanner.c:152)
==3800==  Address 0x7ff000330 is on thread 1's stack
==3800== 

查看getsockopt(2)的联机帮助页。

  

对于获取 -          opt(),optlen是一个value-result参数,最初包含大小          optval指向的缓冲区,并在返回时指示修改          返回值的实际大小。如果没有选项值          提供或返回,optval可能为NULL。“

所以你需要在第82行初始化len

注意:代码可能存在其他问题。