작성자: Dear. Tom
편집자: 엔시스
출 처: 보안인닷컴 팀 블로그[http://boanin.tistory.com]
1. abstraction
이번 4장에서는 가상이 아닌 진짜 어플리케이션을 분석할 것이다. 왜냐하면, 이것은 최고의 연습이 될 것이기 때문이다. 항상 그럴 것은 아니지만, 앞으로도 기본 기술을 설명할 때 이와 같은 방법을 사용할 것이다. 이 강좌는 리버싱을 할 때 필요한 기초를 제공하고, 기술을 향상 시켜줄 수 있을것이다.
이 프로그램은 2001년 1월 이후로 업데이트 되지 않고 있기 때문에 이번 강의에서 목표로 삼았다. 하지만, 이것은 오로지 리버싱을 하기 위함과 교육적인 목적만이 있을 뿐이다.
- Tool: OllyDbg
3. A word about exceptions
이 프로그램을 분석하면서 예외상황(Exceptions)에 대한 지식을 배울 수 있을 것이다. 어플리케이션은 SEH(structured exception handler)로 예외를 처리하기를 원하거나 원하지 않는다. Olly는 이러한 예외상황을 핸들링하긴 어렵지만, 이것들을 처리할 가능성을 제공한다. 그것이 무엇인지 알기 위해 필요한 과정에 대해서는, 나중에 다시 설명하도록 하겠다. Exceptions을 사용할 때, Protector로 Olly를 사용할 때, OEP(Original Entry Point)를 쉽게 찾을 수 있다. OEP를 찾기 위한 쉬운방법은 Protector를 다룰 때 설명하도록 하겠다. SEH는 안티디버깅과 같은 것을 역분석할 때 중요하므로 조금이라도 알고 넘어가자.
what is the SEH?
- 윈도우즈에서 제공하는 예외 처리 방식이다. (사실 실제 구현은 컴파일러에서 이루어진다.)
- C++ 예외와는 다른 것이다.
- 윈도우즈 상에서는 C++ 스탠다드 라이브러리도 내부적으로 SEH를 이용한다.
- C++ 예외 처리는 당연히 C++에서만 사용할 수 있으나, SEH는 언어 중립적이기 때문에 다른 언어에서도 사용 가능하다.
- Termination Handling과 Exception Handling으로 분류할 수 있다.
예외가 발생했을때 어떤 일이 일어나는지 먼저 보기위해, Olly로 Pixtopianbook을 불러와서 실행해보자.
예외상황이 발생하며 Olly는 멈추었고, 이 예외상황을 피해가려면 어떻게 해야 하는지 알려주고 있다. 물론 우리는 지금 Olly가 알려준대로 shift+F9을 눌러 프로그램을 실행할 수 있지만, 우리가 원하는 것은 이런 예외상황을 제어하는 것이다.
Exception은 Options 메뉴아래에서 처리할 수 있다.
만약, Protector를 처리하고 싶다면 모두 선택한다. 또한, 마지막으로 발생한 예외상황 목록을 보고 싶다면 Add last exception을 클릭한다. //체크된것을 모두 해제하라. 모든 예외 가능성에 대해 추가하고 싶다면, Add rage를 클릭해서 범위를 00000000 ~ ffffffff 로 지정한다.
Ignore also following custom exceptions or ranges: <- 클릭!
확인 버튼을 누른 뒤, 재실행해보자!
4. Behaviour of the program
프로그램을 시작하면 처음엔 lena의 메시지를 볼 수 있는데, 조금 지나면 이 프로그램은 등록되지 않았다는 성가신 메시지가 나타난다. 만약 이 프로그램을 정상적으로 구입해서 사용한다면, 어떤 일이 벌어지는지 우리의 리버싱 실력으로 알아볼 수 있을 것이다.
Help -> About PixtopianBook을 클릭하면, 아직 등록되지 않은 프로그램이라는 문구가 보인다.
이번에는 새로운 Entry를 추가해 보겠다. (이전에 이미 4개의 엔트리를 만들어 놓았다.)
추가가 불가능 하다는 오류 메시지가 뜸을 알 수 있다. 그러면 그룹을 추가하는 것은 어떨까?
이 역시, 더 이상 추가가 불가능 하다는 것을 알 수 있다. 이 프로그램은 기능이 제한된 프로그램의 좋은 예제이다. 간단히 정리해 보면, 이 트라이얼 버젼으로는 4개의 엔트리와 3개의 그룹만을 생성할 수 있다.
5. Patching the "Group" restriction
모든 기능을 사용할 수 있도록 하기 위해, 좀 더 분석을 해보도록 하겠다. 어떤 방법을 이용할 수 있을까?
이전 파트에서 말한 문자열 검색을 하는등의 방법으로 찾는 것을 시도해볼수 있다. 하지만, 이것만으로는 완전한 패치를 할 수 없거나, 더 어려운 문제에 직면할 수도 있을 것이다. 우리는 이 메시지 박스가 어디에서 생성되고 호출되는지 알기를 원한다. 이것은 간단한 트릭을 이용할 수 있다. Olly를 일시정지 시켜보자.
Alt + F9 (== return to user)
back to user mode 기능으로 특정 이벤트가 일어나기 전에 설정해두고 Call 명령이 일어난 바로 다음 위치를 잡을 수 있다. Olly에서 이 기능을 사용하기 위한 순서는 다음과 같다.
1. 프로세스 attatch
2. 실행(F9)
3. 프로그램을 메시지 창과 같은 정지된 상태로 만든다.
4. 일시정지 버튼을 누른다. paused(F12)
5. back to user mode(Alt + F9)으로 설정
6. 프로그램에서 이벤트 발생(예: 확인 버튼 클릭)
7. Olly에서 해당 부분에 커서가 위치한다.
주의할 점은 back to user mode 기능은 브라우저나 내부 스레드가 작동하는 프로그램의 경우에는 내부 이벤트가 수시로 일어나기 때문에 해당 모드가 풀려버리니 이 기능을 사용하려면 창과 같이 프로세스가 멈추는 상태에서 사용하는 것이 좋다.
프로그램의 확인 버튼을 클릭한다. 그리고 스크롤을 조금만 올려보자.
00456315
메시지박스 부분이 보인다. 이 작은 트릭은 거의 모든 상황에서 동작한다. 메시지 박스가 어디에서 호출되는지 찾아 볼 필요가 있다. F8을 눌러보자.
0045631C | RETN
RET (Return)
RET는 아무일것도 하지 않지만, CALL 명령을 사용하는 부분에서 리턴된다.
RET digit 은 리턴되기 전의 상태로 스택을 되돌리는 역할을 한다.
그래서 여기서는 리턴된다.
00408B1D | POP ESI
스크롤을 올려 호출하는 곳이 어디인지 살펴보자.
00408B18 | CALL Pixtopia.004562ED
이것은 메시지 박스를 호출하기 위한 메인 콜임을 보여준다. 리턴후에, 우리는 코드의 다음 줄을 실행할 것이다.
00408B0C
00408B11
이것은 메시지박스에 보여지는 텍스트이다.
00408AFF | CMP EAX, 3
최대로 생성할 수 있는 그룹 갯수인 3과 비교한다.
00408B08 | JL SHORT Pixtopia.00408B34
00408B34 | PUSH 0
이곳으로 점프하고, 새 그룹을 생성할 것인지 물을 것이다. 여기에 무엇이 필요한지 모두들 잘 알것이라고 믿는다.
이것을 어셈블 해보자!
00408B08 | JMP SHORT Pixtopia.00408B34
이렇게 고쳐보자! 그러면 우리는 항상 메시지 박스를 점프할 수 있을 것이고, 우리가 원하는 행동을 지속할 수 있을 것이다. 수정된 부분을 저장하고, 새로 불러와 프로그램으로 확인해보자. 그림과 같이 정상적으로 그룹추가가 될 것이다.
6. Patching the "Entries" restriction
우리는 다섯번째 엔트리를 추가할 수 없다. 이것은 그룹을 추가 할 수 없던 것과 같은 행동이다. 일단, 일시정지를 하고, Alt + F9을 누르고 버튼을 클릭하자. 보시다시피 이전과 같은 곳이다. 이곳에서 메시지 박스를 만든다. 이것을 어디에서 호출하는지 다시 한번 살펴보자.
F8로 한줄씩 실행해본다.
00412DEA | JMP Pixtopia.00412ECC
스크롤을 올려서 이전에 어떤 행동이 일어나는지 살펴보자.
00412DD0 | CMP EAX, 4
00412DD3 | JL SHORT Pixtopia.00412DEF
여기에 이전과 완전히 같은 상황이 있다. 오직 4와 비교한다는 것만 다를 뿐이다. 어떻게 고쳐야 할지 한번 생각해보라. 단지 우리는 JL => JMP 로 바꾸어 주면 된다!
이전과 마찬가지로, 이제는 이 메시지 박스를 피해갈 수 있을 것이고, 원하는 작업을 계속 할 수 있다. 모든 변화된 부분을 저장하자. 그리고 패치된 파일을 불러온다.
7. Some aesthetical patches
다시 실행해본다. 여전히 상단 프로그램 표시부분에는 등록되지 않은 버젼이라고 명시된다. 이것은 데이타 혹은 자원 섹션 그리고 코드 섹션에서 찾을 수 없는 것이다. 코드에서 스트링 검색은 바로 뛰어넘겠지만, 메모리모듈을 한번 보도록 하겠다. Olly는 코드섹션에 대한 스트링만을 찾을 뿐이다. 파트2에서 "Analyse This!" 플러그인을 추천해준 바 있다.(혹은 올리의 옵션 메뉴를 수정하는 것.) (그 섹션으로 간다음 CPU 윈도우에서 라이트 클릭을 한다음 analyse를 클릭한다.)
M
우클릭 -> Enter binary string to search for
HEX 모드에서 아스키와 유사한 유니코드로 검색할 수 있다.
(Unregistered ver
이라고 적은뒤, Case sensitive 클릭해제하고, 확인버튼을 클릭하면, 리소스 섹션에서 찾을 수 있다!
덤프창에서 이것을 보고, 필요한 부분은 수정하자.
덤프창에서 클릭 후 Ctrl+G
4e4be6
해당영역 선택 후 우클릭 -> Binary -> Edit, Keep size 체크 되어 있어야 함.
뭐라고 적고 싶은가? 강좌에서 lena는 Registered version 이라고 적었다. 우리는 오직 메모리에서 바꿨기 때문에 계속해서 패치된 파일을 원한다면 이것을 파일로 저장해야한다.
다시 새파일을 불러와 실행해본다.
Help -> AboutPixtonianbook 에는 여전히 여기에는 등록되지 않은 버젼이라고 나와있다.
같은 작업을 다시 한번 해보자!
메인창에서 보이던 글자 변경하고 싶다면, 메모리 덤프 -> 검색 -> 이번엔 아스키로 unregistered 로 검색해본다.
이것은 데이터 섹션에 위치한다. 아까와 마찬가지로 변경하고 저장, 그리고 불러와서 새로 실행해보자.
이제 우리가 원하는대로 바뀐것을 확인할 수 있다. 하지만, 그냥 첫번째 메시지만 뜨게 할 수는 없을까??
T(54) 우클릭 -> Find references
Olly는 일시정지된 이 주소값이 어디인지 알고 있다. 그러므로 만약 이 주소를 더블클릭한다면 해당 문자열로 갈 수 있을 것이다.
그러나 이 공지는 내가 등록되어 있지 않을 때만 보여진다. 만약 등록되어 있다면, 이 루틴을 점프한다. 그러므로, 이 글을 윈도우창에 쓰지 않는다는 것이다. 정리해보면, 이 프로그램이 등록되지 않았다면 EBP == 907일 것이다.
0040C197 | CMP EBP, 906
등록되어 있는지 묻고 있다. 906이면 등록되었다는 뜻이다. 만약, 아니라면 이전에 확인했던 곳으로 이동한다.
알아낸 내용을 정리해보자!
EBP == 906 (registered)
EBP == 907 (unregistered)
그러므로, EBP == 906으로 바꾸면 항상 등록된 상태로 만들 수 있을 것이다.
스크롤을 내려보자.
0040C235 | JNZ SHORT Pixtopia0040C251
이 부분을 JMP로 바꾼다면 정상적으로 이 프로그램을 구입했을 때처럼, 우리는 항상 사랑스런 환영 메시지를 볼 수 있을 것이다. 저장 후 새로 불러와서 실행해보자!
8. Testing the program
윈도우에 나타나는 모든 메시지 점검해보고, 엔트리 및 그룹추가가 원활히 수행되는지 확인해본다.
모두 성공적으로 패치가 되었다면, 이상없이 잘 동작할 것이다.
이번 4장에서는, 우리는 프로그램에서 제한된 부분을 패치하는 방법에 대해 배워보았다. 이것에는 더 나은 방법과 다른 많은 해결책들이 존재한다. 하지만, 우리는 기본적인 것들에 대해 배워보았다. 모두가 이 모든것을 이해했기를 바라고, 이것에서 무엇인가를 배웠기를 기대한다.
팀블로그가 시작된지도 어느덧 3달째에 접어들고 있는데도, 리버싱 강좌는 이제 겨우 4장이네요..^^;
열심히 달려왔다고 생각했는데도 처음 생각했던 것 보다 많이 늦어지고 있는것 같아 죄송하게 생각하고 있습니다.
lena의 리버싱 강좌가 총 40장으로 구성되어 있는 만큼, 1주일에 하나 이상씩 포스팅을 해서 올해안에는 꼭 완성을 짓겠다는 약속을 드리고싶습니다. ^^
그리고 한가지 더 개인적으로 축하 받고 싶은 일이 생겼습니다!
백수 3개월차에 접어들던 제가 드디어 목표로 삼았던 A모 보안 컨설팅 회사에 최종 합격하여 출근을 코앞에 두고 있습니다. 새로운 환경에 처음 접할 업무 등 때문에 많이 긴장되기도 하지만, 하고 싶은 일이니만큼 정말 열심히 한번 해볼렵니다! ㅎㅎ 보안업계에 계시는 많은 선배님들~ 앞으로 많은 조언 부탁드립니다! ^^