reversing (reverse engineering) 5

rev-basic-1

Input: 출력 후 256글자를 stdin으로 input받은 후 sub_7FF6D8DC1000*를 호출 후 eax가 0이면 Wrong, eax가 0이 아니면 Correct이다. input한 값은 [rsp+138h+var_118h]에 저장되므로, sub_7FF6D8DC1000를 호출하기 전에 rcx에 주소가 저장된다. sub_7FF6D8DC1000를 보면 맨 처음 [rsp+buf]에 rcx값을 저장한다. 그 후 buf의 첫번째 바이트와 'C'를 비교, 같으면 초록색 루트를 따라가고 다르면 발간색 루트를 따라간다. 두번째 바이트와는 'o'를 비교 등등.. 0x14번째는 'r'값과 비교, 마지막 0x15번째 바이트에는 0x00인지 확인 후, 모두 비교값이 맞을 때만 eax에 1이 저장되어 반환된다. 해당 문..

Calling Convention (함수호출 규약)

함수 호출 규약은 함수의 호출 및 반환에 대한 약속이다. 컴파일러는 지원하는 호출 규약 중, CPU 아키텍처에 적합한 것을 선택한다. cdecl: x86아키텍처는 레지스터의 수가 적으르모, 스택을 통해 인자를 전달한다. SYSV: SYSV(SYSTEM V)에서 정의한 함수 호출 규약은 다음의 특징을 같는다. (x86-x64아키텍처) 1. 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9에 순서대로 저장하여 전달한다. 더 많은 인자를 사용해야 할 때는 스택을 추가로 이용한다. 2. Caller에서 인자 전달에 사용된 스택을 정리한다. 3. 함수의 반환 값은 RAX로 전달합니다. 해당 내용은 https://dreamhack.io/learn/54#13에서 확인할 수 있다.

rev-basic-0

1. 프로그램 파악 os: windows main: int __cdecl main(int argc, const char **argv, const char **envp) (인자와 환경변수를 받지만 이 프로그램은 인자와 환경변수를 사용하지 않을 뿐더러 우리도 인자와 환경변수를 전달하지 않는다.) 2. 흐름 파악 printf -> scanf -> compareFunc 이후 eax가 0이면 Correct !0이면 Wrong이다. 3. 요구 파악 compareFunc함수 결과 eax가 0이 되게 하는 조건을 맞추자. 4. 함수 파악-compareFunc strcmp함수가 inputStr의 주소와 Str2의 주소를 전달받는다. 반환값는 eax에 저장된다. 우리가 입력한 문자열과 Str2의 문자열을 비교하고 같다면 ..