SONOTRI
  • Quiz: x86 Assembly 1
    2025년 03월 23일 02시 32분 30초에 업로드 된 글입니다.
    작성자: SONOTREE

    Q1.

    레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rbx = 0x401A40
    
    =================================
    
    [Memory]
    0x401a40 | 0x0000000012345678
    0x401a48 | 0x0000000000C0FFEE
    0x401a50 | 0x00000000DEADBEEF
    0x401a58 | 0x00000000CAFEBABE
    0x401a60 | 0x0000000087654321
    
    =================================
    
    [Code]
    1: mov rax, [rbx+8]
    2: lea rax, [rbx+8]

     

    내 풀이) - 정답

    rbx는 메모리 주소를 저장하기 위해 사용되는 (범용)레지스터이다. 코드의 1번째 라인을 해석해보면 "rbx+8의 주소에 저장된 값을 rax에 대입시켜라"라고 이해할 수 있다. 현재 rbx+8의 주소는 0x401a48이고 여기에 있는 값은 0x0000000000C0FFEE이므로 rax에는 0x0000000000C0FFEE라는 값이 저장될 것이다.


    Q2.

    Code를 2까지 실행했을 때, rax에 들어있는 값은?

    [Register]
    rbx = 0x401A40
    
    =================================
    
    [Memory]
    0x401a40 | 0x0000000012345678
    0x401a48 | 0x0000000000C0FFEE
    0x401a50 | 0x00000000DEADBEEF
    0x401a58 | 0x00000000CAFEBABE
    0x401a60 | 0x0000000087654321
    
    =================================
    
    [Code]
    1: mov rax, [rbx+8]
    2: lea rax, [rbx+8]

     

    내 풀이) - 정답

    lea는 mov와 비슷한 의미로, 메모리의 값은 읽어오지 않고 주소만 계산해서 저장하는 명령어이다. 코드의 2번째 라인을 해석해보면 "rbx+8의 주소값을 rax에 저장해라"라고 이해할 수 있다. rbx+8의 주소값은 0x401a48이므로 rax에는  0x401a48값이 저장되어있을 것이다.


    Q3. 

    레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rax = 0x31337
    rbx = 0x555555554000
    rcx = 0x2
    
    =================================
    
    [Memory]
    0x555555554000| 0x0000000000000000
    0x555555554008| 0x0000000000000001
    0x555555554010| 0x0000000000000003
    0x555555554018| 0x0000000000000005
    0x555555554020| 0x000000000003133A
    
    ==================================
    
    [Code]
    1: add rax, [rbx+rcx*8]
    2: add rcx, 2
    3: sub rax, [rbx+rcx*8]
    4: inc rax

     

    내 풀이) - 정답

    add는 산술 연산을 진행하는 명령어이다. rcx*8=10, rbx+10=0x555555554010이다. 따라서 0x555555554010 주소에 있는 값을 rax에 더하라는 의미가 되므로, 0x0000000000000003 + 0x31337(rax의 값) = 0x3133A 이다.

    [rbx+rcx*8]을 보고 "뭔소리지...?"라고 생각할 수 있지만, 우리가 아는 사칙연산을 그대로 적용해서 풀면 된다.

    Q4.

    Code를 3까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rax = 0x31337
    rbx = 0x555555554000
    rcx = 0x2
    
    =================================
    
    [Memory]
    0x555555554000| 0x0000000000000000
    0x555555554008| 0x0000000000000001
    0x555555554010| 0x0000000000000003
    0x555555554018| 0x0000000000000005
    0x555555554020| 0x000000000003133A
    
    ==================================
    
    [Code]
    1: add rax, [rbx+rcx*8] //rax=0x3133A
    2: add rcx, 2
    3: sub rax, [rbx+rcx*8]
    4: inc rax

     

    내 풀이) - 정답

    먼저 2번째 라인을 계산해보면, "rcx에 2를 더해라"이므로 rcx는 0x2+0x2=4가 된다.

    이제 3번째 라인을 계산해보자. [rbx+rcx*8]을 계산하면 32(Base 10)=20(Hex), 0x555555554000 + 0x20= 0x555555554020이다. 따라서 0x555555554020주소의 값 0x000000000003133A를 rax의 값에서 빼면 된다. 즉 rax-[rbx+rcx*8]의 값 = 0x3133A - 0x000000000003133A = 0이 정답이다(빼는 두 값이 같은 상황).


    Q5.

    Code를 4까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rax = 0x31337
    rbx = 0x555555554000
    rcx = 0x2
    
    =================================
    
    [Memory]
    0x555555554000| 0x0000000000000000
    0x555555554008| 0x0000000000000001
    0x555555554010| 0x0000000000000003
    0x555555554018| 0x0000000000000005
    0x555555554020| 0x000000000003133A
    
    ==================================
    
    [Code]
    1: add rax, [rbx+rcx*8] //rax=0x3133A
    2: add rcx, 2
    3: sub rax, [rbx+rcx*8] //rax=0
    4: inc rax

     

    내 풀이) - 정답

    inc는 값을 1 올리는 명령어이다. 따라서 rax의 값이 1 증가한 1이 된다.


    Q6.

    레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rax = 0xffffffff00000000
    rbx = 0x00000000ffffffff
    rcx = 0x123456789abcdef0
    
    ==================================
    
    [Code]
    1: and rax, rcx
    2: and rbx, rcx
    3: or rax, rbx

     

    내 풀이) - 정답

    rax와 rcx를 2진수로 나타내면 다음과 같다. 따라서 rax에 0x1234567800000000값이 저장된다.

    rax = 0b 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000
    rcx = 0b 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0000
    
    // 정답
    and = 0b 0001 0010 0011 0100 0101 0110 0111 1000 0000 0000 0000 0000 0000 0000 0000 0000
    and = 0x1234567800000000

    Q7

    Code 2까지 실행했을 때, rbx에 저장된 값은?

    [Register]
    rax = 0xffffffff00000000
    rbx = 0x00000000ffffffff
    rcx = 0x123456789abcdef0
    
    ==================================
    
    [Code]
    1: and rax, rcx
    2: and rbx, rcx
    3: or rax, rbx

     

    내 풀이) - 정답

    rbx와 rcx를 2진수로 나타내면 다음과 같다.

    정확히 표현하면 0x000000009ABCDEF0이다. 따라서 rbx에 0x000000009ABCDEF0이 저장된다.

    rbx = 0b 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111
    rcx = 0b 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0000
    
    //정답
    and = 0b 0000 0000 0000 0000 0000 0000 0000 0000 1001 1010 1011 1100 1101 1110 1111 0000
    and = 0x 9ABCDEF0

    Q8

    Code를 3까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rax = 0xffffffff00000000
    rbx = 0x00000000ffffffff
    rcx = 0x123456789abcdef0
    
    ==================================
    
    [Code]
    1: and rax, rcx
    2: and rbx, rcx
    3: or rax, rbx

     

    내 풀이) - 정답

    현재  rax에 0x1234567800000000, rbx에 0x000000009ABCDEF0이 저장되어있다. 이 값들로 or 연산을 진행하면 다음과 같다

    rax=0x1234567800000000
    rbx=0x000000009ABCDEF0
    
    rax=0b1001000110100010101100111100000000000000000000000000000000000
    rbx=0b0000000000000000000000000000010011010101111001101111011110000
    
    //정답 
    or=0b1001000110100010101100111100010011010101111001101111011110000
    or=0x123456789ABCDEF0

    Q9.

    레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rax = 0x35014541
    rbx = 0xdeadbeef
    
    ==================================
    
    [Code]
    1: xor rax, rbx
    2: xor rax, rbx
    3: not eax

     

    내 풀이) - 정답

    rax와 rbx를 xor연산하고, 그 값이 rax에 저장된다. 따라서 rax에는 0xEBACFBAE가 저장될 것이다.


    Q10.

    Code를 2까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rax = 0x35014541 //Code 1까지 실행했을 때 rax=0xEBACFBAE
    rbx = 0xdeadbeef
    
    ==================================
    
    [Code]
    1: xor rax, rbx
    2: xor rax, rbx
    3: not eax

     

    내 풀이)

    rax=0xEBACFBAE와 rbx=0xdeadbeef를 xor 연산한 값을 rax에 저장하면 된다. 따라서 0x35014541이 rax에 저장될 것이다. code 1의 실행 결과 rax의 값이 변경되었다는 것만 인지하면 된다.


    Q11.

    Code를 3까지 실행했을 때, rax에 저장된 값은?

    [Register]
    rax = 0x35014541 //Code 2까지 실행했을 때 rax=0x35014541
    rbx = 0xdeadbeef
    
    ==================================
    
    [Code]
    1: xor rax, rbx
    2: xor rax, rbx
    3: not rax

     

    내 풀이) - 정답

    rax를 2진수로 변환한 뒤, not 연산을 진행하고 다시 16진수로 바꾸는 과정은 아래와 같다

    rax=0x35014541
    rax=0b 0011 0101 0000 0001 0100 0101 0100 0001
    
    //정답
    not=0b 1100 1010 1111 1110 1011 1010 1011 1110
    not=0x CAFEBABE

     

    'Dreamhack > Reverse Engineering' 카테고리의 다른 글

    Exercise: Helloworld  (0) 2025.03.24
    Quiz: x86 Assembly 2  (0) 2025.03.23
    x86 Assembly: Essential Part(2) [★]  (0) 2025.03.23
    x86 Assembly: Essential Part(1)  (0) 2025.03.22
    Background: Windows Memory Layout  (0) 2025.03.18
    댓글