리버싱 핵심원리

2. 원하는 코드 호로록 찾기 위해 알아야 할 기능

whydontyoushovel 2025. 5. 30. 23:45

목차

1) 베이스캠프

2) 베이스캠프 이용 실습

  • Goto 명령
  • BP설치
  • 주석
  • 레이블

3) 원하는 코드 빨리 찾는 법

4) 원하는 코드 빨리 찾는 법 실습

  • 코드 실행
  • 문자열 검색
  • 호출 코드에 BP 설치해서 API 검색
  • API 코드에 직접 BP 설치해서 API 검색

 

 

   베이스캠프       

디버거로 동적 분석 중인 프로그램에서 길을 잃거나 할 때 프로그램을 재실행하여 태초마을로 복귀하게 되는데 이때 중요한 주소를 베이스캠프로 지정해두면 빠르게 도달할 수 있음

 

▷ 베이스캠프 지정 방법

  1. 주소 잘 메모해두고 단축키로 그 위치까지 직행하기
  2. 중요한 주소에 BP (Break Point) 설치해서 처음부터 쭉 실행하기 (가장 많이 쓰임)
  3. 주석 설정해서 주석 찾아가기
  4. 주소 대신 이름(레이블) 붙여서 이름 찾아가기

(근데 문제는 경험치가 없어서 중요한 주소의 기준을 모름)

 

 

   베이스캠프 이용 실습       

▷ 중요한 주소 잘 메모해두고 단축키로 직행

  • 목표 주소: 40104F

Ctrl + G 를 눌러 GoTo 창을 실행
가고 싶은 주소를 입력하고 ok 버튼 클릭

 

목표 주소로 이동한 것을 확인
이후 F4를 눌러 커서가 있는 해당 주소까지 프로그램을 실행시킴

 

주소가 까맣게 칠해지며 현재 위치까지 프로그램이 진행되었음을 알 수 있음
  • 중간에 여기저기 들릴 필요 없어 편하지만 기억해두거나 적어둬야 하는 번거로움이 있음

 

 

▷ BP(Break Point) 만들고 쭉 실행

  • 목표 주소: 40104F
  • 프로그램 처음부터 실행 : Ctrl + F2

아까와 마찬가지로 Ctrl + G로 원하는 주소로 이동

 

이동 후 F2를 눌러 해당 주소에 BP(Break Point) 설치
설치되면 주소가 빨갛게 채워짐

 

F9를 누르면 BP까지 실행됨
(BP가 없을 땐 처음부터 끝까지 실행되는 단축키)

 

처음부터 다시 실행할 때 View - Breakpoints 혹은 Alt + B 단축키를 누르면
BP 목록을 볼 수 있음

 

재시작(Ctrl + F2)해도 사라지지 않음!! 올리디버거 껐다 켜도 남아있음!!!
BP 목록에 표시된 주소 중 원하는 위치를 더블클릭하면 해당 주소로 커서가 이동됨

 

커서 이동 후 마찬가지로 F9를 눌러 해당 주소까지 프로그램 실행시키며 디버깅 진행

 

BP 설치한 주소에서 F2를 누르면 BP가 해제되고 목록에서도 사라짐
  • 적어두지 않아도 올리디버거가 기억해줘서 편해보임
  • 정말 많이들 사용하는 방법이라고 함
  • 근데 BP가 많으면 BP 목록에서 커서 이동 후 F4로 실행시키는 게 나을 것 같기도 함
  • BP 설치하는 기준이 뭘까 생각하면서 다른 분들 리버싱하는 걸 찾아봤는데 목표 주소에 설치하는 것 같음. 실행 방식이나 메모리 변화 등이 궁금한 주소에 BP 설치하고 거기까지 실행시키는 식..

 

 

▷ 주석 찾아가기

  • 목표 주소: 40104F
  • 프로그램 처음부터 실행 : Ctrl + F2

프로그램 재실행 후 Goto 명령으로 원하는 주소로 이동

 

