일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- hacking
- 해킹
- 웹
- 시스템해킹
- 모의해킹
- 알고리즘
- XSS
- network
- 네트워크보안
- 순서도
- Web
- ftz
- CodeEngn
- Webhaking
- TCP
- 비박스
- 소프트웨어
- 시스템
- 리버싱
- WarGame
- 소프트웨어보안
- 드림핵
- System
- reversing
- webhacking
- 웹해킹
- dreamhack
- 워게임
- 네트워크
- bee-box
- Today
- Total
Without a Break
[Dreamhack] Exploit Tech: Shellcode 본문
해킹 분야에서 상대 시스템을 공격하는 것을 익스플로잇(Exploit)이라고 부른다.
그 중, 쉘코드에 대해 알아보도록 하자.
셸코드(Shellcode)
: 익스플로잇을 위해 제작된 어셈블리 코드 조작
orw 셸코드
: 파일을 열고 읽은 뒤 화면에 출력해주는 셸코드
syscall | rax | arg0 (rdi) | arg1 (rsi) | arg2 (rdx) |
read | 0x00 | unsigned int fd | char *buf | size_t count |
write | 0x01 | unsigned int fd | const char *buf | size_t count |
open | 0x02 | const char *filename | int flags | umode_t mode |
1. int fd = open("/tmp/flag", O_RDONLY, NULL)
첫 번째로 해야 할 일은 “/tmp/flag”라는 문자열을 메모리에 위치시키는 것이다.
이를 위해 스택에 0x616c662f706d742f67(/tmp/flag)를 push하고, rdi가 이를 가리키도록 rsp를 rdi로 옮깁니다.
파일을 읽을 때, mode는 의미를 갖지 않으므로, rdx는 0으로 설정합니다.

2. read(fd, buf, 0x30)
syscall의 반환 값은 rax로 저장된다. 따라서 open으로 획득한 /tmp/flag의 fd는 rax에 저장된다. read의 첫 번째 인자를 이 값으로 설정해야 하므로 rax를 rdi에 대입한다.
rsi는 파일에서 읽은 데이터를 저장할 주소를 가리킨다. 0x30만큼 읽을 것이므로, rsi에 rsp-0x30을 대입한다.
rdx는 파일로부터 읽어낼 데이터의 길이인 0x30으로 설정한다.
read 시스템콜을 호출하기 위해서 rax를 0으로 설정한다.

*fd란? 파일 서술자로, 유닉스 계열의 운영체제에서 파일에 접근하는 포스트웨어에 제공하는 가상의 접근 제어자이다.
프로세스마다 고유의 서술자 테이블을 가지고 있으며, 그 안에 여러 파일 서술자를 저장한다.
서술자 각각은 번호로 구별되는데, 일반적으로 0번은 일반 입력(STDIN), 1번은 일반 출력(STDOUT), 2번은 일반 오류(STDERR)에 할당되어 있으며, 이들은 프로세스를 터미널과 연결해준다.
그래서 우리는 키보드 입력을 통해 프로세스에 입력을 전달하고, 출력을 터미널로 받아볼 수 있다.
3. write(1,buf,0x30)
출력은 stdout으로 할 것이므로, rdi를 0x1로 설정한다.
rsi와 rdx는 read에서 사용한 값을 그대로 사용한다.
write 시스템콜을 호출하기 위해서 rax를 1로 설정한다.

4. orw 셸코드 작동

execve 셸코드
execve 셸코드는 임의의 프로그램을 실행하는 셸코드인데, 이를 이용하면 서버의 셸을 획득할 수 있다.
다른 언급없이 셸코드라고 하면 이를 의미하는 경우가 많다.
1. execve("/bin/sh",null,null)
여기서 argv는 실행파일에 넘겨줄 인자, envp는 환경변수다. 우리는 sh만 실행하면 되므로 다른 값들은 전부 null로 설정해줘도 된다.
리눅스에서는 기본 실행 프로그램들이 /bin/ 디렉토리에 저장되어 있으며, 우리가 실행할 sh도 여기에 저장되어 있다.

2. execve 셸코드 컴파일 및 실행

'Pwnable > Dreamhack' 카테고리의 다른 글
[Dreamhack] Mitigation: Stack Canary (0) | 2022.11.06 |
---|---|
[Dreamhack] Memory Corruption: Stack Buffer Overflow (0) | 2022.10.30 |
[Dreamhack] Tool: gdb (0) | 2022.10.12 |
[Dreamhack] Computer Architecture (0) | 2022.10.05 |
[Dreamhack] Linux Memory Layout (0) | 2022.10.05 |