목록리버싱 기초 (76)
Self-Improvement
함수 호출 규약 종류 32bit cdecl (함수 호출 종료 후 스택 정리) stdcall (호출된 함수에서 스택 정리) fastcall (ECX, EDX 레지스터와 스택 사용) 64bit fastcall - 리눅스에서는 EDI, ESI, EDX, ECX, R8, R0 레지스터, 실수는 XMM0 ~ XMM7 레지스터 - 윈도우세너느 ECX, EDX, R8, R9, 실수는 XMM0 ~ XMM4 레지스터 Caller(호출자), Callee(피호출자) ex) main()함수에서 printf()함수를 호출했다면 Caller는 main()이고, Callee는 printf()가 된다. Cdecl cdecl 방식은 주로 C언어에서 사용되는 방식이며, Caller에서 스택을 정리 한다. 1 2 3 4 5 6 7 8 9..
*MOV옵코드 MOV는 단지 값을 넣는 역할을 한다. 예를 들면 MOV eax, 1은 eax에 1을 넣는 코드가 되고, MOV ebx, ecx는 ebx에 ecx를 넣는 코드가 된다. *LEALEA는 MOV와 다르게 단순하다. MOV는 값을 가져오는 것이라면 LEA는 주소를 가져온다. 따라서 LEA는 가져올 src 오퍼랜드가 주소라는 의미로 대부분 []로 둘러싸여 있다. *예시esi : 0x401000*esi : 5640ec83esp+8 : 0x13ff40*(esp+8) : 33 1. lea eax, dword ptr ds:[esi]= esi가 0x401000이므로 eax에는 0x401000이 들어온다. 2. mov eax, dword ptr ds:[esi]= esi가 0x401000이므로 eax에는 0x..
*부울 연산자 - AND 설명 목적지와 소스 데이터를 부울 AND 연산 후 목적지에 저장 예시 명령어 : AND EAX, ECX 연산 전 : EAX(FFFFFFF0), ECX(11100033) 연산 후 : EAX(11100033), ECX(11100033) - OR 설명 목적지와 소스 데이터를 부울 OR 연산 후 목적지에 저장 예시 명령어 : OR EAX, ECX 연산 전 : EAX(FFFFFFF0), ECX(11100033) 연산 후 : EAX(FFFFFFF3), ECX(11100033) - XOR 설명 목적지와 소스 데이터를 배타적 OR 연산(다르면 1, 같으면 0)후 목적지에 저장 예시 명령어 : XOR EAX, ECX 연산 전 : EAX(FFFFFFF0), ECX(FFF000FF) 연산 후 : E..
*데이터 이동 - MOV : 데이터 복사 설명 MOV 목적지, 소스 : 소스의 내용을 목적지로 복사한다 예시 명령어 : MOV EAX, ECX 연산 전 : EAX(00400020), ECX(00400030) 연산 후 : EAX(00400030), ECX(00400030) - MOVZX : 0을 확장하여 데이터 복사 설명 소스의 내용을 목적지로 복사하고, 목적지 나머지 부분을 0으로 채운다. 목적지에 32bits 레지스터가 온다면 소스에는 16bits 레지스터가 온다. 예시 명령어 : MOVZX EAX, CX 연산 전 : EAX(89ABCDEF), ECX(12345678) 연산 후 : EAX(00005678), ECX(12345678) - MOVSX : 부호를 확장하여 데이터 복사 설명 소스의 내용을 목적..
*어셈블리어 기계어(101010)를 묶어서 의미가있는 형태로 표시한 저수준의 프로그래밍 언어이다. 디스어셈블러 : 기계어 0 과 1을 어셈블리 코드로 변환하는 툴 gdb : GNU 디버거※각 CPU 마다 고유 어셈블리어 존재 *어셈블리 구성 윈도우 : Intel 문법 사용 ex) add (Destination) (Source) 리눅스 : AT&T 문법 사용 ex) add (Source) (Destination) *어셈블리 명령어 형식 1. opcode ex) std 2. opcode operand1 ex) push eax 3. opcode operand1, operand2 ex) add 10, eax 4. opcode operand1, operand2, operand3 ex) shld 16, edx, e..
*리버싱 (= 리버스 엔지니어링) 리버싱은 리버스 + 엔지니어링의 합성어인 리버스 엔지니어링의 줄임이며 이진코드로 되어 있는 실행 파일을 분석하려는 일련의 행위이며 소트트웨어를 분석하고 동작을 해명해가는 것을 리버스 엔지니어링이라 한다. *관점 보안적 관점 - 소프트웨어를 개발 후 개발된 제품에 대한 평가 - 백신업체에서 바이러스 또는 악성코드를 분석 후 백신을 만들기 위해 사용 - 해커들이 악의적인 목적으로 분석하여 제작 하는 등 개발적 관점 - 소프트웨어 개발시 필요한 지식을 습득하기 위해 다른 소프트웨어를 분석하는 것 *분석 방법 종류 정적 분석 : 대상 프로그램을 실행하지 않고 분석하는 방법이며 전체적으로 넒게 분석시 사용한다. 동적 분석 : 대상 프로그램을 실행하며 분석하는 방법이며 일부분을 집..