강의정리/Z0FCourse_Re 14

[x86-64] 루프 (반복문), 디컴파일러의 do-while 루프

Z0FCourse_ReverseEngineering/Chapter 5 - BasicReversing/5.4 Loops.md For Loop - While 루프 역시 형태가 비슷합니다. MOV EDX, EBX LEA RCX, QWROD PTR DS:[0x7FF7A85A9D90] ; const char* format = "INDEX= %D\n" CALL ; printf INC EBX CMP EBX, 0XA ; A:'\n' JL testing.7FF7A8591080 루프를 식별하는 가장 빠른 방법은 인덱스 / 반복 카운터를 찾는 것입니다. 위의 예에서 우리는 EBX가 XOR EBX, EBX로 제로화되고 있음을 알 수 있습니다. 이것은 특별한 것은 아니지만 조금 내려 가면 INC EBX로 EBX가 증가하고 있음..

[x64] C++ 코드 리버싱할 때, printf와 stdout의 차이

Z0FCourse_ReverseEngineering/Chapter 5 - BasicReversing/5.3 HelloWorld.md C++ 코드 리버싱할 때, std::cout 함수 호출시, C함수의 printf와 모양이 조금 다른데, 이것은 우리가 정의한 함수가 아닌 라이브러리의 함수를 호출하는 것이기 때문이다. 그리고 한번만 호출하면 인라인 기능이 작동된다. (컴파일러가 최적화 시킴) 두번째 호출로 KernelBaseDLLInitialize 라이브러리 함수를 호출하는 것을 확인할 수 있는데, 이것은 std::endl (\n 개행)기능을 호출한 것이다. 프로그램에서 std::cout이 두번 이상 호출되면 인라인 기능은 작동하지 않기 때문에 printf와 유사한 형태로 보인다. 인라인 기능의 예시 최적화..

[x64] fastcall과 호출 규약

참고 (공통: 함수 매개면수는 오른쪽에서 왼쪽 순으로 스택 위로 푸시된다) - cdecl: 일반적으로 x86 C 컴파일러의 기본 호출 규약이다. - stdcall: 마이크로소프트 Win32 API 및 오픈 왓콤 C++의 표준 호출 규약이다. - fastcall: x64 Windows의 호출 규칙이다. 호출규약에 대해 더 많은 정보 필요한 경우 아래 참고 https://docs.microsoft.com/ko-kr/cpp/build/x64-software-conventions?view=vs-2019 https://docs.microsoft.com/ko-kr/cpp/build/x64-calling-convention?view=vs-2019 https://en.wikibooks.org/wiki/X86_Disas..