문제
Serial이 WWWCCCJJJRRR 일 때 Name은 무엇인가
Hint 1 : 4글자임
Hint 2 : 정답으로 나올 수 있는 문자열 중 (0~9, a~z, A~Z) 순서상 가장 먼저 오는 문자열
print - Enter Your Name:
input – 문자열 입력(Name)
print – Enter Your Serial:
input – 문자열 입력(Serial)
print – Wrong serial. Keep trying (제대로 된 Name 입력 시 다른 메시지 출력 예측)
PEiD 프로그램을 사용해 패킹 여부를 확인할 수 있다.
EP Section 부분이 .text로 입력돼있으므로 패킹은 안 됐다는 걸 확인할 수 있다.
(패킹 됐을 경우 UPX, aspack등으로 입력된다.)
패킹 되지 않은 프로그램이므로 문자열 참조를 부분을 확인한다.
프로그램 실행 시 출력됐던 문자열을 확인할 수 있다.
올바른 Name과 Serial을 입력했을 때 나올 문구로 추측되는 Good job, Now write ~ 부분을 먼저 확인한다.
[중요 함수]
cmp byte ptr ss:[ebp-A5],0
je a10.4020C1
[해석]
ebp-A5의 스택 값이 0이라면 wrong serial, Keep trying 출력
아니라면 Good job ~ 출력
해당 함수에 break point를 걸고 다시 실행해봤다.
Name :asdf
Serial : WWWCCCJJJRRR
이때 ebp-A5의 dump 값을 확인해봤을 때
그림처럼 0이 들어있다.
ebp-A5에 값을 넣는 함수부분을 찾아야한다.
00401FBF에 mov byte ptr ss:[ebp-A5], al
즉 al의 값을 ebp-A5에 저장하는 부분을 찾았다.
그 위에 a10.40144C 함수가 name에 맞는 serial을 추출하는 알고리즘이라 추측할 수 있다.
해당 함수 내부로 들어가서 분석했다.
함수 마지막 return 부분을 확인하면
eax에 ebp-C4의 값을 대입한다. ebp-C4의 값을 어디서 찾아오는지 확인해야한다.
00401BC2와 00401BC8을 보면 edx에 ebp-10C값을 대입하고, 그 값을 ebp-C4에 넣는 것을 알 수 있다.
cmp eax, 5를 통해서 5보다 크면 ebp-69에 0을 저장하고 그 값을 다시 eax에 저장한 후
찾으려는 ebp-10C에 그 값을 저장한다.
eax에 1씩 더해주고 00401872 주소로 jump 하는 부분이다 00401872을 확인해보면 위 그림과 같다.
cmp eax, dword ptr ss:[ebp-74]로 eax와 ebp-74의 값을 비교한다.
이때 ebp-74의 값을 dump로 확인하면
(8번 반복했을 때)
총 반복된 횟수임을 알 수 있다.
입력한 serial이 12자리 이므로 해당 부분에서 name에 대한 serial 값을 만든다고 예측할 수 있다. 잘못된 name 입력시 cmp eax,5 jle부분이 jump가 안되는 것을 알 수 있었고, 12번의 반복문 모두 eax < 5가 된다면 성공했다는 출력이 이루어질 것을 알 수 있다.
eax는 eax-edx의 연산을 통해 값이 나오는 것을 알 수 있다.
12번 실행시 eax의 값은 3번씩 똑같은 결과를 출력하는 것도 확인했다.
즉, name의 1글자는 serial의 3글자와 비교한다고 추측할 수 있다.
esp에는 위 그림과 같은 문자열이 지속적으로 저장된다.
위의 로직을 실행시 eax에는
0x30 즉 10진수로 48이라는 숫자가 나온다. 이는 esp에 저장된 문자열에서 48번째에 저장된 W고,
이를 ebp-78에 저장한다.
위 로직을 실행시 eax에는
0x37 즉 10진수로 55라는 숫자가 나온다. 이는 esp에 저장된 문자열에서 37번째에 저장된 A고, 이를 ebp-7C에 저장한다.
이를 기반으로 아래 그림을 확인할 수 있다.
sub eax,edx -> number문자와 serial문자의 차이,
cmp eax, 5 -> 문자 순서의 차이가 5보다 작은 값을 뜻한다.
테스트로 Name = WCJR, Serial = WWWCCCJJJRRR을 입력해본다.
(WCJR은 Serial과 순서 차이가 0이므로)
분석이 맞다는 것을 알 수 있다.
이때 순서상 가장 먼저 오는 문자열을 찾아야한다. 이는 c++로 간단하게 짤 수 있다.
실행 결과
결과값 입력
'category > 리버싱' 카테고리의 다른 글
xor, or 리버싱 문제풀이 (2) | 2023.02.21 |
---|
댓글