Reversing.kr 1번 Easy Crack(100pt) 문제 풀이
- Easy Crack
[reversing.kr 링크] #문제를 풀려면 회원가입 후 로그인해야함.
회원가입 후 로그인을 하고 Challenge 카테고리로 들어오게 되면 문제들을 확인 할 수 있다.
첫번째 문제인 Easy Crack(100pt) 문제를 풀어보도록 하자.
문제를 클릭하면 Easy_Crack.exe 파일이 다운받아진다.
해당 문제파일을 실행시키면 사용자가 입력할 수 있는 창이 출력된다.
임의의 값을 넣고 전달했더니 부정확한 패스워드라는 문구와 함께 프로그램이 종료된다.
해당 문제는 출제자가 정해놓은 패스워드를 리버싱으로 알아내고 그것을 입력하면 풀리게 되는 전형적인 리버싱 기초 문제이다.
리버싱을 하겠다! 하면 가장먼저 확인해야하는 것은 패킹여부와 어떤 언어로 프로그램이 제작되었는지 확인이 필요하다.
패킹여부, 언어 두 가지를 확인할 수 있는 Exeinfo PE 툴을 사용해보자.
[ Exeinfo PE ] #툴 찾는게 귀찮은걸 알기에 친절하게 올리도록 한다 ㅎ
Exeinfo PE 를 실행하고 문제 파일을 드래그 앤 드롭하면 이렇게 C++로 제작 되었다는 정보와
Not packed 즉, "패킹이 되어있지 않다" 라는 정보를 얻게 되었다
[Exeinfo 결과]
패킹여부 : Not packed
언어 : C++
이제 IDA PRO 를 이용해 코드가 어떤식으로 작성되었는지 디컴파일해서 확인해보자.
디컴파일 하면 위 사진과 같은 코드가 출력되었다.
코드에서 해당부분을 확인하면 패스워드를 검사해서 출제자가 의도한 패스워드가 맞으면 정답을 알려는
MessageBox가 출력된다. 즉, 정확한 패스워드를 입력했는지를 확인하는 수단은 MessageBox이다.
이제 본격적으로 ollydbg를 이용해서 문제를 풀어보자.
ctrl + n을 입력하게되면 해당 프로그램에 사용한 라이브러리 import 내용을 확인 할 수 있다.
해당문제가 패스워드를 체크하는 수단은 MessageBox 이므로 해당 부분으로 가서 ctrl+r을 입력하여
MessageBox 라이브러리를 사용하고 있는 부분을 확인하자.
두번의 MessageBox 호출이 있다.
패스워드가 맞을 경우와 틀렸을 경우 이렇게 두번이다.
실제로 확인해보니 00401121 주소에서 호출한 MessageBox는 성공했을 경우를 출력하고
00401142 주소에서 호출한 MessageBox는 패스워드가 틀렸을 경우를 출력한다.
그렇다면 패스워드가 틀렸을때 출력되는 MessageBox로 JMP 하게 만드는 분기문이 어디에 있는지 확인해보자
00401135 주소를 확인하면 [ 4010B5, 4010CD, 40110B, 401112 ] 4개의 분기문에서 패스워드를 검사한다는 것을 알 수 있다.
004010B5 분기문을 확인해보면 ESP+5 와 , 61(a) 를 비교하는 것을 확인할 수 있다.
ESP+5에 우리가 입력하는 값이 들어가 있는지 그리고 들어가 있다면 패스워드의 몇번째 자리를 의미한지를 확인해보자
먼저 브레이크 포인트(F2)를 004010B0 주소에 걸어주자 그리고 프로그램을 실행해 임의의 값을 입력하자.
"abcdef" 를 입력하고 프로그램을 실행했다.
위 그림을 보면 입력한 "abcdef" 의 값중에서 b와 61(a)를 비교한다. 이것을 통해 패스워드의 두번째 자리는 "a" 가 된다는 것을 확인 할 수 있다.
더욱 정확히 확인하기 위해 addressing 부분을 확인 했다. 결과는 정확히 esp+5는 내가 입력한 패스워드의 두번째 자리인 b를 담고 있다.
첫번째 분기문을 넘어가기 위해 입력값 두번째에 a를 넣고 다시 실행해보자.
입력값은 "pabcedf"
이번에는 특정 함수가 3개의 인자를 받는다. arg3=2 arg2= "5y" arg1="bcedf"
그리고 3개의 인자를 00401150의 주소에 해당하는 함수를 호출해 넘겨준다.
3개의 인자가 해당 함수에서 어떻게 사용되는지 그리고 패스워드의 몇번째 부분을 체크하는지 확인하기 위해
Step info(F7)을 통해 함수내부의 동작 과정을 살펴보자.
해당함수의 동작 과정을 확인해보면 순서대로 arg3 인자는 ECX 에 저장하고 arg1 인자는 EDI에 , arg2 인자는 ESI에 저장된다.
arg1에 우리가 입력한 값 "pabcedf" 중 앞 2자리가 없는 "bcedf"가 저장되는 것을 보아 arg3의 인자가
함수내에서 하는 역할은 사용자가 입력한 값중 앞자리를 arg3에 저장된 값 만큼 자르는것 같다.
[정리]
Arg1 = 우리가 입력한 값
Arg2 = 출제자가 정의해둔 특정 부분의 패스워드인 "5y"
Arg3 = 사용자가 입력한 값을 앞에서부터 몇개를 잘라낼것를 전달하는 인자
그리고 함수내에 존재하는 첫번째 분기문을 확인해보면 패스워드의 3번째 자리인 b와 "5"를 비교한다.
그러므로 패스워드의 3번째 자리는 "5"라는 것을 알 수 있다.
패스워드 3번째에 5를 입력하고 다시한번 실행해보면 두번째 분기문에서 패스워드의 4번째 자리와 "y"를 비교한다.
그러므로 패스워드의 4번째 자리는 "y" 라는것을 알 수 있다.
이번에는 사용자가 입력한 패스워드의 5번째 자리를 시작으로 출제자가 정의해둔 "R3versing" 라는 문자를 반복적으로 비교한다. 즉, 입력한 패스워드의 5번째 이후부터 패스워드는 "R3versing"가 되어야 한다.
마지막 분기문에서는 간단하게 esp+4와 45("E")를 비교한다.
출제자가 정의한 패스워드의 첫번째 자리는 "E" 가 된다.
[ 패스워드 ]
첫번째 자리 : "E"
두번째 자리 : "a"
세번째,네번째 자리 : "5y"
다섯번째 이후 자리 : "R3versing"
최종적인 패스워드 : "조합하도록 하자"
#Easy Crack Clear!
'Reversing > Reversing.kr' 카테고리의 다른 글
Reversing.kr 6번 ImagePrc(120pt) 문제 풀이 (0) | 2017.11.11 |
---|---|
Reversing.kr 5번 Replace(150pt) 문제 풀이 (0) | 2017.11.11 |
Reversing.kr 3번 Easy Unpack(100pt) 문제 풀이 (0) | 2017.11.10 |
Reversing.kr 2번 Easy KeygenMe(100pt) 문제 풀이 (0) | 2017.11.10 |