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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#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