메모리에는 코드,데이터,힙,스택 이렇게 4가지의 영역으로 나뉜다.
특히 스택은 거꾸로 데이터가 쌓인다. 스택이 커지는 그 반대방향에는 커널 이라는 중요한 곳이 있어서 침범을 하면 안되도록 설계해놓았다.
EP(엔트리 포인트) : 운영체제가 사용자 프로그램(ollydbg)으로 최초로 제어를 넘기는 지점.
ollydbg로 어떠한 바이너리를 열면 멈추는 지점이 바로 엔트리 포인트이다.
Flag 중 중요한 것이 Zero flag인데 두 값을 비교해서 같으면 ZF가 1이 되고, 같지 않으면 0이 된다.
X86-assembly/Instructions/jnz - aldeid
Description The jnz (or jne) instruction is a conditional jump that follows a test. It jumps to the specified location if the Zero Flag (ZF) is cleared (0). jnz is commonly used to explicitly test for something not being equal to zero whereas jne is common
www.aldeid.com
위의 링크를 보면 알겠지만 JNZ라는 점프문에서 zero flag를 이용한다.(ZF가 0이면 jump한다 라는 것이다.)
함수 호출 규약 : 함수를 호출할 때 인자를 전달하는 방식이나 함수 실행이 끝나고 스택을 정리하는 방식에 대한 약속이다.
여기에서 함수의 호출자(caller)와 피호출자(callee)가 있는데, 예를들어서 main 함수에서 func() 이라는 함수를 호출했다면 main함수가 '호출자' 가 되는 것이고, func()가 피호출자가 되는 것이다.
- cdecl 방식
- 인자전달 : 오른쪽에서 왼쪽으로 순서대로 전달.
- 함수정리 : 호출자가 피호출자의 스택 프레임을 정리한다
- stdcall방식
- 인자전달 : cdecl방식과 동일하게 오른쪽에서 왼쪽으로 순서대로 전달.
- 함수정리 : 피호출자 스스로 스택 프레임을 정리한다.
- fastcall방식
- 인자전달 : 오른쪽에서 왼쪽으로 순서대로 레지스터를 사용해서 전달한다.
- 함수정리 : 레지스터를 사용해서 별도로 스택을 정리할 필요가 없다.
음수를 표현하는 방법 : 2의 보수방식으로 표현한다.
1. 어떠한 수를 정한다
ex>4
2. 그 수의 2진수를 NOT 연산을 한다.(0,1을 바꾼다.)
0000 0100 ==> 1111 1011
3.그 2진수에 1을 더해준다.
1111 1011 + 1 => 1111 1100
4.그렇게 되면 그 수의 음수가 되는 것이다.
FC => ollydbg에서 음수 4를 입력하면 화면에 FC 라고 뜬다.
Ollydbg 의 유용한 기능들
Ollydbg에는 4개의 화면으로 나뉘는데, 왼쪽 위는 코드영역, 코드의 오른쪽은 레지스터, 레지스터의 아래는 스택, 스택의 왼쪽은 메모리 이다.
Ctrl + F2 => 브레이크 포인트(프로그램이 실행되다가 멈추는 지점을 설정 할 수 있다.)
Code 영역 화면->마우스 오른쪽 클릭->Search For -> All referenced text strings : 분석해야 할 어셈블리 코드들이 너무 많을 때는 '문자열 검색' 기능으로 어디를 분석해야 할 지 감을 잡게 해준다.
Code 영역 화면->마우스 오른쪽 클릭->Search For -> All intermodular calls : 문자열 검색 등으로
오류메세지를 확인할 수 없을 때 실마리를 찾기위해 API를 검색하는 기능이다.
(많은 API중 힌트가 되는 API를 고르는 능력은 경험의 문제이다.)
API란, 응용프로그램을 프로그래밍 하기 위한 함수의 집합체이다.
'Hacking&Security > Reversing' 카테고리의 다른 글
리버싱_햇갈렸던 명령어 정리_by $0u1Tr33 (0) | 2019.10.21 |
---|