마지막 질문 1번 코드 피연산자 관련 질문
- mov dl, BYTE PTR[rsi+rcx]는 '주소인 BYTE PTR[rsi+rcx]'의 값을 dl에 대입하라는 명령어 맞나요?
- BYTE PTR[rsi+rcx]는 '주소인 rsi+rcx'의 값을 1바이트 만큼 참조하라는 명령어 맞나요? 맞다면 참조가 무엇이고
rsi+rcx인 0x400000의 값 중에 무엇을 참조하라는 건가요..
제 머리로는 답이 안 나올 것 같네요
#리버싱
#배경지식
작성자 정보
답변
2
믕믕이부하
대표 업적 없음
일단은 이해하신 내용은 맞습니다. 참조라는 것은 해당 메모리 주소에 존재하는 값을 이용하겠다는 의미입니다. 0x400000 이라는 메모리 주소에는 여러 값이 들어있는 것 처럼 보이지만 실제로 0x400000 이라는 메모리 주소에 들어 있는 값은 특정 1 바이트 값이고 그 다음 값은 0x400001의 값 입니다.
세르베
강의 수강: 10
mov dl, BYTE PTR[0x400000]
xor dl, 0x30
mov BYTE PTR[rsi+rcx], dl
- mov dl, BYTE PTR[rsi+rcx] 는 다음과 같은 과정으로 이루어집니다.
- rsi+rcx = 0x400000 대입
- mov dl, BYTE PTR[0x400000]
- BYTE PTR [0x400000]의 의미는 0x400000주소에 들어있는(PTR [0x400000]) 값 1바이트(BYTE)만큼 가져오라는 뜻입니다. 즉 (0x67)입니다. (아래참고)
- 따라서 정리하면 mov dl, 0x67 이 됩니다.
- dl에 0x67을 대입합니다.
2.xor dl, 0x30 는 다음과 같은 과정으로 이루어집니다. - 구글에 xor 계산기를 검색합니다.
- https://xor.pw/ 가 나오면 들어가줍니다.
- 여기서 dl이 0x67 이므로 0x67과 0x30을 넣어줍니다.
- 결과값 0x57을 얻어냅니다. 이 값은 https://ko.wikipedia.org/wiki/ASCII 아스키 코드 표를 참고하면 W임을 알수 있습니다.
- mov BYTE PTR[rsi+rcx], dl 은 다음과 같은 과정으로 이루어집니다.
- dl에는 0x57이 담겨있습니다.
- mov BYTE PTR[rsi+rcx], 0x57 이 됩니다. 이제 rsi+rcx값도 0x400000으로 바꿔봅시다.
- mov BYTE PTR[0x400000], 0x57이 됩니다. 여기서 BYTE PTR[0x400000], 0x57을 해석해봅시다.
- 0x400000주소에 들어있는 (PTR[0x400000])값 1바이트(BYTE)에 0x57을 넣으라는 뜻입니다.
- 즉 0x400000에 0x57을 넣게됩니다.
- 결과적으로 0x400000에 있는 값을 가져와서 0x30과 XOR연산을 한뒤 그 결과값을 0x400000에 다시 넣어주는 코드가 됩니다.
inc rcx
cmp rcx, 0x19 - 그 뒤에 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