드디어 분석 완료 .
내용이 너무 방대한 관계로 파일로 대체합니다.
Position.udd
Position.bak
(Position.exe 파일을 바탕화면에 position 폴더를 만들고 그 안에 넣어서 분석하세요 !! udd파일에 파일경로가 저장되어있어서 다른 경로의 position 파일을 열면 새로운 udd파일을 리네임해서 생성해버립니다. 분석에 사용된 OS는 win XP SP3 입니다.)
position.c
(디스어셈 내용 소스로 만든 파일)
똑같은 알고리즘을 그대로 구현한 소스와 position을 분석하면서 comment 를 달아놓은 udd파일 첨부 .
(serial key 알고리즘 부분에 세세하게 coment 다 달아놨습니다. 소스와 함께 보셔야 이해가 되실거에요 .. 코딩도 날코딩이라 알아보기 힘드셔도 양해 바랍니다 ㅠ.ㅠ)
(실제 디스어셈에선 SEH예외처리도 사용되고 갖가지 예외와 문자열 사이즈를 확인하는 등 각종 연산들이 있지만 중요하지 않은 정보라 포함시키지 않았습니다. 사실 저도 문자열 사이즈가지고 무슨 연산을 하는지는 잘 모르겠네요. 그 부분들은 전부 comment 에 Unknown 이라고 표시해뒀습니다.)
예제 값
name : zero
serial : 77777-77778
올바르지 않은 serial 일경우 각종 비교문에 의해 알고리즘 루틴을 확인하기 힘드니 첫 분석이시라면 이 값을 쓰시길 권장합니다
혹은 소스를 컴파일해서 name값으로 serial key 를 얻은후 그 값으로 디버깅 해보셔도 됩니다 !
이 프로그램의 알고리즘은 소스코드에 나온 그대로이구요
순서대로
0-4
>> 비트 연산
& 1 연산
+5 혹은 ++ 연산이 전부입니다.
name문자열을 2개씩 2개의 그룹으로 (zero 가 입력되면 ze, ro 를 나눔) 쪼개서
데이터값들을 추출합니다.
소스의 nameData1,2 ,3 ,4 버퍼들이
디스어셈을 통해 얻은 알고리즘 그대로 적용시켜 추출한 데이터값입니다.
이 데이터들을
0 - 2
3 - 3
1 - 4
2 - 0
4 - 1
nameData1,2 와 nameData3,4 를 name처럼 그룹으로 묶어
위에 적은 index끼리 ADD연산을 합니다.
그리고 이게 바로 serial key 값이죠.
첨부한 소스를 컴파일하고 실행해보면 입력된 name 값에 따른 serial key 를 만들어서 출력해줍니다
전 이제 이 데이터들로 문제가 제시한
76876-77776 serial 값을 갖는 name을 찾아봐야겠습니다. -_-.
추출된 5가지의 데이터는 결국 0아니면 1 (and 1 을 하므로)
거기에 ++냐 +5 의 차이일뿐 즉 데이터는 전부
1,2 혹은 5,6 이라는 거지요 .
이 값들을 더해서 나올수 있는 조합은 기껏 해봐야
6, 7 , 8 세가지 입니다.
조금만 고민해보면 그 name값을 찾는 알고리즘을 작성할 수 있을것 같은데
기어코 브루트 포싱을 쓰지 않고 해보려 합니다 - - ^
는.. 손실 알고리즘은 도저히 어떻게 못하겠군요 -_-; 그냥 브루트포싱을 써야겠습니다 !!
그래도 나름대로 추출한 알고리즘을 기반으로 하는 브루트 포싱이니 알고리즘 기반이라는 것에서 위안을 삼아야 겠네요
마지막 문자는 p라고 readMe에 있었으니
나머지 3문자를 3중첩 for문으로 소문자 알파벳 3자리를 생성해서 쭉 돌려 만들어진 serial key 와
문제의 serial key를 비교하면 문제 해 결 !