War game/vortex
vortex level0
badcob
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
#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); }