캡스톤 디자인 #9 코드엔진 Basic RCE L11~L15 풀이

llip·2022년 5월 19일
0

캡스톤 디자인

목록 보기
9/9

이전 게시글에서 이어진다.


Basic RCE L11

문제

프로그램 실행


실행하면 나오는 창. L09의 프로그램과 똑같은 것 같다.

UPX 언패킹

PEView로 확인해보니까 UPX 패킹이 되어있는 것 같다. 언패킹을 진행해준다.

완료.

디버깅

x32 dbg 실행화면에서 확인해보니, 아무래도 L09와 똑같은 프로그램이 맞는 것 같다.

OEP는 00401000이다.

StolenByte를 찾는 풀이과정은 여기를 참고하면 될 것 같다.

정답

Stolenbyte는 6A0068002040006812204000이므로 정답은 004010006A0068002040006812204000이다.


Basic RCE L12

문제

이 문제는 MessageBox에 성공메시지 대신 Key값이 출력되게끔 해야한다. 파일을 HexEdit으로 오픈 후 key값을 overwrite할 영역을 찾아야 한다.

정답은 Key값과 주소영역을 합한 것.

프로그램 실행

아무 값이나 입력해봤는데 Check를 눌러도 변함이 없었다.

About을 눌러보았을 때 뜨는 창. 올바른 키를 찾으라고 하는 거 같다.
Cancle을 누르면 프로그램이 종료된다.

디버깅

PEView로 살펴보았을 때 패킹된 것 같진 않았다. 따라서 바로 x32 dbg로 파일을 열었다.

GetDigItemInt 함수는 입력한 값을 정수형으로 반환하고, 숫자가 아니라면 0을 반환한다.

아래의 코멘트를 보면 esi에 엄청나게 긴 문자열을 집어넣고 있다.
또한 축하하는 메시지가 있는데, 올바른 값을 입력했을 때 나타나는 문구인듯 하다.

코드를 살펴보면, esi의 값이 0이될 때 40107D 주소로 이동하고 0이 되지 않는다면 401071로 이동한다.
401071에서는 EBX에 4바이트씩 ESI의 값을 집어넣고 CALL로 40110F를 불러온 뒤 ESI에는 4를 더한다. 이후 401068로 되돌아가 수행한다.

40107D에 버퍼포인터를 걸고 실행하다 11을 입력하니, EAX에 내가 입력한 값이 저장됐다.
입력된 값과 7A2896BF를 비교하고 값이 같지 않으면 401098로 보내버린다. 우리는 두 값이 같아야 401084부터 진행이 가능하다.

알게 된 7A2896BF를 입력해보기로 했다. 하지만 입력해봐도 반응은 없었다. 12진수로 작동하는 것 같았는데 잘 모르겠어서 풀이를 참고했다.

프로그램은 사용자가 10진수로 입력하면 16진수로 인식해서 레지스터에 저장한다. 따라서 7A2896BF를 10진수형태로 입력한다면 제대로 인식할 것이다.

Key값은 2049480383이다.

물론 여기서 끝이 아니다. 성공 메시지 대신 Key값을 출력해야 하고, 파일을 hexEdit으로 오픈한 다음 key값을 overwrite할 영역을 찾아야 한다.

단순히 coments를바꾸면 어떻게 되나 싶어 해봤는데, 정답을 입력했을 때의 문구가 다르다.
알고 보니 여기서부턴 HexEdit을 사용해줘야 한단다.

구문을 찾았다~!

수정완료~!
여기서 주소값은 0x0D3B~0X0D45사이임을 알 수 있다. 이렇게 값을 수정해주니 exe파일을 열 수 없었다.ㅠㅠ

정답

20494803830D3B0D45가 된다.


Basic RCE L13

문제

정답을 묻는 문제가 꽤 간단하다.

프로그램 실행

프로그램을 실행하면 패스워드를 입력하라는 창이 뜬다. 아무거나 입력했더니 다시 입력하게끔 한다.

딱히 패킹된 건 없어보인다.

디버깅

이번에는 x64 dbg를 사용하라고 떴다.

이번 문제의 형식은 좀 독특한 것 같다. 파일을 열자마자 13.exe 프로그램이 실행되고 주소의 길이도 엄청나게 길다. f9를 눌러도 실행 전용 창으로 가지 않는 듯.

아무래도 디버깅이 안되는 것 같다. 찾아보니까 해당 프로그램이 C#으로 짜여져있어 .NET Framework로 작동한다고 한다. .NET의 디컴파일러로 살펴봐야하는 것 같다.

dotPeek

JetBrains 사의 툴이다.
암호 푸는 코드, 거는 코드, 메인 코드가 보인다.

중점으로 볼 건 이 부분. str은 Decrypt를 거쳐 나오므로 분석하기는 사실상 어렵다고 한다. 따라서 콘솔창 자체에서 출력되도록 해야한다.

Console.WriteLine(str);
해당 코드를 추가하면 그냥 str을 출력하게 해준다.

정답

정답은~ Leteminman이다.


