본문 바로가기

2. Reversing (리버싱)/1) Write UP

Lena's Reversing (15, 17)

Lena의 강의: 플래시 동영상으로 제작돼 쉽게 이해할 수 있고 단계별 예제도 제공하고 있는 강의

-한국에서도 유형해 한국어로 번역해놓은 블로그로 공부할 수 있다.

https://bob3rdnewbie.tistory.com/category/Reversing/Lena%27s%20Reversing%20Tutorial%20for%20Newbie?page=5 

 

'Reversing/Lena's Reversing Tutorial for Newbie' 카테고리의 글 목록 (5 Page)

 

bob3rdnewbie.tistory.com

-Lena's reversing 자료 다운은 현재 막혔다. 다른 루트로 직접 다운로드할 수 있다.

-리버싱 입문 책에 수록된 사진을 토대로 풀이법을 설명하겠다.

 

[목차]

1. Lena 15강(Nag)

2. Lena 17강(일련번호)


1.  Lena 15강_Nag 창 없애기

 

더보기

15강 파일을 다운로드 받아 압축을 풀면 'files' 디렉토리가 나온다. 그 디렉토리에 들어가 'ReverseMe. Nags.exe'을 실행하면 아래 문구가 뜬다. ReverseMe라는 창을 제외한 두 창이 Nag창으로 이것을 없애야 한다.  

디버거로 열어보면 실행순서는 다음과 같다.

(1) F9를 눌러 실행하면 Nag창이 뜬다.

(2) F12로 잠시 정지 시켜 Nag창 프로그램을 어디서 호출하는지 알아야 한다.

 

 

Alt+K로 콜 스택 창을 열 수 있다.           콜 스택: 프로그램에서 사용하는 서브루틴에 대한 정보를 저장하는 자료구조

사진에서 Called from이 호출하는 코드를 의미하므로 우선 이 탭에서 'ReverseMe. NAGs.exe'를 찾는다.

찾았다면 마우스 오른쪽 버튼의 Follow caller를 선택하면 서브루틴을 호출하는 장소로 이동할 수 있다.

*이동이 불가하면 스택 영역의 복귀주소가 ReverseMe__NAGs.0042039F를 찾으면 된다.

 

스택 영역에서 Enter 키를 누르면 코드 영역으로 넘어간다. CALL <JMP.&MFC42.#2514>로 서브루틴 호출 확인이 가능하다.

 

 

아까, 문제에 들어가기 전에 두번째 창을 제외한 두 창이 NAG창이라고 했다. 

Nag 창을 여는 서브루틴 호출 코드 상단을 살펴보면 주소 00420377에서 레지스터 값에 따라 제로 플래그를 설정하는 코드다 있다. 여기서 제로 플래그가 0이면 Nag창이 실행되므로 이를 통해 그 둘이 Nag창임을 확인 가능하다. 

 

따라서 두번째 창만 열리게 수정을 한다. 이때 코드 케이브를 사용한다.

코드 캐이브: 사용하지 않는 토드 영역에 필요한 코드 입력, 수정해야 할 부분에는 새로운 코드가 입력된 곳으로 점프하는 코드, 새로 입력된 코드 마지막 부분에 다음에 실행되어야 할 코드를 넣는 것.

 

주의!

코드를 입력하고 싶다면 Access 영역이 R E 속성 가져야 함.

데이터를 입력하고 싶다면 Access 영역이 RW 속성을 가져야 함.

캐이브 코드는 .text 역역에 들어가야 함.

 

주의사항에 유의하며 빈 영역에 케이브 코드를 완성한다.

'0'만 반복되는 곳이 빈 영역이다. ① 부분에 코드를 넣고 ②에 임시로 사용할 숫자를 넣는다.

 

① 주소에 브레이크포인트를 설정하고 ②에서 스페이스 바를 눌러 어셈블 창을 띄운다. 원래 명령어 대신 JMP 00437D6A를 입력한다. 

 

다른 코드들도 똑같은 방식으로 바꿔준다.

 

주의!

지금까지 수정한 것을 다시 실행(Ctrl+F2)하면 모두 사라진다. 디버거에서 이뤄졌으므로 따로 저장해야 한다.

 


2. 17강_일련번호

 

더보기

실행시 해당 화면이 뜬다. 에러 메시지로 디버거를 삭제하라고 하니 우선 사용자 입력하는 부분부터 분석한다.

마우스 오른쪽 버튼으로 Search for -> All referenced strings로 오류 메시지를 찾는다. 

상단에 올라가면 성공 메시지를 발견할 수 있다.

조금 더 상단에 올라가면 ① 함수를 확인 가능하다. 해당 함수는 문자열 길이를 EAX에 담아주는 함수다. 이 함수 윗부분을 BP로 설정하고 F8로 하나씩 실행한다. 

(오른쪽 사진) 입력한 문자열의 길이가 담겨있다.

 

일련번호 생성 로직을 F8을 사용해 빠져나오면 ③부분에서 생성된 일련번호를 확인할 수 있다. ESI 레지스터에 저장되어 있으므로 확인해보면 003EF552 이다. 메모리 주소에 입력된 00403138은 아스키코드로 사용자가 입력한 1234를 의미한다. 우리는 003EF552을 아스키코드로 변환해야 하면 일련번호를 획득할 수 있다. 

 

변환 확인: Rõ>      (←드래스 하시오.)