Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中介器中的堆栈粉碎_Java_C_Linux_Stack_Interposing - Fatal编程技术网

Java中介器中的堆栈粉碎

Java中介器中的堆栈粉碎,java,c,linux,stack,interposing,Java,C,Linux,Stack,Interposing,我正在编写一个Java中介程序来修改与网络通信相关的系统调用。基本上,我想修改预期收件人的IP和端口 该代码在我的笔记本电脑上正常工作,但在大学电脑上,它给出了一个堆栈粉碎错误,如下所示: *** stack smashing detected ***: java terminated ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb7702dd5] /lib/i386-linu

我正在编写一个Java中介程序来修改与网络通信相关的系统调用。基本上,我想修改预期收件人的IP和端口

该代码在我的笔记本电脑上正常工作,但在大学电脑上,它给出了一个堆栈粉碎错误,如下所示:

*** stack smashing detected ***: java terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb7702dd5]
/lib/i386-linux-gnu/libc.so.6(+0xffd8a)[0xb7702d8a]
/home/mwaqar/vibe/ldinterposer_2.so(+0x28e4)[0xb77c98e4]
/home/mwaqar/vibe/ldinterposer_2.so(connect+0x9c5)[0xb77c9093]
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/libnet.so(+0xceff)[0x8b226eff]
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/libnet.so(Java_java_net_PlainSocketImpl_socketConnect+0x4c1)[0x8b227c51]
相关代码(插入连接系统调用)如下所示:

int connect(int fd, const struct sockaddr *sk, socklen_t sl)
{
struct sockaddr_in      *lsk_in  = (struct sockaddr_in *)  sk;
struct sockaddr_in6     *lsk_in6 = (struct sockaddr_in6 *) sk;

struct sockaddr_in      addr4;

unsigned int            len;
int                     nbytes, oport, tport, ret, i;
char                    ip_address[30];
char                    buffer[1024];   
char                    tempBuffer[1024];   

if((lsk_in->sin_family == AF_INET) || (lsk_in->sin_family == AF_INET6))
{
    if(lsk_in->sin_family == AF_INET)
    {
        oport = ntohs(lsk_in->sin_port);
        memcpy(&addr4.sin_addr.s_addr, &lsk_in->sin_addr.s_addr, sizeof(addr4.sin_addr.s_addr));
    }
    else if(lsk_in->sin_family == AF_INET6)
    {
        oport = ntohs(lsk_in6->sin6_port);
        memcpy(&addr4.sin_addr.s_addr, lsk_in6->sin6_addr.s6_addr+12, sizeof(addr4.sin_addr.s_addr));
    }

    memset(buffer, '\0', sizeof(buffer));
    sprintf(buffer, "%s%c%s%c%i", NAT_VM_CONNECT_RULE, NAT_VM_DELIMITER, (char *)inet_ntoa(addr4.sin_addr), NAT_VM_DELIMITER, oport);

    nbytes = send(sock, buffer, strlen(buffer), 0);
    if(DEBUG_MODE)
        fprintf(stdout, "[LD_INTERPOSER] Sent[%s]\n", buffer);

    memset(buffer, '\0', sizeof(buffer));
    nbytes = recv(sock, buffer, sizeof(buffer), 0);

    fprintf(stderr, "[LD_INTERPOSER] Received CONNECT [%s]\n", buffer);

    memset(ip_address, '\0', sizeof(ip_address));
    int pos = strrchr(buffer, NAT_VM_DELIMITER) - buffer;

    strncpy(ip_address, buffer, pos);
    ip_address[pos] = '\0';
    tport = atoi(buffer + pos + 1);

    if(lsk_in->sin_family == AF_INET)
    {
        lsk_in->sin_addr.s_addr = inet_addr(ip_address + 7);
        lsk_in->sin_port = htons(tport);
    }
    else if(lsk_in->sin_family == AF_INET6)
    {
        inet_pton(AF_INET6, ip_address, &(lsk_in6->sin6_addr));
        lsk_in6->sin6_port = htons(tport);
    }

    fprintf(stderr, "[LD_INTERPOSER] IP[%s], Port[%d] for VM[%s]\n", ip_address, tport, vm_ip);
}

int my_ret = real_connect(fd, sk, sl);
fprintf(stderr, "Done\n");
return my_ret;
}
这里,sock是我在共享库的“构造函数”中初始化的套接字


该程序工作正常,并打印完成。在最后一行(返回),它给出堆栈粉碎错误。我不知道这是什么原因。

我怀疑
strrcr
在行中返回
NULL

int pos = strrchr(buffer, NAT_VM_DELIMITER) - buffer;
然后,
pos
将是巨大的,下面的行将读取和写入无效的地址

始终检查函数的返回值(尤其是当函数在从程序外部接收的数据上运行时)。


另外,正如我在评论中所写,永远不要使用
sprintf
。我不知道它是否失败,因为我不知道什么是
NAT\u VM\u CONNECT\u规则
。即使您计算了字节数并知道自己没事,也应该小心使用
snprintf

抱歉,更新了代码。堆栈崩溃错误是由检查可能的缓冲区溢出错误的内置机制引起的。检查您是否从未向
缓冲区
临时缓冲区
写入与其各自大小相同的字节。切勿使用
sprintf
,尤其是在怀疑溢出的情况下。我不知道这是否是这里出错的原因,但这是首先要修复的。你确定
strrchr()
没有返回
NULL
?@buc:我确定
buffer
tempBuffer
没有溢出。它们的容量是每个1024字节,最多可容纳100个字符。我认为你提到的那行不是问题所在。收到的答复的格式为
IP | port
NAT|u VM_分隔符
是一个字符“|”)。我得把这些分开。如果该语句是问题所在,则行
fprintf(stderr,[LD\u INTERPOSER]IP[%s],VM[%s]\n的端口[%d],IP\u地址,tport,VM\u IP)无法打印正确(单独)的IP和端口。另外,我认为如果该语句是问题所在,程序将在那里终止,而不是一直工作到最后一个语句fprintf(stderr,“Done\n”)。可能这不是导致问题的原因,但这是一个bug。您应该首先修复我向您展示的两个bug,然后尝试调试它。我已经纠正了您提到的所有bug。仍然检测到相同的
***堆栈崩溃***
输出。