//광고차단회복
반응형

프로그램이 종료됐을 때, 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)
이 된다.아스키 코드를 모으면 답은 이와 같다.

더보기
Welcome to assembly world!

 

반응형

'리버싱' 카테고리의 다른 글

dreamhack Quiz:x86 Assembly 2  (0) 2022.08.25

+ Recent posts