- Quiz: x86 Assembly 12025년 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 다음글이 없습니다.이전글이 없습니다.댓글