ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [02-10 공부정리]
    공부정리 2018. 2. 10. 03:09

    오늘은 tuts4you에 Lena Tutorial 문제를 풀었다.

    1번 문제를 풀었는데 1번문제의 write up하는 형식의 글로 쓰도록 하겠다.


    우선 tuts4you 사이트는 여기다.

    [tuts4you Site]


    .rar의 압축파일이며, 비밀번호는 tuts4you다.

    압축을 풀고 file폴더에 들어가면


    [File]

    기본적인 참고문서들과 함께 우리가 리버싱할 reverseMe.exe 파일이 있다.

    거두절미하고 실행부터 해보자!


    [reverseMe 실행]

    실행을 하면 "Evaluation period out of date. Purchase new license" 라는 창이 하나뜨고

    확인을 누르면 종료된다.

    뭐 평가기간이 만료되었으니 새로운 라이센스를 구매하라는 글인데..

    실행으로 얻을 수 있는 정보는 없으니 ollyDBG로 뜯어보자


    [ollyDBG reverseMe실행]

    EP는 메인에서 바로 시작된다.

    API함수들이 호출되고 아까 우리가 봤던 문자열이 보인다.

    그리고 파란박스를 보면 폴더안에 없던 Keyfile.dat이라는 뭔가 촉이 오는 파일의 이름이 보인다.

    그 아래부분을 더 봐보자



    그 아랫부분을 보면 파란박스에는 Readfile이라는 함수를 호출해서 파일을 읽어내고 있고

    그 아래 빨간박스에는 위에서 조건분기가 안되면 실행되는 반복문이 존재한다.

    좀 더 아래부분을 확인해보자


    [다른 MessageBox의 존재]

    아까 우리가 봤던 메시지창말고 또 다른 메시지박스가 존재하는 것을 알 수 있다.


    여기서 우리가 얻은 정보는 Keyfile.dat 이라는 파일명 / 파일을 내용을 읽어들이는 함수의 존재

    또 다른 메시지박스

    그럼 우선 Keyfile.dat이라는 파일을 생성해서 다시 분석해보도록 하자



    [Keyfile.dat]

    Keyfile.dat 파일안에 "ABCDEFG"를 입력하고 만든 후에 다시 reverseMe.exe를 실행해봤다.


    오 이번에는 다른창이 떴다.

    위에서 봤던 다른 메시지박스다.

    keyfile의 내용이 다르다고 하니 다시 OllyDBG로 확인해보자


    [ReadFile( )]

    아까 봤던 파일내용을 읽어오는 함수에 BP를 걸고 실행했더니

    아까 우리가 Keyfile.dat에 넣어줬던 내용인 "ABCDEFG"가 코드창에 보인다.

    그 후, 진행해보면 ReadFile에서 파일이 없으면 EAX에 0을 반환해서 JNZ분기문에 걸리지 않고

    JMP문으로 인해서 아까 그 메시지박스함수로 점프되는 구조인듯 하다.


    그 후로 XOR연산으로 EBX와 ESI를 0으로 초기화 해준다.


    [파일내용 길이값체크]

    그리고 다시 분기문이 나오는데 [0x402173]의 값과 0x10(16d)를 비교하고

    JL(왼쪽값이 오른쪽값보다 작으면)분기문이 진행된다.


    덤프창으로 확인해보면

    [0x402173]의 값은 7이다.

    우리가 ABCDEFG 총 7개의 문자를 입력해줬는데 그 길이값이 저장됨을 알 수 있다.


    조건분기를 피하기위해 16개의 문자를 입력하고 다시 진행했다.


    다시 덤프창을 확인해보니 길이값이 10(16d)로 잘 저장되어 있으며



    조건분기에 걸리지않고 계속 진행됐다.


    그 후 진행코드를 다시 보자

    이번엔 [0x40211A]에 EBX를 더한 주소의 값을 가져와서 AL의 저장하고

    AL이 NULL(0)인지 확인 후, NULL이면 반복문을 빠져나간다.


    NULL이 아니라면 계속 진행해서 그 값이 47인지 확인하고

    아니면 [INC EBX]로 바로 뛰어넘고 반복문 처음으로 돌아간다.


    그럼 저 주소의 덤프를 확인해보자


    [0x40211A Dump]

    보면 우리가 파일에 저장한 문자열들이 저장되어 있다.

    따라서, 47은 ASCII코드의 'G' 를 의미함을 알 수 있다.


    반복문을 다 실행하면

    우리가 입력한 문자열에 G가 하나만 있었으니 ESI도 1로 세팅되어있다.


    [다른 메시지박스 조건분기]


    다음 코드를 보면 ESI와 8을 비교하고

    ESI가 더 작으면 아까 봤던 메시지박스로 조건분기하는 코드를 볼 수 있다.

    따라서 ESI가 8, 즉 파일내용에 G가 8개 이상 있어야 저 메시지박스로 넘어가지 않음을 알 수 있다.

    그 다음 코드인 [JMP 00401205]에서 00401205 위치로 가봤다.


    [Success MessageBox]

    이렇게 "You really did it! Congratz !!!" 라는 Success MessageBox를 실행하는 코드가 존재했다.


    그럼 다시 파일내용에 G를 8개이상 넣고 실행해보도록 하겠다.


    [Keyfile.dat]

    G를 9개 넣고 다시 실행해보면


    [Success MessageBox]

    위에서 봤던 Success MessageBox가 실행되는 것을 확인할 수 있다.


    OllyDBG로 어떻게 진행되는지 확인해보면

    [ESI 9]

    반복문이 끝나면 ESI는 G의 갯수인 9로 세팅되어 있으며


    [ESI,8 분기통과]

    G갯수 값을 체크하는 분기문도 통과했다.

    그 후 00401205로 JMP해서


    Success MessageBox를 실행하는 모습을 볼 수 있다.




    [여담..]

    이 문제를 풀고 2번문제를 진행하면서 알게된 사실인데

    1번문제는 그냥 조건분기문을 바꿔서 SuccessBox를 실행되게 만드는 것이 이 문제의 목적이었고

    2번문제의 폴더안에는 Keyfile.dat이라는 파일이 존재하고 반복문 로직을 유추해서 

    Keyfile내용을 바꾸는게 2번문제의 목적이였다.


    둘 다 틀린방법이 아니다.

    분석하는 스타일도 틀리고, 문제를 풀어나가는 방식도 틀리기 때문에

    나올 수 있는 상황인거다.

    이 방법과 제작자가 의도한 방법으로 풀지않았어도 틀린방법이 아니다.

    문제풀이에 정답은없다라는 것을 말해주고 싶다.

    '공부정리' 카테고리의 다른 글

    [02-14 공부정리(FSB 정리)]  (0) 2018.02.15
    [02-11 공부정리(Chaining RTL 정리)]  (0) 2018.02.11
    [02-08 공부정리(RTL정리)]  (1) 2018.02.08
    [02-07 공부정리]  (2) 2018.02.07
    [02-06 공부정리]  (1) 2018.02.06

    댓글

Designed by Tistory.