프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 아스키 문자로 변환하는 문제이다.
레지스터는 카운터로 사용하는 rcx, 추가적인 연산에 사용하는 rdx 레지스터 그리고 문자열 출발지 주소를 저장하는 레지스터 rsi는 0x400000를 가지고 있다.
[code]를 살펴보면
1: mov dl, BYTE PTR[rsi+rcx]
BYTE(1 byte)의 [rsi+rcx]의 메모리 값을 dl에 대입하라
2: xor dl, 0x30
dl의 값과 0x30을 xor 연산하여 dl에 대입하라
3: mov BYTE PTR[rsi+rcx], dl
[rsi+rcx]의 메모리 값에 dl를 대입하라
4: inc rcx
rcx의 값을 1 더하라
5: cmp rcx, 0x19
rcx의 값과 0x19(10진수 25)와 비교하라
6: jg end
rcx가 0x19보다 크다면 jg(ZF=0 & SF=OF) end로 점프하라
7: jmp 1
jg가 실행되지 않으면 code 1로 점프하라
즉, 프로그래밍에서의 배열에서 rsi[rcx]와 같은 형태이며 rcx가 1씩 증가하며 25보다 커지면 end가 되는 구조이다.
Memory에서 16진수를 10진수 2진수로 계산 해보면
;16진수 | 10진수 //2진수
0x400000
0x67 | 103 = 64+32+4+2+1 // 0110 0111
0x55 | 85 = 64+16+4+1 // 0101 0101
0x5c | 92 = 64+16+8+4 // 0101 1100
0x53 | 83 = 64+16+2+1 // 0101 0011
0x5f | 95 = 64+16+8+4+2+1 // 0101 1111
0x5d | 93 = 64+16+8+4+1 // 0101 1101
0x55 | 85 = 64+16+4+1 // 0101 0101
0x10 | 16 = 16 // 0001 0000
0x400008
0x44 | 68 = 64+4 // 0100 0100
0x5f | 95 = 64+16+8+4+2+1 // 0101 1111
0x10 | 16 = 16 // 0001 0000
0x51 | 81 = 64+16+1 // 0101 0001
0x43 | 67 = 64+2+1 // 0100 0011
0x43 | 67 = 64+2+1 // 0100 0011
0x55 | 85 = 64+16+4+1 // 0101 0101
0x5d | 93 = 64+16+8+4+1 // 0101 1101
0x400010
0x52 | 82 = 64+16+2 // 0101 0010
0x5c | 92 = 64+16+8+4 // 0101 1100
0x49 | 73 = 64+8+1 // 0100 1001
0x10 | 16 = 16 // 0001 0000
0x47 | 71 = 64+4+2+1 // 0100 0111
0x5f | 95 = 64+16+8+4+2+1 // 0101 1111
0x42 | 66 = 64+2 // 0101 0010
0x5c | 92 = 64+16+8+4 // 0101 1100
0x400018
0x54 | 84 = 64+16+4 // 0101 0100
0x11 | 17 = 16+1 // 0001 0001
0x00 | 0 = 0 // 0000 0000
위의 메모리 주소 값과 0x30 | 48 = 32+16 // 0011 0000 를 XOR 연산을 하면
; (sp)는 스페이스바
; 16진수 | 10진수 //2진수(아스키코드)
0x400000
0x57 | 87 // 0101 0111(W)
0x65 | 101 // 0110 0101(e)
0x6A | 108 // 0110 1100(l)
0x63 | 99 // 0110 0011(c)
0x6F | 111 // 0110 1111(o)
0x6D | 109 // 0110 1101(m)
0x65 | 101 // 0110 0101(e)
0x20 | 32 // 0010 0000(sp)
0x400008
0x74 | 116 // 0111 0100(t)
0x6F | 111 // 0110 1111(o)
0x20 | 32 // 0010 0000(sp)
0x61 | 97 // 0110 0001(a)
0x73 | 115 // 0111 0011(s)
0x73 | 115 // 0111 0011(s)
0x65 | 101 // 0110 0101(e)
0x6D | 109 // 0110 1101(m)
0x400010
0x62 | 98 // 0110 0010(b)
0x6C | 108 // 0110 1100(l)
0x79 | 121 // 0111 1001(y)
0x20 | 32 // 0010 0000(sp)
0x77 | 119 // 0111 0111(w)
0x6F | 111 // 0110 1111(o)
0x72 | 114 // 0111 0010(r)
0x6C | 108 // 0110 1100(l)
0x400018
0x64 | 100 // 0110 0100(d)
0x21 | 33 // 0010 0001(!)
0x30 | 48 // 0011 0000(0)
이 된다.아스키 코드를 모으면 답은 이와 같다.
'리버싱' 카테고리의 다른 글
dreamhack Quiz:x86 Assembly 2 (0) | 2022.08.25 |
---|