[리버싱 핵심 원리] 2장 일부 & 3장 정리
# 학습 목표
- 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] ~ 리틀엔디언 형식으로 저장되어 있음을 확인할 수 있다.