[Reversing.kr] Position

semon·2022년 11월 3일
0

Reversing

목록 보기
7/10

문제

Reversing.kr의 Position 문제입니다.

ReadMe.txt를 보니 Serial 76876-77776에 해당하는 Name 값 *** p을 찾아야 하는 걸 알 수 있습니다.

분석

실행을 해보면 Name과 Serial을 입력받는 것을 알 수 있습니다.

DIE로 확인해보니 Unicode가 사용된 것을 알 수 있습니다.

IDA에서 String 옵션에서 Unicode를 포함하니 Correct message를 호출하는 부분을 찾을 수 있었습니다.

해당 부분의 어셈블리 코드를 windbg로 보니 Correct Wrong의 분기점 이전에 함수를 하나 호출하는 것을 알 수 있습니다.

해당 함수의 시작 지점에 break point를 걸고 Name값을 abcp, Serial은 12345-12345를 입력으로 주고 실행을 해보면

cmp 부분에서 [ecx-0x0c]에 저장된 값과 4를 비교합니다. 이때 [ecx-0x0c]에 저장된 값은 입력 값으로 준 Name의 길이입니다. 즉 Name의 길이가 4인지 비교를 합니다.

길이가 4인 게 확인이 되면 다음 부분에서 반복문을 통해 ax의 갑과 0x61보다 큰지와 0x7a보다 작은 지를 4번 확인합니다.

이때 ax에 저장된 값은 0x010cb788에 저장된 값으로

이 값은 입력으로 준 abcp가 들어있습니다. 즉 Name의 각각의 값이 순서대로 ax에 들어가며 a~z의 범위에 있는지를 확인합니다.

그 이후 ax와 0x2D의 값을 비교하고 같지 않으면 Wrong으로 jmp를 합니다.

이때 ax에 저장된 값은 0x010c9a3a에 저장된 값으로

확인을 해보니 입력으로 준 Serial 값 중에서도 6번째에 있는 -(0x2d)였습니다. 즉 serial의 중간에 '-'이 들어가는지 확인을 하는 부분입니다.

이 부분까지 통과를 하면 해당 부분에서 Name의 첫 번째 값으로 and와 shift 연산을 하는 걸 확인할 수 있습니다.

또 해당 부분에서 위의 연산 값 중 일부를 인자로 가지고 함수를 호출을 합니다.

함수 내부로 들어와서 dx값을 [ecx]로 옮기는 부분을 확인해보니

serial 값 같은 7이 생성되었고 함수가 끝나면서 다시 사라졌습니다. 이 부분이 함수의 serial을 생성하고 비교하는 부분이라고 생각할 수 있었습니다.

다시 IDA로 넘어가서 해당 부분을 보니

_ itow_s 함수가 총 10번 호출되는 것을 확인하고 serial값을 생성하는 부분인걸 확인할 수 있었습니다.

decompile을 해보니 다음과 같이 긴 코드가 나왔습니다. 코드가 긴 것에 비해 복잡하지 않아서

다음과 같이 python코드로 keygen을 하였고

다음과 같이 총 4가지의 경우가 나왔습니다.

+ 해당 문제의 실행 파일은 보호기법인 ASLR이 적용되어 있어서 실행을 할 때마다 Name과 Serial이 저장된 값이 달라집니다.

profile
보안을 공부합니다

0개의 댓글