해보자고

[리버싱 핵심 원리] 2장 일부 & 3장 정리 본문

리버싱/리버싱 핵심 원리

[리버싱 핵심 원리] 2장 일부 & 3장 정리

초코맛동산 2023. 4. 2. 01:20

# 학습 목표

- 2장: Hello Wordl! 리버싱

- 3장: 리틀 엔디언 표기법

2.5 문자열 패치 

2.5.1 문자열 패치의 두 가지 방법

1. 문자열 버퍼를 직접 수정

 

목표: 메시지 박스의 Hello World! 문자열을 다른 문자열로 변경하기.

 

- 저번에 bp를 건 후 메시지박스의 위치를 찾는다. 책에서는 PUSH (주소값)의 형태였지만 ollydbg에서는 Hello World의 주소값을 알 수 없어 그냥 올리디버거의 기능을 활용하였다. 

- Follow dump -> selection 

 

 

- 덮어씌우고자 하는 영역에 ctrl + E 

- 유니코드는 알파벳 한 글자당 2바이트가 필요함. 

- 원본 문자열보다 큰 문자열을 덮어쓸 때는 뒤의 데이터 훼손에 주의해야 한다. 중요한 데이터가 있다면 프로그램에서 메모리 참조 에러가 발생할 수 있다. 

 

 

장점: 간단하다

단점: 기존 문자열 버퍼 크기 이상의 문자를 입력하기 어렵다. 

 

2. 다른 메모리 영역에 새로운 문자열 생성하여 전달

- 적당한 메모리영역에 패치하고하 하는 새로운 문자열을 적고, 해당 주소를 MessageBoxA() 함수에게 파라미터로 넘겨주는 것.  

 

- 프로그램에서 사용되지 않는 NULL padding 영역(사진과 같음)에 문자열을 패치해줌. 

 

 

- 커서를 사진과 같이 두고 Assemble 명령(단축키:space)을 내려 assemble 창을 켜고 새로운 버퍼 주소를 입력. 

+) Assemble 창에서는 사용자가 원하는 어셈블리 명령어 입력이 가능하며, 입력 즉시 코드에 반영 및 실행도 가능함. 

 

 

 

3. 리틀 엔디언 표기법 

3.1 바이트 오더링 

바이트 오더링 :  컴퓨터에서 메모리에 데이터를 저장하는 방식

 

ex1. WORD w = 0x1234;

ex2. chat[] str = "abced"; // 61의 아스키 코드는 61, e는 65

 

1. 빅 엔디언(Big Endian) 

- ex1. [12][34]

- ex2. [61][62][63][64][65][00]

- 사용: 네트워크 프로토콜, UNIX 서버에 사용되는 RISC 계열 CPU

- 장점: 사람이 보기에 직관적이다. 

 

2. 리틀 엔디언(Little Endian)

- ex1. [34][12]

- ex2. [61][62][63][64][65][00]

- 사용: Intel x86 CPU

- 장점: 산술 연산에 효율적, 데이터 타입 확장/축소될 때 효율적 

 

 

# LittleEndian 리버싱

 

-  코드를 쭉 실행하다 실행이 멈추는 곳 이전에 BP를 건다. (main일 확률이 높다.)

- [12] , [34][12], [56][34][12] ~ 리틀엔디언 형식으로 저장되어 있음을 확인할 수 있다.