ssh://io.smashthestack.org:2224 id : level2 pw : WE5aVWRwYPhX |
Summary : integer range , SIGFPE signal
서버에 접속하여 문제 파일을 확인한다.
level2@io:/levels$ ls -l | grep level02 -r-sr-x--- 1 level3 level2 7247 May 26 12:00 level02 -r-------- 1 level2 level2 490 May 26 11:59 level02.c -r-sr-x--- 1 level3 level2 6940 May 26 11:57 level02_alt -r-------- 1 level2 level2 437 May 26 11:56 level02_alt.c |
이번 level은 2개의 문제로 구성되있으며 2문제 모두 source파일이 제공되어있다.
alt는 나중에 다시 풀이한다.
level02의 source파일부터 확인해본다.
level2@io:/levels$ cat level02.c #include <stdio.h> void catcher(int a) int main(int argc, char **argv) if (argc != 3 || !atoi(argv[2])) |
SIGFPE signal에 대해서는 http://wikipedia.qwika.com/en/SIGFPE 를 참고했다.
이제 주시해야 할 부분은 atoi(argv[1]) / atoi(argv[2]) 이다.
위 링크에 명시되어있듯이 SIGFPE signal은 정수가 0으로 나누어질때도 발생한다.
하지만 argv[1]을 나누는 값인 argv[2]가 0일 경우에 연산과정을 거치지도 않고 프로그램이 종료되기 때문에 다른 경우를 생각해야한다.
다시 링크에 명시되있는 항목을 살펴보면 integer overflow일때도 SIGFPE signal이 발생함을 할 수 있다.
int 자료형의 범위는 -2147483648 ~ 2147483647인데 이 범위를 초과하는 값이 int 자료형에 들어가게 된다면 integer overflow가 발생한다.
마침 , argv[1]과 argv[2]가 나누기 연산을 거치기 때문에 integer overflow를 발생시킬 수 있다.
-2147483648 / -1 연산을 하면 결과는 2147483648로 , int 자료형의 범위를 벗어나기 때문이다.
argv[1]과 argv[2]에 각각 -2147483648과 -1을 넘기면서 실행한다.
level2@io:/levels$ ./level02 -2147483648 -1 WIN! |
level3 user의 쉘을 획득하고 password를 획득했다.
'Wargame > IO.smashthestack.org' 카테고리의 다른 글
IO smashthestack level5 (0) | 2011.07.25 |
---|---|
IO smashthestack level4 (0) | 2011.07.25 |
IO smashthestack level3 (0) | 2011.07.17 |
IO smashthestack level1 (0) | 2011.07.17 |