Basic RCE L014 - 코드 엔진(진행중)

2021. 1. 11. 14:23문제연습/CodeEngn (REC)

반응형

 

 

본 티스토리 블로그는 PC에 최적화되어 있습니다.

모바일 유저분들은 아래 네이버 블로그를 이용해 주세요.

 

 

Basic RCE L014 - 코드 엔진(진행중)

본 네이버 블로그는 모바일에 최적화되어 있습니다.PC 유저분들은 아래 티스토리 블로그를 이용해 주세요...

blog.naver.com

 

Code Obfuscation

복원 코드 부분은 아직 풀이를 진행중이라 풀이에 오류가 있음을 미리 알려 드립니다.

그럼 오늘의 리버싱 문제를 풀어 보도록 하겠습니다.

 

 

1. 문제 내용

이번 문제는 약간 복잡한 느낌이 존재합니다.

계속해서 진행해 보도록 하겠습니다.

 

 

2. 문제 해설

 

PE 스펙)

역시 패킹이 걸려있습니다.

일단 보호 기법을 생각하지 않고 언 패킹을 진행하도록 하겠습니다.

 

 

 

실행 분석)

처음 실행 모습, 임의의 값 입력 후 동작, about 동작

일단은 입력값 처리과정에 대해 알아볼 필요가 있습니다.

 

 

Immunity 디버깅)

 

- 문자열 정보

역시 의심되는 문자열들이 존재합니다.

ida를 이용해 해당 부분의 코드를 확인해 보도록 하겠습니다.

 

역시 동일하게 문자열이 존재합니다.

일단 함수의 코드 흐름을 파악하기 위해 목록을 확인하도록 하겠습니다.

 

 

start 함수 부분)

-> sub_401025 함수를 호출하고 있습니다.

한번 까보도록 하겠습니다.

 

 

sub_401025 함수 코드

WPARAM __stdcall sub_401025(HINSTANCE hInstance)

{

HWND v1; // eax

HWND v2; // eax

HWND v3; // eax

HWND v4; // eax

HWND hDlg; // [esp+0h] [ebp-50h]

struct tagMSG Msg; // [esp+4h] [ebp-4Ch]

WNDCLASSEXA v8; // [esp+20h] [ebp-30h]

 

LoadIconA(::hInstance, (LPCSTR)0x64);

v8.cbSize = 48;

v8.style = 3;

v8.lpfnWndProc = sub_4011E2;

v8.cbClsExtra = 0;

v8.cbWndExtra = 30;

v8.hInstance = hInstance;

v8.hbrBackground = (HBRUSH)5;

v8.lpszMenuName = 0;

v8.lpszClassName = aBengaly;

v8.hIcon = LoadIconA(::hInstance, (LPCSTR)0x64);

v8.hIconSm = v8.hIcon;

v8.hCursor = LoadCursorA(0, (LPCSTR)0x7F00);

RegisterClassExA(&v8);

hDlg = CreateDialogParamA(::hInstance, TemplateName, 0, 0, 0);

ho = (LPARAM)LoadBitmapA(hInstance, (LPCSTR)0xC8);

v1 = GetDlgItem(hDlg, 108);

SendMessageA(v1, 0xF7u, 0, ho);

ho = (LPARAM)LoadBitmapA(hInstance, (LPCSTR)0x12C);

v2 = GetDlgItem(hDlg, 112);

SendMessageA(v2, 0xF7u, 0, ho);

ho = (LPARAM)LoadBitmapA(hInstance, (LPCSTR)0x190);

v3 = GetDlgItem(hDlg, 109);

SendMessageA(v3, 0xF7u, 0, ho);

ho = (LPARAM)LoadBitmapA(hInstance, (LPCSTR)0x1F4);

v4 = GetDlgItem(hDlg, 113);

SendMessageA(v4, 0xF7u, 0, ho);

SetWindowTextA(hDlg, String);

UpdateWindow(hDlg);

while ( GetMessageA(&Msg, 0, 0, 0) )

{

if ( !IsDialogMessageA(hDlg, &Msg) )

{

TranslateMessage(&Msg);

DispatchMessageA(&Msg);

DeleteObject((HGDIOBJ)ho);

DeleteObject((HGDIOBJ)ho);

}

}

return Msg.wParam;

}

윈도우즈 프로그래밍에 대한 경험이 없고 코드가 생각보다 길기 때문에 immunuity로 실행하면서 분석을 진행하도록 하겠습니다.

 

