vortex level0

2009. 9. 23. 00:24

  1. Your goal is to connect to port 5842 on vortex.labs.pulltheplug.org and read in 4 unsigned integers. Add these integers together and send back the results to get a username and password for level 1.

    level0의 목표는 서버에 접속해서 unsigend integer 4바이트를 읽어서 합친후에 서버로 전송해주면
    된다. 쉽게 클리어 할  수 있을 것이라 생각했는데 좀처럼 원하는 결과가 나오질 않았다.

    확인해 보니 recv 한 버퍼의  값들이 전부 이상하게 찍힌다. 자금까지 exploit를 만들때는

    unsigned
    char recv[512]= {0, };   
    .......
     if((str_len = read(sock, recv, 64))==0)
             
     error_handling("read() error!");

    위와 같이 unsigned char 형태의 배열을 read함수의 2번째 인자로 줘서 사용했다.
    역시나 이 코드를 사용했기에 읽어오는 부분을 한번 의심해 보았다.

    read 함수의 원형이다.

    ssize_t read(int filedes, void *buf, size_t nbytes);

    void *buf 를 보니 먼가 감이 왔다. 문제에서도 데이터형을 정확하게 알려준것도 의심스럽고 해서
    unsigned integer 로 선언해서 char *로 캐스팅하니 값이 제대로 찍혔다.

    Username : vortex1  Password:  Gq#qu3bF3


#include <stdio.h>  
#include <stdlib.h>  
#include <arpa/inet.h>  
#include <unistd.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netdb.h>


#define SERVER "vortex.labs.pulltheplug.org"
#define PORT "5842"  
#define TRUE 1  

void error_handling(char *message);  

int main(int argc, char **argv) {  

    int sock;  

    int str_len;  
    int option;  
    socklen_t optlen;  

    struct hostent *myent;
    struct in_addr myen;
    long int *add;

    unsigned int number, count; 
    unsigned int total;

    struct sockaddr_in serv_addr;  

    /************* socket initialize and connect ****************/      


    if(!(myent = gethostbyname(SERVER)))
    {
        printf("gethostbyname error\n");
        exit(0);
    }

    add = (long int*)*myent->h_addr_list;
    myen.s_addr = *add;
    
    sock=socket(PF_INET, SOCK_STREAM, 0);  
    if(sock == -1)  
        error_handling("socket() error");  

    optlen = sizeof(option);  
    option = TRUE;  

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));  
    memset(&serv_addr, 0, sizeof(serv_addr));  

    serv_addr.sin_family=AF_INET;  
    serv_addr.sin_addr.s_addr=inet_addr(inet_ntoa(myen));  
    serv_addr.sin_port=htons(atoi(PORT));  

    if(connect(sock, (struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)  
        error_handling("connect() error!");  

    /****************** main start ********************/  
    

    total = 0;
    count = 0;
    while(count <4){
    if((str_len = read(sock, (char *)&number, sizeof(unsigned int)))==0)     
        error_handling("read() error!");  

    printf("Message from server : %d \n", number);   

    memset(recv, 0x00, 64);
    count++;
    total += number;
    }

    printf("total = %d\n", total);
    
    if((str_len = write(sock, (char *)&total, sizeof(unsigned int))) == -1) ///write 1  
        error_handling("write() error");  
    
    if((str_len = read(sock, recv, 64))==0)     
        error_handling("read() error!");  

    printf("Message from server : %s \n", recv);   
   
    close(sock);  
    return 0;  
}  

void error_handling(char *message)  
{  
    fputs(message, stderr);  
    fputc('\n', stderr);  
    exit(1);  
}

'War game > vortex' 카테고리의 다른 글

vortex12  (0) 2014.01.02
Vortex11  (3) 2013.04.02
vortex level10  (0) 2011.04.18
vortex level8  (0) 2010.12.09
vortex level3  (0) 2009.10.03
vortex level1  (0) 2009.09.24

badcob War game/vortex