티스토리 뷰

드디어 2번 입니다 ! 접속하고 바로 문제 살펴보죠 !

문제가 두 개가 있습니다... 왜 두 개인지는 모르겠지만 둘 다 풀어봅시다 !

level02.c 부터 살펴봅시다 ~

사실 이 문제를 먼저 한 이유는 FTZ 6번에서 signal에 대해서 공부 자세히 했어서... 쉬워 보여서 했습니다 !

시그널에 대해서 궁금하시면 클릭 !

아무튼 SIGFPE라는 걸 일으키면 catcher라는 함수를 실행해준다는 것을 알 수 있습니다 ~

SIGFPE가 뭔가 검색해봤습니다... 뭘 알아야 풀던가 하죠 ㅎㅎ..

SIGFPE <- 여기서 Ctrl + f 로 sigfpe 검색하시면 내려가서 볼 수 있어요 ~

그냥 간단하게 정수오버플로우나 정수를 0으로 나누거나 등등인데요...

소스를 보시면 아시겠지만... 두 번째 인자로 0이 들어갈 수가 없네요... ㅠㅠ.. 그래서 택한 방법이 정수오버플로우 입니다 !

먼저 답부터 공개하고 풀이갑니다 ~ 답은 Ib3F7i7FqjziuDOBKi 네요 ^^.

이제 풀이입니다 ! 왜 저렇게하는데 오버플로우가 되고 abs를 우회할 수 있는지요.

일단 abs의 구현 원리를 아셔야 되는데... 절대값반환... 간단하게 많이 짜보셨죠 ?

대충 위와 같이 되어있습니다. -1 즉, FFFFFFFF 을 곱하는거죠.(and 연산)

그럼 -2147483648을 연산해볼까요 ?

변환이 안되네요... 왜 ! 일까요 ??? 간단한 연상르 해보시면 됩니다 ㅎㅎ.

-2147483648 = 1000 0000 0000 0000 0000 0000 0000 0000 이고,

  -1 = 1111 1111 1111 1111 1111 1111 1111 1111 입니다. 뭔가 감이 오시나요 ?

and 연산을 해도 값이 똑같습니다 !!!! 이러한 원리로 level2의 abs를 피해갈 수 있고요 두 번째로 오는 수를 -1로 하면 곱하면서 2147483648 이 양수로 표현되야 하는데 이걸 16진수로 표현하면 80000000이 되야 합니다만... 이 수는 -2147483648 과 같습니다. 고로 정수 오버플로우 된 것 이죠 !

흠... 이해가 되셨을지 모르겠네요... 아무튼 다음엔 Level02_alt 를 풀어 봅시다 ~

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함