Basic RCE L14
Name이 CodeEngn 일때 Serial을 구하시오
(이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요)
Ex) 11111
우선 이번 문제의 프로그램은 UPX 패킹이 걸려있다. 언패킹 진행 후에 실행시켜주자
실행시켜보면 이런 화면이 나온다.
입력값을 넣어 준뒤에 맞지 않는다면 에러 값을 출력한다.
이제 Ollydbg로 파일을 열어보자
문자열을 검색하는 Search for > All referenced text String으로 생공 메세지처럼 보이는 곳을 더블클릭하여 진입해주자.
진입하면 아래와 같은 화면이 나오는데
이 윗부분의 JNZ부분을 보면 성공과 실패부분을 나눠주는데 점프문 위에 CMP를 보면 EAX와 ESI를 비교하는데 EAX는 함수의 RETURN값이 저장되는 부분인데 마침 위에 어떤 주소를 CALL하는게 보인다. 우선 그 부분으로 진입해서 어떤 값을 리턴하는지 보자
우선은 들어갈 때 인자 값을 보자
ESI에 있는 값과 내가 입력한 값이 인자로 들어간다. 그런데 이 ESI의 값이 어디서 나왔는지 보니 윗쪽에서 뭔가 연산이 진행되고 있었다.
위 코드를 해석해보면
Call IstrlenA - 입력한 ID값( CodeEngn )에 IstrlenA라는 함수를 진행한다.
XOR ESI, ESI - ESI를 00000000으로 바꾼다.
MOV ECX, EAX - EAX의 값( call IstrlenA에서 리턴된 값 )을 ECX로 복사한다.
MOV EAX, 1 - EAX의 값을 1로 초기화시킨다.
반복부분 -
MOV EDX, DWORD PTR DS : [403038] - 403038의 주소 ( 내가 입력한 값 )에서 4바이트만큼을 복사해 EDX에 넣는다 (hex값으로)
MOV DL, BYTE PTR DS : [EAX + 403037] - EAX( 1 ) + 403037의 주소에 있는 1바이트만큼 EDX의 첫 1바이트에 넣는다.
AND EDX, 0FF - EDX의 값과 0FF라는 값을 And연산하여 EDX에 저장한다. ( 첫 1바이트만큼만 남기고 00으로 초기화 )
MOV EBX, EDX - EDX의 값을 EBX에 복사
IMUL EBX, EDX - EBX와 EDX를 곱한 값을 EBX에 저장 ( EBX와 EDX의 값은 같기 때문에 제곱 )
ADD ESI, EBX - EBX의 값을 ESI에 더한 뒤 EIS에 저장 ( EDX의 제곱 값을 저장 )
MOV EBX, EDX - EDX의 값을 EBX에 복사 ( 제곱 하기 이전의 값으로 다시 저장 )
SAR EBX, 1 - EBX의 값을 1byte만큼 오른쪽으로 Shift 연산
ADD ESI, EBX - ESI에 EBX의 값을 더한 뒤 ESI에 저장
SUB ESI, EDX - ESI에서 EDX의 값을 뺀 뒤 ESI에 저장
INC EAX - EAX에 1을 더한다
DEC ECX - ECX에 1을 뺀다.
JNZ SHORT 14.00401309 - ZF가 0이 아니라면 다시 반복
카운트를 하는 역할인(?) ECX의 값이 0이 되면 ZF가 1이 되어 반복문을 빠져나간다. ( 총 8번 진행 )
결과 적으로 ESI = (EBX * EDX) + EBX - EDX 가 된다.
아마 이 부분에서 ID에 맞는 시리얼 값을 생성하는 부분이 될 것이다.
CodeEngn을 ID로 줄 때 ESI의 값은 000129A1이고
MyName을 ID로 줄 때 ESI의 값이 0000E1FB이다.
그러니 이 부분이 ID별 Serial을 생성해주는 곳이 된다.
문제의 답을 찾자면 ID를 CodeEngn으로 주었을 경우에 결과적으로 ESI에 들어간 값을 10진수로 바꾸어 입력하면 성공 문자열이 출력된다.
'Hacking > Reversing' 카테고리의 다른 글
CodeEngn_basic_16 (0) | 2020.07.18 |
---|---|
CodeEngn_basic_15 (0) | 2020.07.13 |
CodeEngn_basic_13 (0) | 2020.07.05 |
CodeEngn_basic_12 (0) | 2020.06.27 |
CodeEngn_basic_11 (0) | 2020.06.27 |