**Show local module name 체크 해제하면 <HelloWor.베캠1>이 아니라 <베캠1>로만 표시됨
주석 검색했던 것처럼 코드 윈도우를 우클릭 -> Search for -> User-defined label 선택하면 레이블 목록이 뜸
원하는 레이블 더블클릭 후 이동해서 F4로 해당 위치까지 디버깅 가능
메모 / BP / 주석 / 레이블
메모는 많이 쓰지 않을 것 같고 Goto로 이동할 때 좋을 거 같아서 오늘 진행 상황으로 기록하고 다음날 그 주소로 이동할 때 쓰지 않을까 싶음
레이블은 어떤 함수 호출하는지 적을 때 좋을 거 같음 그리고 불렀던 주소를 또 부르는 경우가 많은 거 같아서 레이블 설정해두면 들어가봤던 함수에 또 들어갈 일 줄어들지 않을까 싶음
BP랑 주석은 같이 사용하는 경우가 많을 것 같음 BP만 설정하면 헨젤과 그레텔마냥 과자 하나하나 주워가면서 찾아가야할 거 같은데 주석까지 달아두면 ㄹㅇ 워프처럼 이동할 수 있을 것 같음
원하는 코드 빨리 찾는 법
-> 디버거로 코드 딱 까면 EP주소에 Visual C++ 등 개발 도구 Stub 코드부터 나오고, 한참 헤맨 다음에야 main() 함수가 나오기 때문에 슈슉하고 원하는 코드 찾아가고 싶을 때 도움이 됨 -> 개발, 분석 경험이 충분하다면 프로그램 실행만으로 내부 구조 추측 가능
▷ 원하는 코드 빨리 찾는 법
원하는 기능이 실행될 때까지Step Over(F8)로 한 줄씩 실행해보기
프로그램이 사용 중인 문자열 중에서 원하는 문자열 데이터가 참조된 주소 찾아가기
프로그램에 사용된 Win32 API 함수 호출 목록에서 원하는 API 찾아서 이동, BP 설치
프로세스 메모리에 로딩된 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 코드로 찾아가기
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 함수 호출이 저장되어 있는 것을 볼 수 있음