[Reversing2] Handray

‍허진·2023년 3월 29일
0

hacking

목록 보기
6/7

handray.exe 파일을 c코드로 옮겨보자.

먼저 main 함수의 disassemble 결과다.

중간에 Same 함수를 호출하는 부분이 보인다.
Same 함수도 살펴보자.

먼저, 메인 함수에서는 0x4321을 저장하여 Same 함수의 인자로 넘긴다.

Same 함수를 보면, 전달받은 매개변수를 0과 비교하여 같지 않다면 al에 1을 저장하여 이를 ecx에 저장한다. 그리고 매개변수의 하위 2바이트만 남기고, 여기에 ecx 값을 더한다. 이 값을 레지스터에 그대로 저장하여 메인 함수에서도 사용하므로 함수값을 반환했다고 볼 수 있다.

이를 간단하게 C코드로 표현해보았다.

int Same(int n){
    short s;
    if(n != 0)
        s=1;
    
    n &= 0xff;
    n += s;
    return n;
}

그런 다음 다시 메인 함수로 돌아온다. 함수에서 rbp-0x4에 1을 저장하고 분기하여 이를 4보다 작은지 비교하고 있기에, 반복문이 사용되었다고 유추할 수 있다. 반복문 시작 시에 변수 i를 선언하고 4보다 작을 때까지 계속 반복하도록 한다.

다시 main + 41로 돌아간다. 이제 아까 반환된 값에 0xf로 and 연산을 하고, 이를 반복문의 i와 비교한다.

여기서 두 가지 경우로 나뉜다.

1) 같을 경우
이전에 반환된 값을 다시 불러오고, 만약 0보다 작다면 15를 더하고 크다면 그대로 유지한다. 그리고 4번 right shift 연산을 취한다.

2) 다를 경우
0x555555556004에 저장된 문자열을 출력한다.

"Are you sure?"을 출력하고 종료한다.

반복문 내부는 이렇게 구성되어 있다. i값을 1씩 증가시켜 가면서 반복을 진행하다가 반복문을 빠져나오면, 0x555555556012에 저장된 문자열을 출력한다.

업로드중..
"Goal!"을 출력하고 종료한다.

전체 코드는 다음과 같다.

#include <stdio.h>

int Same(int n){
    short s;
    if(n != 0)
        s=1;
    
    n &= 0xff;
    n += s;
    return n;
}

int main(){
    int a=0x4321;
    a=Same(a);

    for(int i=1; i<=4; i++){
        int b = a & 0xf;
        if(i == b){
            if(a<0)
                a+=0xf;
            a= a >>4;
        }
        else{
            printf("Are you sure?");
            return 0;
        }
    }
    printf("Goal!");
    return 0;
}
profile
매일 공부하기 목표 👨‍💻 

0개의 댓글