리버싱 공부

1.기초 리버싱-2(리버싱 핵심원리 정리)

흔들어먹는공대생 2023. 5. 30. 01:25

 

*해당 내용은 "리버싱 핵심원리"를 바탕으로 정리*

2. Hello World! 리버싱

사진 삭제

HellowWorld.cpp

다음 코드를 OllyDbg로 열기

 

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명령어까지 실행(함수 탈출 목적)

 

 
00BD1636함수

 

00BD1680주소를 보면 RETN 명령어가 있음, RETN은 함수의 끝에서 사용되며 함수가 호출된 원래 주소쪽으로 되돌아감 (00BD1271 = CALL 00BD1636다음 명령어인 JMP 00BD10EA의 주소 )

 

JMP 00BD10EA 점프문 따라가기

위와 마찬가지로 [F7]로 함수 안으로 들어가봄

 

 
00BD10EA
 

 

[F7]로 명령어를 하나씩 내려가다보면 함수 호출이 또 있는 것을 확인할 수 있다.

CALL HelloWor~ (CALL 00BD1930) 다음 함수 내부로도 들어가보자

 

 
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 등의 명령어에 위치해 있다면, 해당 주소를 따라가서 보여줌
(실행되는 것이 아님. 간단히 함수 내용을 확인할때 유용함)