-
[02-10 공부정리]공부정리 2018. 2. 10. 03:09
오늘은 tuts4you에 Lena Tutorial 문제를 풀었다.
1번 문제를 풀었는데 1번문제의 write up하는 형식의 글로 쓰도록 하겠다.
우선 tuts4you 사이트는 여기다.
.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 댓글