이동한 위치에서 ;을 눌러 주석을 설정하고 ok 버튼 클릭

 

해당 주소의 주석 위치에 내가 설정한 주석이 표시됨

 

코드 윈도우에서 우클릭하여 Serch for -> User-defined comment 클릭

 

주석은 안 보이고 빨간 글씨만 보임
빨간 글씨로 표시되는 주소는 현재 커서가 위치한 곳인데 주석 표시된 주소와 커서 위치가 겹쳐서 안 보이는 것

 

커서 위치를 다른 주소로 옮기고 주석 목록창을 다시 열었더니 베이스캠뿌 주소가 표시되고 있음

 

*주석 창 글씨 크기 키우기

더보기

Options - Appearance

Fonts 에서 원하는 폰트 선택 후 ok

주석 검색 창 우클릭 - Appearance - Font - 위에서 선택한 폰트 클릭하면 글씨 크기 달라짐

 

더블 클릭해서 해당 위치로 커서를 이동시키고
F4를 눌러 커서까지 프로그램 실행시킬 수 있음

; 눌러서 주석 넣는 창 실행시키고 원래 적혀있던 "베이스캠뿌"를 지운 뒤 OK 누르면 주석 지워짐
  • 베이스캠프로 쓰든 안 쓰든 주석은 자주 추가할 것 같음
  • BP를 왜 설치했는지 쓸 때도 좋을 것 같음

 

 

▷ 레이블로 주소에 이름 붙여 찾아가기

  • 목표 주소: 40104F
  • 프로그램 처음부터 실행 : Ctrl + F2

프로그램 재실행 후 Goto 명령어를 이용해 원하는 주소로 이동

 

그 위치에서 : (콜론)을 눌러 레이블 설정창을 켜고
40104F 주소를 "베캠1"이라는 이름으로 설정함

 

- (빼기)를 눌러 이전에 커서가 있던 위치로 이동해보면
40104F 주소로 표시됐던 부분이 "베캠1"로 변경된 것을 볼 수 있음

 

*레이블이 안 보일 때

더보기

Options - Debugging options

Disasm - Show symbolic addresses 체크한 뒤 오케이

 

**Show local module name 체크 해제하면 <HelloWor.베캠1>이 아니라 <베캠1>로만 표시됨

 

주석 검색했던 것처럼 코드 윈도우를 우클릭 -> Search for -> User-defined label 선택하면 레이블 목록이 뜸

 

원하는 레이블 더블클릭 후 이동해서 F4로 해당 위치까지 디버깅 가능

 

 

메모 / BP / 주석 / 레이블

  1. 메모는 많이 쓰지 않을 것 같고 Goto로 이동할 때 좋을 거 같아서 오늘 진행 상황으로 기록하고 다음날 그 주소로 이동할 때 쓰지 않을까 싶음
  2. 레이블은 어떤 함수 호출하는지 적을 때 좋을 거 같음 그리고 불렀던 주소를 또 부르는 경우가 많은 거 같아서 레이블 설정해두면 들어가봤던 함수에 또 들어갈 일 줄어들지 않을까 싶음
  3. BP랑 주석은 같이 사용하는 경우가 많을 것 같음 BP만 설정하면 헨젤과 그레텔마냥 과자 하나하나 주워가면서 찾아가야할 거 같은데 주석까지 달아두면 ㄹㅇ 워프처럼 이동할 수 있을 것 같음

 

 

   원하는 코드 빨리 찾는 법       

-> 디버거로 코드 딱 까면 EP주소에 Visual C++ 등 개발 도구 Stub 코드부터 나오고, 한참 헤맨 다음에야 main() 함수가 나오기 때문에 슈슉하고 원하는 코드 찾아가고 싶을 때 도움이 됨
-> 개발, 분석 경험이 충분하다면 프로그램 실행만으로 내부 구조 추측 가능

 

