본문 바로가기
category/리버싱

a10 문제풀이

by 자운대고라니 2023. 2. 22.
반응형

문제

SerialWWWCCCJJJRRR 일 때 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등으로 입력된다.)

 

패킹 되지 않은 프로그램이므로 문자열 참조를 부분을 확인한다.

프로그램 실행 시 출력됐던 문자열을 확인할 수 있다.

올바른 NameSerial을 입력했을 때 나올 문구로 추측되는 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-A5dump 값을 확인해봤을 때

 

그림처럼 0이 들어있다.

ebp-A5에 값을 넣는 함수부분을 찾아야한다.

00401FBFmov byte ptr ss:[ebp-A5], al

al의 값을 ebp-A5에 저장하는 부분을 찾았다.

그 위에 a10.40144C 함수가 name에 맞는 serial을 추출하는 알고리즘이라 추측할 수 있다.

해당 함수 내부로 들어가서 분석했다.

함수 마지막 return 부분을 확인하면

eaxebp-C4의 값을 대입한다. ebp-C4의 값을 어디서 찾아오는지 확인해야한다.

00401BC200401BC8을 보면 edxebp-10C값을 대입하고, 그 값을 ebp-C4에 넣는 것을 알 수 있다.

cmp eax, 5를 통해서 5보다 크면 ebp-690을 저장하고 그 값을 다시 eax에 저장한 후

찾으려는 ebp-10C에 그 값을 저장한다.

eax1씩 더해주고 00401872 주소로 jump 하는 부분이다 00401872을 확인해보면 위 그림과 같다.

cmp eax, dword ptr ss:[ebp-74]eaxebp-74의 값을 비교한다.

이때 ebp-74의 값을 dump로 확인하면

(8번 반복했을 때)

총 반복된 횟수임을 알 수 있다.

입력한 serial12자리 이므로 해당 부분에서 name에 대한 serial 값을 만든다고 예측할 수 있다. 잘못된 name 입력시 cmp eax,5 jle부분이 jump가 안되는 것을 알 수 있었고, 12번의 반복문 모두 eax < 5가 된다면 성공했다는 출력이 이루어질 것을 알 수 있다.

 

eaxeax-edx의 연산을 통해 값이 나오는 것을 알 수 있다.

12번 실행시 eax의 값은 3번씩 똑같은 결과를 출력하는 것도 확인했다.

, name1글자는 serial3글자와 비교한다고 추측할 수 있다.

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을 입력해본다.

(WCJRSerial과 순서 차이가 0이므로)

분석이 맞다는 것을 알 수 있다.

이때 순서상 가장 먼저 오는 문자열을 찾아야한다. 이는 c++로 간단하게 짤 수 있다.

WWWCCCJJJRRR 시리얼 입력시 Name에 입력할 가장 먼저 오는 문자열을 추출한 소스코드

실행 결과

결과값 입력

 

반응형

'category > 리버싱' 카테고리의 다른 글

xor, or 리버싱 문제풀이  (2) 2023.02.21

댓글