abex - crackme 3
문제파일은 미리 삽입해놓겠습니다.
zip 파일로 다운받으려고 하니까 자꾸 바이러스로 여겨져서 실패하는듯....
abex-crackme3
먼저 들어가기 전에 Detect It Easy라는 프로그램에 대해 간단히 소개하고 넘어가도록 하겠습니다.
줄여서 DIE라는 프로그램은 PE구조를 살펴보는 데 사용하는 프로그램으로서 pe 구조를 살펴볼 뿐만 아니라 프로그램을 개발한 언어와 패킹 여부도 함께 보여주는 프로그램입니다.
+) 파일을 직접 수정까지 가능하기도 합니다.
https://github.com/horsicq/DIE-engine/releases
Releases · horsicq/DIE-engine
DIE engine. Contribute to horsicq/DIE-engine development by creating an account on GitHub.
github.com
프로그램을 분석하기 전에 가장 먼저 알아야 할 것은 어떤 언어로 개발되었고, 패킹이 되었는지 여부를 알아보는 것입니다. 해당 프로그램을 통해 기본적인 프로그램에 대한 정보를 알 수 있습니다.
- 리틀 엔디언
- 32비트 프로그램
- 델파이로 작성됨
아마 그냥은 파일이 실행이 안될텐데, 확장자를 .exe로 바꾸면 실행이 될 것입니다.
그냥 확인을 누를 경우 ->
함수 호출 규약
함수를 호출할 때 인자를 전달하는 방식이나 함수 실행이 끝나고 스택을 정리하는 방식에 대한 약속
- cdecl
- stdcall
- fastcall
cdecl
인자가 오른쪽에서 왼쪽으로 순서대로 스택으로 전달됩니다.
함수가 종료될 때 피호출자(호출된 친구) 스스로 스택 프레임을 정리합니다.
stdcall
인자가 오른쪽에서 왼쪽으로 순서대로 스택으로 전달됩니다.
함수가 종료될 때 피호출자 스스로 스택 프레임을 정리합니다.
fastcall
인자가 오른쪽에서 왼쪽으로 순서대로 레지스터를 사용해서 전달됩니다.
레지스터를 사용하기 때문에 별도로 스택을 정리할 필요가 없습니다.
윈도우에서 음수 표현 방식
2의 보수 방식으로 표현
윈도우에서는 음수를 먼저 -를 뺀 이진수로 표현한 후 -> not 연산을 한 다음 1을 더해준 후 16진수로 바꾼 결과를 출력한 값으로 인식합니다.
(ex> -4 표현 : 4 -> 0000 0100 -> 1111 1011 -> 1111 1100 -> F C)
abex - crackme 3
책에서는 ollydbg로 문제를 풀었는데, ui가 불편해서 x32 dbg로 문제를 풀었습니다.
x32 dbg에서는 f9 키를 눌러 run을 할 수 있습니다.
x32 dbg에서 ffff ffff라고 뜨는데, ollydbg에서는 -1이라고 뜨는 모양.....😭
ffff ffff는 윈도우의 2의 보수 방식 표현을 생각해서 계산해보면 됩니다....
만약에 cmp에 bp를 걸고 실행할 경우 창이 뜨고 멈추게 될 텐데, 그 때 우리는 아무것도 안했기 때문에 그대로 f8(건너서 실행하기)을 실행하면 je에 걸려서 "Error" 가 뜨게됩니다.
그러면 eax의 값이 -1과 같지 않아야 합니다.
프로그래밍을 좀 해보신 분들이라면 알겠지만, -1은 해당 변수가 비어있을 때를 의미합니다. 즉, 파일이 있는지 / 없는지 여부를 판단하고 있습니다.
덤프에서 따라가기 -> 해당 4020CA 주소에 들어있는 값을 보면 ff ff ff ff 로 eax에 들어있는 값이 저장된 것을 볼 수 있습니다.
만약에 선택한 주소를 택할 경우 -> 해당 메모리 주소인 0040102F의 바이트 값이 아래에 뜹니다
요렇게.....
지금까지 나온걸 보면
1. 파일이 존재해야 한다. ( 파일 존재 시? 0 / 파일이 없으면 -1)
2. 파일 이름은 아마도 4020B9:"abex.l2c", abex.l2c 일 것!
그러고 나서 함수를 보면 GetFileSize라는 함수를 불러오는 걸 볼 수 있습니다
앞서 함수 호출 규약을 공부해보면 알겠지만,
4020CA라는 주소에 들어있는 값을 인자로 받는 함수를 실행하고, cmp eax, 12 명령어를 실행하고 있다는 것을 확인할 수 있습니다.
12는 16진수로, 10진수 기준 18을 의미합니다.
즉 파일 사이즈는 18바이트라는 의미로, 메모장이나 워드 파일 기준 18바이트의 문자, 즉 영문자 / 숫자 18문자가 들어있어야 한다는 의미입니다.
3. 18개의 문자열이 들어있는 파일이어야 할것
그러면 abex.l2c라는 이름의 파일을 만들어보도록 하겠습니다.
한번 실행을 시켜봅시다
성공적으로 찾았습니다.
함수 호출 규약의 경우 나중에 따로 정리할 예정입니다.