1.기초 리버싱-2(리버싱 핵심원리 정리)
*해당 내용은 "리버싱 핵심원리"를 바탕으로 정리*
2. Hello World! 리버싱

HellowWorld.cpp
다음 코드를 OllyDbg로 열기

코드를 OllyDbg로 열면 다음 화면과 같이 나온다. (책이랑은 주소가 다르게 나옴!)
화면 구성
(1) Code Window
|
기본적으로 disassembly code를 표시하여 각종 comment,label을 보여주며, 코드를 분석하여 loop, jump 위치 등의 정보를 표시한다.
|
(2) Register Window
|
CPU register 값을 실시간으로 표시하며 특정 register들은 수정 가능
|
(3) Dump Window
|
프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니코드 값으로 표시하고 수정도 가능
|
(4) Stack Window
|
ESP register 가 가리키는 프로세스 stack memory를 실시간으로 표시하고 수정도 가능
|
어셈블(assemble): 어셈블리어를 기계어로 바꾸어 주는 작업
디스어셈블(disassemble): 기계어를 어셈블리어로 바꾸어주는 작업
어셈블리 코드-> 사람이 이해하기 쉬운 코드
근데 왜 (1) Code Window는 disassembly 코드라고 나와있을까? 디스어셈블리는 반댓말 아닌가?
EP(EntryPoint)
올리디버거를 맨처음 실행시키면 하이라이트 되면서 올라가는 부분으로 HelloWorld.exe의 실행 시작 주소임

EP(00BD126C)
해당 코드에서 EP는 00BD126C인것을 볼 수 있다.
00BD126C CALL 00BD1636(=HelloWor.__~~~~) ; BD1636주소의 함수를 호출
-> HelloWor.~~~이거를 함수 주소로 바꾸고 싶은데 아직 못찾음
(밑의 내용에 나와있음 옵션/ Disasm페이지에서 심볼릭 어드레스 지우면 주소로 나옴!!)
CALL 00BD1636에서 00BD1636함수를 따라가보자 Step Into[f7]을 사용하면 함수 안으로 갈 수 있음
명령어
|
단축키
|
설명
|
Restart
|
[Ctrl + F2]
|
다시 처음부터 디버깅 시작(디버깅을 당하는 프로세스를 종료하고 재실행)
|
Step Into
|
[F7}
|
하나의 OP code 실행(CALL명령어를 만나면, 그 함수 코드 내부로 따라 들어감)
|
Step Over
|
[F8]
|
하나의 OP code 실행(CALL명령어를 만나면, 그 함수 코드 내부로 따라 들어가지 않고 그냥 함수 자체를 실행
|
Execute till Return
|
[Ctrl+ F9]
|
함수 코드 내에서 RETN명령어까지 실행(함수 탈출 목적)
|

00BD1680주소를 보면 RETN 명령어가 있음, RETN은 함수의 끝에서 사용되며 함수가 호출된 원래 주소쪽으로 되돌아감 (00BD1271 = CALL 00BD1636다음 명령어인 JMP 00BD10EA의 주소 )
JMP 00BD10EA 점프문 따라가기
위와 마찬가지로 [F7]로 함수 안으로 들어가봄

[F7]로 명령어를 하나씩 내려가다보면 함수 호출이 또 있는 것을 확인할 수 있다.
CALL HelloWor~ (CALL 00BD1930) 다음 함수 내부로도 들어가보자

다음 함수는 MessageBox() API 호출 코드가 보이지 않기에 main() 함수라고 보기 어렵다.
[Ctrl+F9]를 써 RETN까지 간후 [F7]로 다음 함수를 탈출하자 ( 그러면 CALL 00BD1930 다음의 주소로 가게됨)
+++ 다음에 추가로 정리+++++
컴퓨터 포맷해서 새로 작성. 화면이 다를 수 있음...ㅎ
하필 포맷하고 다시하는데.. 그이후가 책이라 완전 달랐음.. 그래도 main 구문 찾으라고해서 앞으로 계속 가다가

메시지박스 발견

실행해보니 맞나보다 메인함수 발견 성공...
디버거 명령어
명령어
|
단축키
|
설명
|
Go to
|
[Ctrl + G]
|
원하는 주소로 이동(코드/ 메모리를 확인할 때 사용. 실행되는 것은 아님)
|
Execute till Cursor
|
[F4]
|
cursor위치까지 실행(디버깅하고 싶은 주소까지 바로 갈 수 있음)
|
Comment
|
;
|
comment 추가
|
User-defined comment
|
|
마우스 우측 메뉴 Search for User-defined comment
|
Label
|
:
|
Label 추가
|
User-defined label
|
|
마우스 우측 메뉴 Search for User-defined label
|
Set/Reset BreakPoint
|
[F2]
|
BP 설정/ 해제
|
Run
|
[F9]
|
실행(BP가 걸려있으면 그곳에서 실행이 정지됨)
|
Show the cuurent EIP
|
*
|
현재 EIP위치를 보여줍니다
|
Show the previous Cursor
|
-
|
직전 커서 위치를 다시 보여줍니다
|
Preview CALL/JMP address
|
[Enter]
|
커서가 CALL/JMP 등의 명령어에 위치해 있다면, 해당 주소를 따라가서 보여줌
(실행되는 것이 아님. 간단히 함수 내용을 확인할때 유용함) |