Basic RCE L14

문제

이번 문제는 Name이 CodeEngn일 때 Serial을 구하는 것이다. 정답이 여럿 나올 수 있다는 점이 특이하다.
정답의 조건은 5개의 숫자이며 bruteforce라는 게 필요한 듯 하다.

프로그램 실행

시작부터 경고가 상당하다. 일단 무시하고 진행한다.

실행해보니 90년대 애니메이션같은 그림이 있다. 굉장히 수상해보인다.


아무거나 입력하면 잘못된 시리얼을 입력했다며 다시 입력할 것을 요구한다.

ABOUT을 눌렀을 때 나타나는 창.

PEView로 살펴보니 UPX 패킹이 되어있으므로 언패킹을 해준다.

디버깅

코드를 살펴보며 내리다보니 신경쓰이는 코멘트가 있다. 올바른 값을 입력했을 때 나타나는 것 같은 문구가 있다.

40133A 주소를 보면 eax와 esi 레지스터의 값을 비교하고 있다. cmp 부분에 버퍼포인트를 걸고 진행했다.

위에는 9, 아래에는 8을 집어넣었더니 EAX에 8이 들어가 있다. 사용자의 입력값은 일단 EAX에 저장되는 것 같다.

그렇다는 건 esi와 eax값이 같아야 한다는 것인데.. 만약 두 값이 같은 경우 정답이었을 때의 메시지를 출력한다.

스크롤을 조금 올려보니, eax의 값이 0과 같으면 한 글자만 더 채우라는 메시지가 뜨는 것 같다.
윗 칸은 채우고 아랫 칸은 안 채우고 CHECK를 눌렀을 때도 이 메시지가 뜨는 걸 보면, 두 칸 모두 최소 한 글자씩은 있어야 할듯 싶다.

입력한 값이 coments로 들어갔다. 입력한 이름?값은 403038에 저장되는 듯 보이고, 비밀번호?값은 edx에 저장되는 듯 하다.

401300주소부터 쭉 살펴보면 esi와 esi값을 xor연산 취해서 xor에 넣어준다. move 연산이므로 eax의 값을 복사하여 ecx에 더해주고, eax에 1을 더해준다.

401315를 보면 edx의 값과 FF를 and연산 취한다. ebx에 edx의 값을 복사해 넣고 imul ebx, edx를 보면 imul은 음수를 포함한 수를 곱할 때 필요한 명령어이다. ebx의 값과 edx의 값을 곱하게 해준다.
곱해준 값을 esi에 더해주고 다시 edx의 값을 ebx에 복사해넣는다.

sar은 부호가 있는 우측 쉬프트 연산이라고 한다. ebx에다가 1bit 우측 쉬프트 연산을 취해주고 이 값을 esi에 더해준다. esi의 값에서 edx값을 다시 빼주고, eax에는 1을 더하고, ecx에서는 1을 빼준다.

입력한 글자를 한 글자씩 비교하는듯 싶다.

여기서 내가 생각을 너무 꼬아서 한 것을 알아차렸다.
EAX와 ESI의 값을 비교해서 JNE구문으로 점프하는 것이라면, ESI에 들어있는 값이 정답 아닐까?

사용자의 입력값은 EAX에 저장되고 내가 입력한 값은 12345였다. 그런데 EAX에는 3039가 저장되어 있다.

3039는 12345가 16진수로 변환된 것.


그렇다면 ESI의 129A1을 10진수로 변환하면 76193이라는 값이 나온다.

정답

정답!


Basic RCE L15

문제

대망의 15번 문제~
이렇게만 보면 14번이랑 다를 게 없어보인다.

프로그램 실행

실행 시 처음으로 뜨는 창이다.

당연하지만 시리얼 넘버가 틀려서 다시 하라는 창이 뜬다.

PEID 로 살펴본 결과 패킹이 되어있는 것 같진 않았다.

디버깅

coments의 글자가 거의 깨져 있어 잘못된 건가 싶었지만 성공과 실패를 나타내는 문자열이 보였다.

cmp를 보니, eax와 45B844의 값을 비교하여 값이 같다면 crack에 성공했다는 문구를 출력하는 것 같다.

cmp에 버퍼포인트를 걸고 실행한 결과.

lea를 보면 ebp-4의 값을 edx의 주소에 넣는다. 여기서 ebp-4의 값은 입력한 비밀번호 '12345'이다.

여기서 드는 의문은 45B844가 어디에 있는 주소인가이다.

혹시나 하고 `a를 그대로 입력해보았는데 이게 아닌 것 같다.

다시 실행시켜 볼 때, 12345를 입력했더니 EAX에는 3039의 값이 입력되었다. 레지스터에는 16비트의 값으로 저장되는 것이다.

어떻게 주소를 확인해야 하나 싶었는데 덤프에서 45B844의 주소를 확인할 수 있었다. 0045b844에는 6160의 값이 들어있었다.

6160의 십진수 변환값은 24928.

정답

24928이 정답이다.

profile
공부중

0개의 댓글