네른

orw shellcode 본문

강의 정리/드림핵 정리

orw shellcode

네른 2022. 2. 11. 15:59

ORW shellcode?

 - OPEN / READ / WRITE 세 함수를 사용하여 파일을 읽고 화면에 출력하는 쉘코드

 - execve 등의 쉘코드가 사용 불가능 할 때, 파일을 읽는 작업 등을 위해 사용

 - 원리는 다음과 같음

    1) open 함수로 파일을 연다

    2) 생성된 fd를 read 함수에 넘기고 읽은 후에 스택에 결과를 저장

    3) 스택에서 정보를 읽어 stdout 등에 출력

 

각각의 syscall은 다음과 같이 구성됨

1. open

 - rax : 0x02 (syscall_open)

 - rdi : 읽을 파일명이 담긴 주소

 - rsi : flag(read_only, write_only 등)

 - rdx : mode(read 함수에서 mode는 의미가 없음)

 

2. read

 - rax : 0x00 (syscall_read)

 - rdi : 읽을 파일의 fd

 - rsi : 읽은 결과를 저장할 buffer 주소

 - rdx : 읽을 길이

 

3. write

 - rax : 0x01 (syscall_write)

 - rdi : 읽은 내용을 출력할 fd (stdout이면 0x1)

 - rsi : 읽을 버퍼 주소

 - rdx : 읽을 길이

 

asm코드는 다음과 같이 구성됨

 

1. open

mov rax, 읽을 파일명
push rax	---- 읽을 파일명을 스택에 저장
mov rdi, rsp	---- 읽을 파일명이 담긴 주소를 rdi에 저장
xor rsi, rsi	---- rsi 값을 0으로 설정하여 Read Only 모드 설정
xor rdx, rdx	---- mode를 0으로
mov rax, 2	---- open syscall을 호출
syscall

 

2. read

mov rdi, rax	---- open의 return 값(fd)이 rax에 담기기 때문에 이를 옮김
mov rsi, rsp
sub rsi, 0x30	---- rsp-0x30에 읽은 결과를 저장하기 위함
mov rdx, 0x30	---- 읽을 길이는 0x30
mov rax, 0x0	---- syscall read
syscall

 

3. write

mov rdi, 1	---- stdout에 출력
mov rax, 0x1	---- syscall_write
syscall

rsi rdx를 수정하지 않는 것은 read 단계에서 대입해둔 값을 그대로 쓰기 때문

 

위의 1,2,3 asm 코드를 순차적으로 진행하면 특정 파일을 읽어 stdout에 출력하게 됨

Comments