2015. 5. 15. 11:33ㆍSecurity ★ Development/Reversing
http://codeengn.com/challenges/advance/11
Problem : Find the Name when the Serial is 94E7DB1B.
This problem has multiple solutions so post any one solution on the message board in a private thread and we will verify it for you.Note : "Serial Accepted" must pop up for the serial.
분기점 위주로 살펴보면 해당 CALL에서 Serial을 생성한다는 것을 알 수 있습니다.
내부에는 긴 루프가 있고 빠르게 디버깅을 돌려보면 00402439위치에 특정 값들을 만들어 나간다는 것을 확인 할 수 있습니다. 완성된 값은 Serial이 됩니다.
그리고 내부 함수중에 이런 곳을 호출하는 부분이 있습니다. 00402439와 402538 부분의 메모리를 보면
00402538뒤로 다양한 값들이 생겼다 사라집니다. 아무튼 시리얼을 어떻게 만들어내는지 확인해봅니다.
루프는 40217B에 있는 문자열에서 문자를 하나씩 가져와서 case 혹은 if문으로 이루어져 있습니다. 그리고 0040138A에서 가져올 다음 문자위치를 계산합니다.
00422439위치에 시리얼을 쓰는 부분은 004011DE에 있습니다. 0040116D에서 문자를 가져와서 AL의 값으로 아래에서 조건문을 거칩니다. 그러다가 0040137E의 부분에서 종료를 하게됩니다.
004011B1 부분과 004011C9 부분을 보면 004011B1의 작업이 모두 끝난후 004011C9에서 시리얼을 생성하고 있습니다.
여기서 중요한건 Name값으로 문자의 순서와 상관없이 같은 문자로 구성된 문자열이라면 같은 Serial을 내놓는다는 것입니다.
해당 코드를 복원하고 Brute force를 돌리는데 이 때 문자열을 대상으로 하면 아마 금방 결과가 나오지 않을겁니다. 문자열을 누적해 한번의 작업이 끝난 후 Serial로 변환하는데 누적된 결과값은 정수형으로 나옵니다. 이 값을 Brute force 대상으로 잡으면 811이라는 값이 나옵니다. 그럼 문자열을 이루는 아스키코드의 10진수 합이 811이 되어야한다는 뜻입니다.
'Security ★ Development > Reversing' 카테고리의 다른 글
리버스엔지니어링 문제 Advance 13 (2) | 2015.08.09 |
---|---|
리버스엔지니어링 문제 Advance 12 (0) | 2015.07.12 |
리버스엔지니어링 문제 Advance 10 (0) | 2015.05.03 |
리버스엔지니어링 문제 Advance 9 (0) | 2015.05.02 |
리버스엔지니어링 문제 Advance 8 (0) | 2015.05.01 |