Reversing/DreamHack

드림핵 Quiz: x86 Assembly 3 풀이

프레딕 2023. 11. 29. 18:28
728x90
[Code]
main:
    push rbp
    mov rbp, rsp
    mov esi, 0xf
    mov rdi, 0x400500
    call 0x400497 <write_n>
    mov eax, 0x0
    pop rbp
    ret
    
write_n:
    push rbp
    mov rbp, rsp
    mov QWORD PTR [rbp-0x8],rdi
    mov DWORD PTR [rbp-0xc],esi
    xor rdx, rdx
    mov edx, DWORD PTR [rbp-0xc]
    mov rsi,QWORD PTR [rbp-0x8]
    mov rdi, 0x1
    mov rax, 0x1
    syscall
    pop rbp
    ret
    
==================================    
[Memory]
0x400500 | 0x3037207964343372
0x400508 | 0x003f367562336420

 

한줄씩 천천히 풀어보겠다.

먼저 write_n 함수 실행 전까지이다.

[Code]
main:
    push rbp	// rbp를 스택 상단에 넣는다
    mov rbp, rsp	// rbp에 rsp 값을 대입
    mov esi, 0xf	// esi = 0xf
    mov rdi, 0x400500	// rdi = 0x400500
    call 0x400497 <write_n>	// write_n 함수를 실행	
    mov eax, 0x0
    pop rbp
    ret
    
write_n:
    push rbp
    mov rbp, rsp
    mov QWORD PTR [rbp-0x8],rdi
    mov DWORD PTR [rbp-0xc],esi
    xor rdx, rdx
    mov edx, DWORD PTR [rbp-0xc]
    mov rsi,QWORD PTR [rbp-0x8]
    mov rdi, 0x1
    mov rax, 0x1
    syscall
    pop rbp
    ret
    
==================================    
[Memory]
0x400500 | 0x3037207964343372
0x400508 | 0x003f367562336420

 

write_n 함수 실행 결과이다.

[Code]
main:
    push rbp	// rbp를 스택 상단에 넣는다
    mov rbp, rsp	// rbp에 rsp 값을 대입
    mov esi, 0xf	// esi = 0xf
    mov rdi, 0x400500	// rdi = 0x400500
    call 0x400497 <write_n>	// write_n 함수를 실행	
    mov eax, 0x0	// eax = 0x0
    pop rbp	// 스택 상단값 제외
    ret	// 반환
    
write_n:
    push rbp	// rbp를 스택 상단에 넣는다
    mov rbp, rsp	// rbp = rsp
    mov QWORD PTR [rbp-0x8],rdi	// QWORD PTR [rbp-0x8] = 0x400500
    mov DWORD PTR [rbp-0xc],esi	// DWORD PTR [rbp-0xc] = 0xf
    xor rdx, rdx	// rdx = 0x0
    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		// system call
    pop rbp	// 스택 상단값 제외
    ret	// 반환
    
==================================    
[Memory]
0x400500 | 0x3037207964343372
0x400508 | 0x003f367562336420

 

근데 여기까지 하면은 메모리에는 아무런 변화가 없다는 것을 알 수 있었다... (허무)

그래서 메모리값을 아스키 값으로 바꿔주면 되는데 이때, 메모리가 리틀 엔디안 방식으로 되어있기에 오른쪽에서 왼쪽으로 읽어줘야한다. 

(리틀 엔디안, 빅 엔디안)

https://code-lab1.tistory.com/179

 

[컴퓨터 아키텍처] 리틀 엔디안(Little-endian) 과 빅 엔디안(Big -endian)이란?

바이트 저장 순서 컴퓨터는 데이터를 메모리에 저장할 때 Byte 단위로 나눠서 저장한다. 따라서 연속되는 바이트를 순서대로 저장해야 하는데, 이것을 바이트 저장 순서(Byte Order)라고 한다. 이때

code-lab1.tistory.com

 

그래서 아스키 값을 확인하면 r34dy 70 d3bu6? 이 나온다.

728x90
반응형