R136A1

[codeEngn] Basic RCE L07 본문

REVERSING/codeEngn

[codeEngn] Basic RCE L07

r136a1x27 2021. 2. 26. 02:07

컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 'ß어떤것'으로 변경되는가

 

프로그램은 굉장히 간단하다.

따로 Search 필요 없이 조금만 내리면 MessageBoxA가 보인다.

CALL lstrcmpiA 함수의 반환값이 EAX에 저장되고

이 값이 0이면 성공

 

위 함수를 좀 자세히 봐야할듯

가장 위에 DialogBoxParamA: 사용자와 상호작용하는 Box 생성

 

GetDlgItemTextA: 사용자가 입력한 시리얼 받아옴

GetVolumeInformationA: volume 정보를 받아온다고 함. 문제에서 C드라이브의 이름을 언급했으니 중요

- RootPathName: NULL일경우 현재 디렉토리의 루트값이 사용됨

- VolumeNameBuffer: 버퍼포인터, 볼륨의 이름을 받아오기 위한 (사이즈는 MaxVolumeNameSize)

다른건 딱히 볼 필요 없고 VolumeNameBuffer에 주목

0040225C에 저장됨

참고로 기본으로 넣고 썼을 경우에는 "" (빈 문자열)로 저장되어 찾기가 조금 힘들었을 수 있음

lstrcatA는 문자열 붙이는 함수(밑에 있는_먼저 전달되는_ 인자가 베이스가 됨)

lstrcmpiA는 문자열 비교하는 함수

 

0040225C는 처음에 비어있음 "" / GetVolumeInformationA 진행 후 추가됨

아래 풀이는 아예 디스크 이름을 CodeEngn으로 바꾸고 진행했는데, GetVolume~이후에

HEX 창에서 40225C 에 있는 디스크 이름을 바꿔줘도 된다. 

이후 코드를 분석해보면

4562-ABEX를 뒤에 붙임

MOV DL,2 // DL에 2 넣기

40255C (첫번째 문자) ASCII +1

            두번째 문자

       ...   네 번째 문자

DEC DL // DL은 1이다 이제

JNZ (아마 DL이 0이 아니면 한번 더 해라?) 즉, 반복문형태(왜 ECX(CL)가 아닌 DL을 쓰는지..)

 

즉, 받아온 드라이브 이름의 네 번째 값 까지 ASCII +2 씩 해주는 것

 

다음 strcat을 통해

402000에

4023FD ("L2C-5781")을 붙이고

40255C ("변환된 Volume Name")을 붙이면 완성이다

*strcat은 문자열 시작 주소를 받기 때문에, 있는 문자열이 사라지지 않고 맨 끝에 가서 붙음

**무조건 뒤에 가서 붙고, 앞에는 붙을 수 없기때문에 다른 영역(2000)에서 문자열을 조합한 것

더보기

***(추측) 40255C-8 = 402554 에서 시작하면 되지 않나? 흠...해봐야겠다

 

잘 되는데 아마 컴파일러가 안정성을 위해서 저렇게 굳이...별도의 영역을 지정한듯?
또는 확장성(L2C-5781을 늘린다던가...줄인다던가)의 이유로

 

 

 

그리고 cmp를 통해 402324에 저장된 사용자 입력값과 비교하여 성공 실패를 판단한다

 

 

 

수동으로 계산도 가능하겠지만 C드라이브를 이름 바꿔서 BP만 잘 걸면 사실 풀리는 문제였다

'REVERSING > codeEngn' 카테고리의 다른 글

[codeEngn] Basic RCE L17  (0) 2021.02.26
[codeEngn] Basic RCE L09  (0) 2021.02.24
[codeEngn] Basic RCE L04  (0) 2021.02.24
[codeEngn] Basic RCE L03  (0) 2021.02.24
[codeEngn] Basic RCE L02  (0) 2021.02.23
Comments