▷ 원하는 코드 빨리 찾는 법

  1. 원하는 기능이 실행될 때까지 Step Over(F8)로 한 줄씩 실행해보기
  2. 프로그램이 사용 중인 문자열 중에서 원하는 문자열 데이터가 참조된 주소 찾아가기
  3. 프로그램에 사용된 Win32 API 함수 호출 목록에서 원하는 API 찾아서 이동, BP 설치
  4. 프로세스 메모리에 로딩된 API 함수를 통해 함수 호출 주소 알아내기

 

 

   원하는 코드 빨리 찾는 법 실습       

▷ Step Over (F8)로 한 줄씩 실행

  • main() 함수의 MessageBox 함수 호출 코드가 실행될 때까지 한 줄씩 실행시키는 방법

디버거에 프로그램 넣었을 때 바로 보이는 화면
실행 프로그램은 창이 뜨기만 하고 코드 윈도우는 EP에 위치해있음

F8을 눌러서 코드를 한 줄씩 실행시키다 보면 메시지 박스가 나타남
이 주소에서 호출 중인 401000 주소에서 MessageBox API 함수를 호출하고 있을 것으로 보임

 

401144 주소에서 엔터를 쳐서 들어가보면
필요한 인자들을 스택에 저장하고 MessageBox 함수에 파라미터로 전달 중
Win32는 API 함수 파라미터를 스택으로 전달
VC++ 컴파일러는 기본 문자열과 문자열 처리 API 함수들 전부 유니코드로 변경함
  • 프로그램의 기능이 명확하고 코드의 크기가 작은 경우에 사용할 법한 방법
  • 딱 눈에 보이는 기능만 있는 게 아니거나 코드가 길 때 사용하기엔 단순한 방법인 듯함

 

 

▷ 문자열 데이터로 찾기

OllyDbg가 사전 분석을 통해 프로그램에 참조되는 문자열과 호출되는 API 목록을 뽑아내는데 이를 토대로 코드 찾아갈 수 있음(프로세스 메모리를 훑어서 뽑아냄)

 

프로그램 실행 시 볼 수 있는 문자열 두 개를 확인

프로그램 재실행 후 코드 윈도우를 우클릭 -> Search for -> All referenced text strings 명령 클릭

 

그럼 이렇게 프로그램 내에서 참조된 문자열 목록을 볼 수 있음

 

401002 주소에 PUSH HelloWor.409278 명령어가 있고
이 명령어가 참조하는 409278은 문자열 "www.reversecore.com" 이다 (라는 뜻)

 

저 주소를 더블클릭하면 위와 같이 원하는 함수로 이동할 수 있음
코드 윈도우 뿐만 아니라 덤프 윈도우에서 문자열을 확인할 수도 있음

 

코드 윈도우 하단 덤프 윈도우를 클릭해 활성화시키고 Ctrl + G 단축키로 Goto 명령어를 실행함
이때 넣을 주소는 409278이나 4092A0 같이 문자열 자체가 있는 주소임

 

짠.
다른 문자열로 패치할 때 이 창에서 하는 가봄(자세한 건 나중에..)
이 데이터 들은 401xxx 였던 코드 영역의 주소와 달리 409xxx 같은 형태임. 얘네는 데이터 영역의 주소라고 함.
(자세한 건 PE file format 공부할 때...)

 

 

 

▷ API 함수 호출 목록에서 찾기

프로그램을 실행해보고 사용되었을 법한 API 함수를 추측하여 API 목록에서 해당하는 걸 보고 찾아갈 수 있음
  • OS에게 화면 출력을 요청하기 위해 윈도우즈의 Win32 API 함수를 썼을 것
  • 메시지 박스는 user32.MessageBox() API 사용

코드 윈도우에서 우클릭 -> Search for -> All intermodular calls 클릭

 

API 호출 목록 창이 나타남
최상단에 USER32.MessageBoxW()를 호출하는 주소를 볼 수 있음

 

