vortex level0
2009. 9. 23. 00:24
-
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 |