Security&Hacking/리버싱

Lena Reversing - tutorial 18

Dior2ky 2020. 3. 10. 19:25
반응형

Lena Reversing tutorial 18

이번 단계에서는 분석을 방해하는 속임수 코드들을 파악하고 자기 변조 코드에 대해 이해 하는 것이 목적이다. 

프로그램을 실행하면 다음과 같이 나온다. 

가장 먼저 나오는 창이다. 2byte 패치를 통해 nag 창을 없애라고 나온다. 

프로그램은 이전과 비슷한 문구를 포함하고 있고 종료시키면 그대로 종료가 된다.

 

Ollydbg로 열어준다. 

조금만 내리면 nag 창에 있는 문구를 포함한 messagebox 함수가 보인다. 

messagebox에 breakpoint를 걸고 실행을 해본다. 

예상과 다르게 breakpoint에 걸리지 않고 nag창이 실행이 된다. 

이 코드들은 실제로 동작하지 않고 분석을 방해할 목적으로 들어있는 코드로 보인다. 

다시 실행하여 F8을 눌러가면서 살펴본다. 

몇줄 진행하지 않아 nag 창이 뜨고 프로그램도 바로 실행된다. 

F7을 눌러 진행해주면 GetModuleHandleA 함수가 실행된다. 

F8을 눌러 계속 진행해준다.  얼마가지 않아 다시 user code로 나온다. 

실행해보면 알지만 마지막 CALL을 실행하면 nag 창이 실행된다. 

그 전에 먼저 나오는 CALL부터 확인해준다. 

해당 CALL 내부로 들어간다. 

천천히 내용을 분석해보면 401000번지를 EAX에 받아와서 이 값을 점차 증가시키면서 1byte씩 5A와 XOR 연산하고있다. 

USER32.BeginPaint의 값인 401218번지가 되면 멈추고 리턴하게 된다.

401000번지를 살펴본다.

무언가 코드가 있지만 알아보기가 쉽지 않다.

이 값들을 5A와 XOR 연산을 하기 때문에 연산 후에는 값들이 모두 바뀌어 있을 것이다. 

연산이 끝난 후에 다시 살펴보면 다음과 같이 변해있다. 

이전에 있던 두개의 CALL 중 첫번째 CALL은 코드를 XOR연산하는 CALL로 파악이 되었다. 

다음 CALL을 살펴본다.  역시 F7로 내부로 들어간다 

살펴보면 이전의 CALL로 인해 수정된 코드 내부로 들어왔다. 

이번엔 EDI 값을 가지고 연산들이 진행된다 맨처음 EDI 값을 확인해보면 401011로 맨처음 코드가 실행되는 주소이다. 

먼저 맨처음 값을 넣고 EDI가 증가하는 부분까지만 살펴본다. 

코드를 수행하고 난 뒤의 코드를 살펴본다. 

401011 주소의 코드가 6A 가 들어가서 변형이 되었다. 

이로써 EDI를 가지고 값을 계속 바꿔나가는 것으로 파악이 된다. 값이 모두 바뀐 후 살펴본다.

다음과 같이 코드가 변경된 것을 확인할 수 있다. 

그 후에는 다시 흐름이 401000으로 넘어간다. 

이전에 변경된 코드이며 이 코드는 403000, 즉 .data 부분의 값들을 1byte씩 0B3으로 XOR 연산시키는 과정이다.

역시 모든 data 값들이 변경된 후에 살펴본다.  

이전에는 알아볼 수 없는 문자들이 적혀 있었는데 이제는 프로그램에서 사용되는 문자열들로 바뀌었다. 

이후에 다음과 같은 코드가 나온다.

data 영역에 있던 문자열을 넣어서 messagebox를 호출하고 있다. 

그 후에는 40106A 주소로 분기한다. 

이전과 마찬가지로 EDI에는 401000이 있고 11을 증가시킨후 시작하여 

401011 주소부터 다시 값을 넣고 있다.  

값을 다 넣으면 마지막에 CALL EDI 를 통해 바뀐 코드로 이동한다. 

바뀐 코드이다. 

여기의 CALL 4010B6은 메인 프로그램이 실행되는 부분이다. PUSH에서 인자를 받아 실행된다. 

마지막 00401054로 가면 두개의 CALL이 나온다. 

첫번째 CALL로 가본다. 

익숙한 코드이다. .data의 값들을 다시 XOR 시키고 있다.

프로그램이 끝날때는 다시 원래대로 되돌리는 것으로 보인다. 

두번째 CALL도 가본다. 

process를 종료시키는 함수이다. 이렇게 해서 프로그램이 종료되는 것으로 보인다. 

 

흐름을 모두 살펴보았으니 이제는 nag 창이 뜨지 않도록 한다. 

거꾸로 흐름을 따라가 본다. 

일단 messagebox가 호출되는 부분을 살펴본다.

이 부분이었다. 이 부분에서 401011로 넘어왔을 때 바로 JMP 0040106A가 되도록 하면 된다. 

값으로는 EB 57 에 해당한다. (JMP 0040106A를 넣어보면 알 수 있다.)

하지만 401011부분은 XOR 연산에 의해 만들어진 코드이다. 

이 값만 바꾸어 준다해도 이 값은 프로그램이 실행될 때 존재하는 내용이 아니다. 

그렇기 때문에 XOR 연산 이전의 값을 패치해주어야한다. 

XOR 연산은 같은 값으로 한번 더 연산하면 원래의 값이 나온다. EB 57 을 다시 5A로 XOR 연산 해준다.

값은 B1 0D 가 나온다. 

위치를 보면 401016, 401017 자리이다. 

지금은 XOR 한 후이기 때문에 그 이전에는 또다른 값이었을 것이다. 그것을 패치해준다. 

다시 실행해서 해당 위치에 값을 바꾸어 주었다. 

copy to executable을 해서 프로그램을 저장한 후 실행해본다. 

성공적으로 nag 창이 없어지고 프로그램이 실행되는 것을 확인 할 수 있다. 

끝.

반응형