더블클릭하여 해당 주소로 이동
올리디버거가 API 이름을 뽑아오는 방법은 PE file format의 IAT 구조를 이해해야 알 수 있음
(IAT : Import Address Table 주소 표 불러오기?)

 

 

 

▷ 프로세스 메모리에서 찾아가기

Packer나 Protector에 의해 파일 구조가 변경되어 OllyDbg가 API 함수 호출 목록을 추출할 수 없을 때
프로세스 메모리에 로딩된 DLL 코드로 찾아가기

 

Packer, Protector

더보기

Packer

실행 파일 압축 시키는 유틸리티.

압축시키긴 하지만 zip이랑 달리 이 자체로도 실행 가능

 

Protector

실행 압축 + 파일과 프로세스 보호 목적 유틸리티

안티 디버깅, 안티 에뮬레이팅, 안티 덤프 등 기능 추가

상세 분석하려면 높은 수준의 리버싱 지식이 요구된다고 함

≫ 대략적인 순서

  1. 프로세스 메모리에서 API 함수 이름 검색하여 선택
  2. dll에 구현된 해당 함수의 코드에 BP 설치 후 실행(F9)
  3. 함수 안 RETN 명령어에 BP 설치 후 실행(F9)
  4. RETN 명령어 위치에서 F7/F8을 눌러 리턴 주소로 이동
  5. 리턴 주소의 바로 위에 원하는 API 함수 호출 코드 발견

≫ 과정

  • 프로세스 메모리 보기

View 탭의 Memory 기능 클릭 (혹은 Alt + M)

 

프로세스 메모리 목록을 볼 수 있음

 

  • 프로그램에 사용되는 (시스템 DLL 파일이 제공하는) 모든 API 목록을 볼 수 있음
  • Owner 탭에 USER32라고 쓰여있는 행이 USER32 라이브러리가 로딩되어 있는 메모리 영역

저 목록 중에서 원하는 API 함수를 검색하기 위해
코드 윈도우 우클릭 -> Search for -> Name in all modules

 

이런 화면이 뜸
Name 열을 눌러 이 열을 기준으로 정렬 시키고 찾고자 하는 API 함수 이름(MessageBoxW)을 타이핑

그러면 자동으로 결과가 검색되는데
검색 결과 중 Module이 USER32이고 Type이 Export인 MessageBoxW를 더블 클릭

그럼 코드 윈도우에 USER32.dll에 구현된 MessageBoxW 함수가 나옴. 주소도 4011A0 이러던 것과 다르게 생김
여기에 BP 설치하고 F9로 여기까지 프로그램 실행시킴

실행시킨 모습
이때 코드 윈도우에 옆 화면인 레지스터 윈도우를 보게 되면 프로세스 스택의 주소를 알 수 있는데,

ESP 값이 프로세스 스택의 최상단 주소 값임
우측 하단의 스택 윈도우를 보면 알 수 있음

스택 윈도우

함수 끝나고 돌아갈 주소(리턴 주소, 401014)와 함수에 사용된 매개변수 등이 표시됨
이때 ESP 값인 19FF18의 Value 는 401014라는 주소를 가리키는데 이 주소가 함수 끝나고 돌아갈 리턴 주소임
즉 MessageBoxW 함수 호출하는 주소의 바로 다음 주소를 가리키고 있음

저 주소에 찾아가기 위해
현재 위치한 MessageBoxW 함수의 retn 명령어 주소에 커서를 두고
F4를 눌러 진행한 후 F8을 눌러 함수를 빠져나옴
(책에서는 리턴 주소에 BP 설치 후 F9로 디버깅함)

 

그럼 프로그램이 실행되어 메시지 박스가 뜨는 것을 볼 수 있음

코드 윈도우를 확인해보면 MessageBoxW 함수의 리턴 주소였던 401014 주소에서 진행이 멈춰있고
해당 주소 바로 위에서 MessageBoxW 함수 호출이 저장되어 있는 것을 볼 수 있음