| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 리버싱
- Calling Convention
- crackme
- x32
- Reversing
- x64
- 리치헤더
- Dos Stub
- RVA
- image section header
- __cdecl
- stack frame
- ABI
- Python
- Programmers
- CodeEngn
- __fastcall
- 함수 호출 규약
- Rich Header
- 프로그래머스
- rev
- 실행파일
- __vectorcall
- 코드엔진
- Image dos header
- 크랙미
- __stdcall
- 파이썬
- pe format
- 32bit
- Today
- Total
목록Reversing (33)
kj0on
0. 유래라이브러리는 여러 프로그램에서 공통으로 재사용하려고 묶어 둔 코드의 집합이다. 초창기엔 물리 미디어(천공 카드, 자기선, 펀치 테이프)에 저장된 재사용 가능한 루틴의 모음이었고, 오늘날엔 정적/동적 바이너리, 패키지, 모듈, 프레임워크, 표준 라이브러리 등으로 발전했다. 0-1. 타임라인 0-1-1. 1837 ~ 1889: 해석 기관Each formula would require its own set of cards, and by degrees the engine would have a library of its own.찰스 배비지의 해석기관(The Analytical Engine)의 설계는 연산(operations) 카드와 숫자(cards of numbers)를 분리해 조합하는 방식을 전제했고..
1. 정의 ABI (Application Binary Interface)는 어플리케이션과 운영체제 또는 컴파일된 코드 간의 상호작용 방식을 정의한 이진 수준의 규약이다. 쉽게 말해, 컴파일된 바이너리들이 서로 호환되도록 하는 규칙 모음을 뜻한다.2. x64 ABI규칙역할필수 규칙(ABI)조건부 규칙스택 정렬 규칙Alignment(정렬)프롤로그, 에필로그을 제외한 모든 구간에서 RSP ≡ 0 (mod 16)을 유지해야 한다.Leaf 함수는 정렬을 다시 맞출 필요가 없다.이후의 단계에서 정렬이 보장되어 있는 경우는 제한적으로 정렬을 유지하지 않아도 된다.섀도우 스페이스 규칙Call Setup(호출 준비)Caller(호출자)는 언제나 32byte Shadow Space를 확보한 상태에서 함수를 호출해야 한다...
1. 정의 ABI (Application Binary Interface)는 어플리케이션과 운영체제 또는 컴파일된 코드 간의 상호작용 방식을 정의한 이진 수준의 규약이다. 쉽게 말해, 컴파일된 바이너리들이 서로 호환되도록 하는 규칙 모음을 뜻한다.2. x32 ABI규칙역할필수 규칙(ABI)조건부 규칙스택 정렬 규칙Alignment (정렬)모든 구간에서 ESP ≡ 0 (mod 4)를 유지해야 한다.16byte 정렬을 요구하는 SIMD 명령을 사용 할 경우, 함수 내부에서 추가 정렬을 보장해야 한다.레지스터 보존 규칙Register Save (레지스터 보존)Callee(피호출자)에서 비휘발성 레지스터를 사용했다면 함수 내부에서 원래 값으로 복구해야 한다.비휘발성 레지스터를 사용하지 않았다면 저장, 복구 코드가..
0. 64비트 스택 프레임 (64bit Stack Frame)64비트 스택프레임에 대한 자세한 설명은 https://kj0on.tistory.com/43 참고1. 정의함수와 호출자 간에 인수를 전달하고 값을 반환하기 위한 규칙 프로시저(함수) 호출 시 인자를 어디에 어떤 순서로 전달하고, 누가 스택을 정리하며, 레지스터를 보존할지, 어느 레지스터로 값을 반환할지 등을 규정한 저수준 인터페이스 계약이다. 컴파일러, 언어, OS, CPU가 서로 다른 오브젝트 코드를 같은 ABI 안에서 링크 및 호출할 수 있게 해준다.2. Caller(호출자)와 Callee(피호출자)Caller는 함수를 호출하는 쪽이고, Callee는 호출된 함수이다. Caller는 인자를 준비하고 제어를 Callee에게 넘기며, Calle..
0. x64 ABI x64 ABI는 https://kj0on.tistory.com/47 참고1. 정의 스택 프레임(Stack Frame)은 함수가 호출될 때 스택에 형성되는 하나의 논리적 메모리 블록으로, 해당 함수 실행에 필요한 정보를 일시적으로 보관해 주는 단위이다. 32비트 때와 유사한 목적을 가지지만, 64비트 함수 호출 규약과 CPU 설계 변화에 맞추어 구조와 규칙이 달라졌다.2. 함수 프레임 (Function Frame)함수의 시작에 붙는 패턴은 프롤로그(prologue), 끝 부분에 붙는 패턴은 에필로그(epilogue)로 구분할 수 있으며, 직접 작성한 코드의 로직은 두 패턴 사이의 바디(body)에 위치하게 된다. 이러한 공통된 틀은 컴파일 단계에서 컴파일러가 자동으로 삽입한다. 덕분에 ..
0. 32비트 스택 프레임 (32bit Stack Frame)32비트 스택프레임에 대한 자세한 설명은 https://kj0on.tistory.com/41 참고1. 정의함수와 호출자 간에 인수를 전달하고 값을 반환하기 위한 규칙 프로시저(함수) 호출 시 인자를 어디에 어떤 순서로 전달하고, 누가 스택을 정리하며, 레지스터를 보존할지, 어느 레지스터로 값을 반환할지 등을 규정한 저수준 인터페이스 계약이다. 컴파일러, 언어, OS, CPU가 서로 다른 오브젝트 코드를 같은 ABI 안에서 링크 및 호출할 수 있게 해준다. https://learn.microsoft.com/ko-kr/cpp/cpp/calling-conventions?view=msvc-1702. Caller(호출자)와 Callee(피호출자)Call..
0. x32 ABI x32 ABI는 https://kj0on.tistory.com/46 참고1. 정의스택 프레임(Stack Frame)은 함수가 호출될 때 스택에 형성되는 하나의 논리적 메모리 블록으로, 해당 함수 실행에 필요한 정보를 일시적으로 보관해 주는 단위이다.2. 함수 프레임 (Function Frame)#include int fun3(void) { return 3;}int fun2(void) { fun3(); return 2;}int fun1(void) { fun2(); return 1;}int main(void) { printf("Hello World!\n"); // Hello World! fun1(); return 0;} 위 이미지는 main→printf→fun1→fun2→fun3로 깊어졌..
0. 실행환경 0-1. 운영체제 (1)0-2. 툴 (3)1. 파일 password : codeengn2. 프로그램 동작계산기 프로그램이 실행된다.3. Detect It Easy32비트 실행파일, UPX 패킹 된 것을 확인할 수 있다. Visual Studio .NET 2002~2003 링커로 추정된다.4. 분석UPX 언패킹을 해준다. OEP를 찾는 문제이기 때문에 상세 분석은 하지 않았다.5. 풀이언패킹 후 EP를 살펴보면 0x01012475 인 것을 알 수 있다.
0. 실행환경 0-1. 운영체제 (1)0-2. 툴 (2)1. 파일 password : codeengn2. 프로그램 동작실행 시 Serial을 입력하는 창과 Check 버튼을 볼 수 있다. Serial이 일치하지 않는 경우 에러 메시지가 출력된다.3. Detect It Easy32비트 실행파일, 델파이로 작성된 프로그램인 것을 알 수 있다.4. 분석실행하다 보면 간단한 반복문이 나타난다. dl에 0x02를 넣고 밑에서 dec로 값을 0x01감소한다. 이후 jne로 조건부 분기가 이루어 진다. 따라서 총 2번 반복된다. 연산을 해주는 위치를 보면 앞에서 lstrcat해준 문자열이다. 빨간색 네모칸의 값에 add 연산을 해주는 코드다. 반복문을 모두 실행하고 나면 최종적으로 값에 2가 더해진다. 해당 값은 C..
1. 정의표준정의ISO/IEC 15145:1997(en), 2.1.10To transform source code into dictionary definitions.ISO/IEC 20060:2010(en), 3.9transform higher-level specifications of software and/or data into executable formISO/IEC 2382:2015(en), 2121864translate all or part of a program expressed in a high-level language into a program expressed in an intermediate language, an assembly language, or a machine language..