본문 바로가기

Reversing/Dreamhack : Reverse Engineering

Quiz: x86 Assembly 2-3

 

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

rsi = 0x400000
rcs = 0

0x400000 주소에 있는 1byte의 값 0x67이 dl에 저장

dl = 0x67

2: xor dl, 0x30

  0x67  =  0110 0111  ('g')
⊕ 0x30  =  0011 0000  ('0')
---------------------
  0x57  =  0101 0111  ('W')
  
dl = 0x57
  
 
3: mov BYTE PTR[rsi+rcx], dl

0x400000의 0x67이 0x57로 바뀜

0x400000 | 0x57 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10

4: inc rcx

rcx = 0x1

5: cmp rcx, 0x19
6: jg end
7: jmp 1

cmp : 피연산자를 빼서 비교함
jg : jump if greater => rcs>0x19이면 end로 점프, 그렇지 않으면 jmp로 돌아가 반복

0x19 == 25

 

rcx 값
cmp rcx, 0x19 결과
jg end
0
0 < 25 false
code 1로 돌아감
1
1 < 25 false
code 1로 돌아감
-
-
-
24
24<25 false
code 1로 돌아감
25
25 == 25 false
code 1로 돌아감
26
26>25 true
end로 점프 (종료)
 
  • rcx=26이 될 때 종료

1. mov dl, BYTE PTR[rsi+rcx]
→ 메모리 주소 (rsi + rcx)에서 한 바이트를 dl에 로드.
→ rsi = 0x400000, rcx = 0이므로 처음에는 0x400000부터 시작.

2. xor dl, 0x30
→ dl에 0x30을 XOR 연산 수행.

3. mov BYTE PTR[rsi+rcx], dl
→ 변환된 값을 다시 메모리에 저장.

4. inc rcx
→ rcx 증가.

5. cmp rcx, 0x19
→ rcx가 0x19(25)보다 크면 종료 (jg end).

6. jmp 1
→ 다시 처음부터 반복.

 

즉, 0x400000 ~ 0x400018(25바이트)까지의 모든 값을 XOR 0x30한 후 다시 메모리에 저장하는 루프

 

1. mov esi, 0xf

  • esi = 0xf

2. mov rdi, 0x400500

  • rdi = 0x400500

3. call 0x400497 <write_n>

  • write_n 함수 호출
  • 0x400497 : 실행할 함수의 메모리 주소
  • call 0x400497은 write_n 함수의 시작 주소(0x400497)로 점프하여 실행
  • 현재 rip의 값을 stack에 저장 → rip을 0x400497로 변경해 write_n 함수 실행 → write_n이 끝나면 ret 명령어를 만나 stack에 저장된 rip 값을 복원해 원래 위치로 돌아감
write_n:
    push rbp
    mov rbp, rsp
    mov QWORD PTR [rbp-0x8],rdi ; [rbp-0x8] = rdi = 0x400500
    mov DWORD PTR [rbp-0xc],esi ; [rbp-0xc] = esi = 0xf
    xor rdx, rdx  ; rdx = 0 / rdx를 0으로 초기화하는 역할
    mov edx, DWORD PTR [rbp-0xc] ; edx = 0xf
    mov rsi,QWORD PTR [rbp-0x8] ; rsi = 0x400500
    mov rdi, 0x1 ; rdi = 0x1
    mov rax, 0x1 ; rax = 0x1
    syscall 
    pop rbp
    ret
rax
시스템 콜 번호
1 (write 시스템 콜)
rdi
파일 디스크립터
1 (표준 출력, stdout)
rsi
버퍼 주소
0x400500 (출력할 문자열의 주소)
rdx
출력할 바이트 수
0xf = 15바이트
  • syscall을 통해 write(1, 0x400500, 15) 실행 → 0x400500 주소부터 15바이트 출력

0x400500 | 0x3037207964343372

0x400508 | 0x003f367562336420

 

리틀 엔디언 변환

 

1. 0x3037207964343372→ ASCII 변환: r34dy 70\

→ 바이트 순서 변경: 72 33 34 64 79 20 37 30

 

2. 0x003f367562336420→ ASCII 변환: d3bu6?

→ 바이트 순서 변경: 20 64 33 62 75 36 3f 00

 

 

대표적인 syscall 번호

0x0
read
파일에서 읽기
0x1
write
파일에 쓰기, 표준 출력
0x2
open
파일 열기
0x3
close
파일 닫기
0x60
exit
프로세스 종료



'Reversing > Dreamhack : Reverse Engineering' 카테고리의 다른 글

[Dreamhack] patch  (0) 2025.04.21
IDA  (0) 2025.04.16
Quiz: x86 Assembly 1  (0) 2025.04.16
x86 Assembly🤖: Essential Part  (0) 2025.04.16
Background: Windows Memory Layout  (0) 2025.04.16