마지막 질문 1번 코드 피연산자 관련 질문
  1. mov dl, BYTE PTR[rsi+rcx]는 '주소인 BYTE PTR[rsi+rcx]'의 값을 dl에 대입하라는 명령어 맞나요?
  2. BYTE PTR[rsi+rcx]는 '주소인 rsi+rcx'의 값을 1바이트 만큼 참조하라는 명령어 맞나요? 맞다면 참조가 무엇이고
    rsi+rcx인 0x400000의 값 중에 무엇을 참조하라는 건가요..
    제 머리로는 답이 안 나올 것 같네요
#리버싱 #배경지식
작성자 정보
답변 2
avatar
믕믕이부하
대표 업적 없음

일단은 이해하신 내용은 맞습니다. 참조라는 것은 해당 메모리 주소에 존재하는 값을 이용하겠다는 의미입니다. 0x400000 이라는 메모리 주소에는 여러 값이 들어있는 것 처럼 보이지만 실제로 0x400000 이라는 메모리 주소에 들어 있는 값은 특정 1 바이트 값이고 그 다음 값은 0x400001의 값 입니다.

2022.03.06. 14:35
세르베
강의 수강: 10

mov dl, BYTE PTR[0x400000]
xor dl, 0x30
mov BYTE PTR[rsi+rcx], dl

  1. mov dl, BYTE PTR[rsi+rcx] 는 다음과 같은 과정으로 이루어집니다.
    1. rsi+rcx = 0x400000 대입
    2. mov dl, BYTE PTR[0x400000]
    3. BYTE PTR [0x400000]의 의미는 0x400000주소에 들어있는(PTR [0x400000]) 값 1바이트(BYTE)만큼 가져오라는 뜻입니다. 즉 (0x67)입니다. (아래참고)
    4. 따라서 정리하면 mov dl, 0x67 이 됩니다.
    5. dl에 0x67을 대입합니다.
      2.xor dl, 0x30 는 다음과 같은 과정으로 이루어집니다.
    6. 구글에 xor 계산기를 검색합니다.
    7. https://xor.pw/ 가 나오면 들어가줍니다.
    8. 여기서 dl이 0x67 이므로 0x67과 0x30을 넣어줍니다.
    9. 결과값 0x57을 얻어냅니다. 이 값은 https://ko.wikipedia.org/wiki/ASCII 아스키 코드 표를 참고하면 W임을 알수 있습니다.
  2. mov BYTE PTR[rsi+rcx], dl 은 다음과 같은 과정으로 이루어집니다.
    1. dl에는 0x57이 담겨있습니다.
    2. mov BYTE PTR[rsi+rcx], 0x57 이 됩니다. 이제 rsi+rcx값도 0x400000으로 바꿔봅시다.
    3. mov BYTE PTR[0x400000], 0x57이 됩니다. 여기서 BYTE PTR[0x400000], 0x57을 해석해봅시다.
    4. 0x400000주소에 들어있는 (PTR[0x400000])값 1바이트(BYTE)에 0x57을 넣으라는 뜻입니다.
    5. 즉 0x400000에 0x57을 넣게됩니다.
  3. 결과적으로 0x400000에 있는 값을 가져와서 0x30과 XOR연산을 한뒤 그 결과값을 0x400000에 다시 넣어주는 코드가 됩니다.
    inc rcx
    cmp rcx, 0x19
  4. 그 뒤에 inc rcx와 cmp rcx, 0x19는 rcx값을 1늘리고 0x19와 비교하는 것입니다. 즉 0x19번 만큼 반복한다는 것이죠.

번외) 혹시 각 바이트별 주소 보기 힘드실까봐 아래에 적어놓았습니다.

0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10

각 바이트의 주소는 다음과 같습니다.
0x400000 = 0x67
0x400001 = 0x55
0x400002 = 0x5c
0x400003 = 0x53
0x400004 = 0x5f
0x400005 = 0x5d
0x400006 = 0x55
0x400007 = 0x10

2022.03.22. 00:40
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기