일단 문자열을 호출하는 부분 모두 중단점을 걸고 진행하도록 하겠습니다.

이제 실행하면서 입력받는 부분까지 추적해 보도록 하겠습니다.

 입력받는 부분의 중단점에 도달했습니다.

(정확하지는 않지만 JMP 코드 부분에서 입력폼을 실행하는 것 같습니다.)

 

IDA로 0040118E 부분을 확인해 보도록 하겠습니다.

 

0040118E 어셈블리 코드 부분, 헥스 레이를 통한 디컴파일 코드

예상했던 데로 입력값을 받는 GetMessageA 함수 코드가 존재하였습니다.

계속 다음 코드로 넘어가도록 하겠습니다.(check 버튼 클릭)

 

우리가 원하는 데로 인자가 표시되고 있습니다.

한 가지 의문점은 반복문을 통해 어떤 연산을 진행하고 있었습니다.

일단 계속해서 진행해보도록 하겠습니다.

 

반복문이 끝난 이후로 입력한 SecuLab을 인자로 넣고 00401383을 호출하고 있습니다.

이 부분을 아이다로 확인하면 다음과 같습니다.

 

어셈블리 코드, 디컴파일 코드

v2 변수에 들어가는 lstrlenA 함수는 문자열의 길이를 반환하는 함수입니다.

lpString에 우리가 입력한 두 번째 스트링 SecuLab 문자열이 인자로 들어갑니다.

 

즉, v2=7, v3은 long pointer constant string = const char* 형태로

문자열 "SecuLab"의 주소를 저장하게 됩니다.

 

변수 이름이 헷갈려서 임의적으로 만들어 본 코드입니다.

(정확한 코드가 아닙니다.)

입력된 데이터를 통해 어떠한 int 타입의 숫자를 리턴하는 듯합니다.

일단 계속해서 디버거로 분석하도록 하겠습니다.

 

대표사진 삭제

사진 설명을 입력하세요.

방금 00401383에서 처리된 리턴 값(=eax)와 esi 값을 비교하여 0이면 성공 메시지를 출력합니다.

지금까지 내용을 총정리하도록 하겠습니다.

 

 

첫 번째 인자 부분)

문자열 "ICMP" 변환 부분(임시로 id라고 하겠습니다.)

주황색 박스 부분.

 

두 번째 인자 부분)

문자열 "SecuLab" 변환 부분(임시로 pw라고 하겠습니다.)

 

스트링 비교 부분)

즉, 입력된 id를 인자로 처리된 결괏값과 sub_403138(pw)의 리턴 값이

서로 일치하면 문제가 풀리게 됩니다.

(다시 말해 pw에 id를 인자로 처리된 결괏값 esi 값을 넣어주면 문제가 풀리게 된다는 말입니다.)

 

이 부분을 조금 더 자세히 보기 위해 아래 immunity 디버거로 확인해 보았습니다.

처음 우리가 입력한 문자열이 다음과 같은 루프 문을 돌게 되는데, 이 코드 부분을 간단히 해석하면 다음과 같은 연산을 진행하고 있음을 알 수 있습니다.

 

esi = edx*edx + edx/2 - edx

 

 여기서 shr 연산은 오른쪽으로 비트를 옮기는 연산으로서 연산 결과는

본래 값의 /2 결과가 됩니다.

자세한 내용은 비트 연산 구현을 참고해 주세요.

 

이제 한 번 문제를 풀어 보도록 하겠습니다. 

분기문에 중단점을 걸고 esi 레지스터 값을 확인하도록 하겠습니다.

중단점을 걸고 esi 값을 확인 및 입력 결과 성공하였습니다.

 

 이번 문제는 ida의 코드에 너무 의존하여 본 연산을 제대로 확인하지 못해

리버싱 작업에 시간을 비 효율적으로 사용하였습니다.

 

다음 시간에도 이어서 문제를 풀어 보도록 하겠습니다.

반응형

'문제연습 > CodeEngn (REC)' 카테고리의 다른 글

Malware Analysis L02  (0) 2022.01.17
Malware Analysis L01  (0) 2022.01.04
Basic RCE L012 - 코드 엔진  (0) 2020.12.05
Basic RCE L010 - 코드 엔진  (0) 2020.11.30
Basic RCE L09 - 코드 엔진  (0) 2020.11.23