본문 바로가기

CodeEngn

[CodeEngn] Basic RCE L16

<문제>

 

<풀이>

우선 문제 파일을 다운로드하고, 7-Zip File Maneger로 압축을 푼다.

 

16.exe를 실행해본다.

이름을 입력하는 프롬프트가 뜬다.

 

문제를 따라 이름은 CodeEngn으로 입력한다.

 

다음에 뜨는 Password 입력란에는 임의의 숫자 1234를 입력했다.

 

Wrong password! 라는 에러 메시지가 뜬다.

엔터를 누르면 프로그램이 종료된다.

 

 

 

파일을 디버거로 열어보기 전에 패킹 여부를 확인하기 위해

PEiD로 파일을 열어본다.

EP SectionUPX 등의 패킹방식이 아닌 그냥 .text 떠있고,

아래에도 .NET 같은 내용이 없는 것으로 보아

따로 언패킹이 필요하진 않는 것으로 판단할 수 있다.

 

 

디버거를 이용해 파일을 열어본다.

올리디버거로 16.exe 를 열었다.

 

 

가장 먼저 오류메시지 혹은 성공메시지가 뜨는 부분에 breakpoint를 걸어둘 것이다.

해당 breakpoint에서 코드의 흐름이 멈추게 한 뒤에

그 근처에서 성공/오류메시지로 분기하는 CMP 문을 찾으면 serial이 저장된 곳을 찾아갈 수 있을 것이다.

CPU창에서 우클릭하여 Search for > All referenced text strings 를 클릭한다.

 

 

Good Job! 이라는 성공메시지와

Wrong password! 라는 오류메시지 부분에 breakpoint(F2)를 걸었다.

 

다시 이전의 창으로 돌아가기 위해 상단의 메뉴바에서 View > CPU를 클릭한다.

 

 

F9를 눌러 breakpoint까지 프로그램이 실행되도록 한다.

프로그램이 입력값을 받는 부분에서 잠시 실행이 멈춘다.

CodeEngn을 입력하여 코드가 진행되도록 한다.

 

Password에는 1234를 입력해본다.

 

 

1234는 올바른 serial이 아니기 때문에 오류메시지에서 breakpoint에 걸렸다.

위쪽으로 코드를 거슬러 올라가 CMP 문을 찾아보면

0040149F 부분에 CMP가 있는 것을 확인할 수 있다.

 

 

CMP문에 breakpoint를 걸고 Ctrl+F2 를 눌러 프로그램을 다시 실행한다.

이전과 같이 Name과 Password를 입력하면 해당 CMP문에서 breakpoint에 걸린다.

 

EAX [EBP-3C]를 비교하는 CMP 문이므로 해당 레지스터의 값을 확인해보면,

EAX에는 입력한 패스워드인 123416진수로 변환된 4D2가 저장되어 있다.

 

[EBP-3C] 는 해당 위치에 있는 값을 가리키고 있으므로 계산을 해본다.

EBP에 있는 값 28FF38에서 3C를 빼면 28FEFC 라는 값이 나온다.

 

 

Hex dump 창에서 우클릭 후 Go to > Expression 혹은 단축키 Ctrl+G를 입력한다.

입력창이 뜨면 28FEFC를 입력한다.

 

 

해당 위치에 저장되어있는 값을 볼 수 있다.

이 위치에 있는 값을 DWORD단위로 참조한다고 했으니 4칸을 읽는다.

리틀 엔디안 방식으로 쓰여있으므로 바르게 읽으면

E4 C6 0D 97 이다.

 

 

계산기를 이용해 E4C60D97을 10진수로 변환하면 3838184855라는 값이 나온다.

 

 

프로그램을 실행하여 Name에 CodeEngn, Password에 3838184855를 입력하면

성공메시지가 뜬다.

 

 

 

<정답제출>

코드엔진의 Auth페이지에 Key 값으로 3838184855를 입력하면 Success!!가 뜬다.

'CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L15  (0) 2023.11.13
[CodeEngn] Basic RCE L14  (0) 2023.11.13
[CodeEngn] Basic RCE L13  (0) 2023.11.12
[CodeEngn] Basic RCE L12  (0) 2023.11.09
[CodeEngn] Basic RCE L11  (0) 2023.11.07