[Quiz] x86 Assembly 1

·2023년 1월 18일
0

System Hacking

목록 보기
7/10

end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가?

[Register]
rcx = 0
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10
0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d
0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c
0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00
=======================
[code]
1: mov dl, BYTE PTR[rsi+rcx]
2: xor dl, 0x30
3: mov BYTE PTR[rsi+rcx], dl
4: inc rcx
5: cmp rcx, 0x19
6: jg end
7: jmp 1

[code]
1: mov dl, BYTE PTR[rsi+rcx] // dl에 0x400000 + 0 의 값을 1byte 만큼 대입 -> 0x67
2: xor dl, 0x30 // 0x67 xor 0x30 >> 0x57
3: mov BYTE PTR[rsi+rcx], dl // xor 한 값을 0x400000 + 0 에 대입
4: inc rcx // rcx += 1
5: cmp rcx, 0x19 // rcx와 0x19 비교
6: jg end // 전자가 더 크면 end 로 점프 (rcx가 0x19가 될 경우 종료)
7: jmp 1 // 아니라면 코드 1로 점프 (반복)

57 65 6C 63 6F 6D 65 20 74 6F 20 61 73 73 65 6D 62 6C 79 20 77 6F 72 6C 64 21
-> Welcome to assembly world!

[추가 설명]

BYTE PTR[rsi+rcx] -> rsi+rcx가 가리키는 곳에서 1byte만 가져온다는 의미
WORD - 2byte
DWORD - 4byte
QWORD - 8byte

1: mov dl, BYTE PTR[rsi+rcx]

메모리의 0x400000에서부터 8개의 바이트를 dl에 넣는 게 아닌 1byte만 넣습니다
또한, dl 레지스터는 rdx 레지스터의 하위 1byte 크기를 가진 레지스터이기 때문에 1byte만 저장할 수 있습니다
->ㅍPTR[rsi+rcx]는 0x400000 + 0이므로 dl에는 0x67이 들어갑니다

inc rcx // rcx = 1
jmp 1 // 코드 1로

-> PTR[rsi+rcx]는 0x400000 + 1이 되므로 dl에는 0x55가 들어갑니다

0개의 댓글