
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 |