C++编程中易犯的指针操作错误
昨天在修改前面发的 08-067 exploit 程序的时候,发现自己犯了这样一个错误。修改后的 exploit 第三个参数是反射端口号,我在程序里直接把第三个参数用 atoi() 转换成 int, 然后直接强转成两个字节的 unsigned short 类型 unsigned short port = (unsigned short) atoi(argv[3]); 然后直接 memcpy() &port 的内容到 shellcode 数组中,但 shellcode 中端口号的两个字节和 unsigned short 存储时的高低位是互换的,即 unsigned short 值为 8080 时在内存中是 90 1F,而 shellcode 中是 1F 90,所以要单个字节高低位互换复制,最初我把代码写成
编译后发现运行结果不正确,一开始还没有看出来错误,后来发现复制到 shellcode 中的总是 CC 90,意识到是源指针指向的地址不正确。(堆栈中为局部变量分配的内存总是被默认初始化为 CC)。 不知道你现在有没有看出来错误在哪里, &port+1, &port 得到的是一个 unsigned short* ,它在 +1 的时候实质上是跳过一个 unsigned short 大小的空间就是说如果 &port 的值是 0×00123344 那么 &port+1 就是 0×00123346, 而不是看起来的 0×00123345, 而旁边是为其他变量分配并初始化为 0xCC 的空间,那么在 +1 之前转换一下就解决了。

