//광고차단회복
반응형

어셈블리 코드 실행시 출력되는 결과를 고르는 문제이다.

A 4r3 y0u r34dy 70 d3bu6?
B are you ready to debug?
C ready to debug?
D r34dy 70 d3bu6?

 

[code]를 보면
  mov rdi, 0x400500
rdi 레지스터에 0x400500의 주소를 대입하라
  call 0x400497 <write_n>
0x400497주소의 <write_n> 함수를 호출한다

<write_n>의 함수를 살펴보면
  mov QWORD PTR[rbp-0x8], rdi
rdi 레지스터의 주소(0x400500)를 [rbp-0x8]에 대입한다
  mov DWORD PTR[rbp-0xc], esi
데이터 조작 및 복사시 소스 데이터 주소가 저장되는 esi 레지스터의 주소(0xf)를 [rbp-0xC]에 대입한다
  xor rdx, rdx
xor 연산으로 rdx를 0으로 만든다
  mov edx, DWORD PTR [rbp-0xc]
edx 레지스터에 [rbp-0xc] 주소를 대입한다
  mov rsi, QWORD PTR [rbp-0x8]
rsi 레지스터에 [rbp-0x8] 주소를 대입한다
  mov rdi, 0x1
rdi 레지스터에 1을 대입한다
  mov rax,0x1
rax 레지스터에 1을 대입한다
  syscall
시스템 콜을 통해 출력하는듯하다
그 외의 어셈블리어는 프로그램을 종료되도록 하는 코드이다.

mov QWORD PTR[rbp-0x8], rdi
mov DWORD PTR[rbp-0xc], esi
코드를 표로 보면 아래와 같다.

rbx
rbp-0x8 0x400500
rbp-0xc 0xf

[rbp-0x8] 위치에 0x400508이 [rbp-0xc] 위치에 0xf가 있는 것이다.

또한, x86 아키텍처인 리틀엔디안 방식으로 저장되기에 아래의 표와 같다. 

0x400500 0x72 0x33 0x34 0x64 0x79 0x20 0x37 0x30
0x400508 0x20 0x64 0x33 0x62 0x75 0x36 0x3f 0x00

 

syscall 동작 방식을 찾아보면 rax, rdi, rsi, rdx, r10,r8,r9 순으로 인자를 받는 것을 알 수 있다. 
xor 연산 후  edx 레지스터에 0xf를, rsi에 0x400500을 대입하고 rax,rdi에 1을 대입해 syscall을 불러 인자로 쓰이고 있다.
syscall 인자는 rax가 1이므로 write를 rdi에 1을 넣어 파일 디스크립터 1인 표준출력, 출력할 주소인 rsi(0x400500)을, 출력 사이즈인 rdx(0xf, 10진수 15)를 가지고 있다.

그렇기에 리틀엔디안 방식으로 0x400500부터 0x400508의 0x72~x3f까지를 출력하게 된다.

그 문자열을 아스키 코드로 바꾸면 정답은 이와 같다.

더보기

( D ) r34dy 70 d3bu6?

 

 

반응형

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

dreamhack Quiz:x86 Assembly 1  (0) 2022.08.24
반응형

프로그램이 종료됐을 때, 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