rev-basic-0과 동일하게 correct 문자열을 검색하여 찾아간다.
마찬가지로 test eax, eax 연산에서 eax가 0이라면 eax끼리 and 연산 시 0이 반환되므로 ZF 플래그는 1로 세팅되어 바로 아래의 je chall1.7FF6F1E013B6가 실행될 것이다. 그럼 wrong가 출력된다. 따라서 eax는 0이 아니어야 한다. eax는 test eax, eax 어셈블리 코드 바로 위의 call chall11.7FF6F1E01000의 결괏값이 저장되기에 더블 클릭하여 이동한다.
어셈블리 코드는 다음과 같다. 우선 이 코드는 문자열을 앞에서부터 한 글자씩 비교하는 코드이다.
첫 글자 C 비교과정을 보면 rcx의 값이 rsp+8 주소로 이동한다. rcx는 문자열의 주소값일 것이다. rsp+8에는 문자열의 주소값이 계속 위치한다. mov eax,1로 eax에 1이 저장되고 imul rax,rax,0는 rax에 0이 저장된다. imul a, b, n이면 a=b*n 형식으로 실행된다. mov rcx, qword pt ss:[rsp+8] 결과 rsp+8에 있던 문자열의 주소가 rcx에 저장된다. movzx eax, byte ptr ds:[rcx+rax] 결과 문자열 첫 글자가 eax에 저장된다. cmp eax, 43은 eax- 0x43 연산을 하여 결과값이 0이면 ZF를 1로 세팅한다. 만약 같았다면 je chall1.7FF6F1E01023가 실행되어 다음 문자를 비교할 것이다. 만약 다르다면 xor eax, eax 다음 jmp chall1.7FF6F1E0128E가 실행되어 종료하게 된다. 따라서 옆에 한 글자씩 출력되는 문자들이 FLAG가 된다.
DH{Compar3_the_ch4ract3r}
'dreamhack > Reverse Engineering' 카테고리의 다른 글
rev-basic-3 (0) | 2023.02.14 |
---|---|
rev-basic-2 (0) | 2023.02.13 |
rev-basic-0 (0) | 2023.02.12 |