리버싱(4)
-
C언어 리버싱(3)
구조체와 API Call C언어 리버싱을 할 때 또 중요한 점은 구조체를 알아내는 것이다. 스택 포인터만 보고도 구조체의 크기나 코드에서 사용하는 API의 인자를 파악하는 것이 필요하다. 여기서는 STARTUPINFO와 PROCESS_INFORMATION 구조체를 사용해 새 프로세스를 생성하는 코드를 분석해보자!!! void RunProcess() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi, sizeof(pi)); //Start the child process. if(!CreateProcess(NULL, "MyChildProcess", NULL, NULL, FAL..
2022.10.27 -
C언어 리버싱(2)
if문 이번에는 조건문을 리버싱해보자. #include using namespace std; int Temp(int a) { int b = 1; if (a == 1) { a++; } else { b++; } return b; } int main(int argc, char* argv[]) { Temp(1); } 코드는 다음과 같다. push ebp mov ebp, esp push ecx mov dword ptr [ebp-4], 1 cmp dword ptr [ebp+8], 1 jnz short loc_40101C mov eax, [ebp+8] add eax, 1 mov [ebp+8], eax jmp short loc_401025 loc_40101C: mov ecx, [ebp-4] add ecx, 1 mov ..
2022.10.13 -
C언어 리버싱(1)
함수의 기본 구조 push ebp mov ebp, esp push ecx .... .... .... mov esp, ebp pop ebp retn 모든 함수는 위의 세줄로 시작하고 아래 세줄로 끝난다!! 함수의 호출규약 함수의 호출규약에는 대표적으로 _cdecl, _stdcall, _fastcall, _thiscall 총 네가지가 있다. 이 호출규약을 보면 지금 보는 이 함수의 역할이 무엇인지, 파라미터가 어떤 구조로 넘어가는지를 알 수 있다. 이것만 알아도 리버싱 50퍼는 한 것으로 볼 수 있다. 디스어셈블된 코드의 특징을 살펴 어떤 호출규약을 사용하는지 파악할 수 있다. _cdecl 방식 cdecl 호출방식의 주요 특징은 바로 이거다. 함수 호출문 바로 아래에 add esp, 8과 같은 어셈코드가 있..
2022.09.29 -
리버스 엔지니어링을 위한 어셈블리 기초
반 이상 써놨던걸 날려먹고 다시 쓴다^^ 참고로 내가 정리할 글들은 누군가가 보기 위함보다는 내 스스로 기초를 다지려는 목적이므로 정갈한 글은 아니다. 혹시나 읽게 되시는 분들은 이 점 참고하시길 바랍니다:) 리버스 엔지니어링이란? 소스코드를 역추적하는 것. EXE, DLL 등의 바이너리를 분석하여 원래의 소스코드에 어떤 라이브러리가 링크되었는지, 흐름이 어떤지 등을 파악하는 행위. 리버스 엔지니어링을 위한 기초 어셈블리 어셈블리어는 명령어+인자 형태를 기본으로 갖추고 있다. push 337이나 mov eax, 1 이런 형식으로 작성한다. 이 때 명령어 부분을 opcode, 인자 부분을 operand라고 하는데 operand는 웬만하면 1개 아니면 2개다. mov eax, 1처럼 operand가 2개일 ..
2022.09.27