완료됨
제가 하고있는게 맞나 모르겠어서 여쭤봅니다

리눅스, 우분투는 하나도 모르는 뉴비입니다(답답해도 참아주세요..)
우분투 터미널에서
vi orw.c로

__asm__(
    ".global run_sh\n"
    "run_sh:\n"
    "push 0x67\n"
    "mov rax, 0x616c662f706d742f \n"
    "push rax\n"
    "mov rdi, rsp    # rdi = '/tmp/flag'\n"
    "xor rsi, rsi    # rsi = 0 ; RD_ONLY\n"
    "xor rdx, rdx    # rdx = 0\n"
    "mov rax, 2      # rax = 2 ; syscall_open\n"
    "syscall         # open('/tmp/flag', RD_ONLY, NULL)\n"
    "\n"
    "mov rdi, rax      # rdi = fd\n"
    "mov rsi, rsp\n"
    "sub rsi, 0x30     # rsi = rsp-0x30 ; buf\n"
    "mov rdx, 0x30     # rdx = 0x30     ; len\n"
    "mov rax, 0x0      # rax = 0        ; syscall_read\n"
    "syscall           # read(fd, buf, 0x30)\n"
    "\n"
    "mov rdi, 1        # rdi = 1 ; fd = stdout\n"
    "mov rax, 0x1      # rax = 1 ; syscall_write\n"
    "syscall           # write(fd, buf, 0x30)\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(); }

코드를 작성한뒤에 :wq로 저장하고
vi /tmp/flag로 들어가서

flag{this_is_open_read_write_shellcode!}

코드를 작성한뒤에 :wq로 저장하고 나와서

gcc -o orw orw.c -masm=intel
./orw 

를 입력했습니다
그랬더니 결과가

flag{this_is_open_read_write_shellcode!}
v�H�Ujerry@ubuntu:~/Downloads/test$ 

가 나왔습니다
이런식으로 해가는게 맞는건가요? (맞는지 아닌지를 몰라서 더이상 진행을 못하겠습니다 ㅠㅠ)
그리고 vi /tmp/flag로 들어가서

echo "flag{this_is_open_read_write_shellcode!}"

를 그대로 입력하면
./orw를 했을때

echo "flag{this_is_open_read_write_shellcode!}" 

그대로만 나오고 &��U이런값들이 안나오더라구요.
이런건 왜 이런건가요?

#시스템_해킹 #공격기법
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
2dedce
워게임 고인물

write(fd, buf, 0x30)에서 0x30=48바이트를 출력해야 합니다. 근데 flag{this_is_open_read_write_shellcode!}는 40바이트니까 나머지 8바이트로는 쓰레기값이 같이 출력된 것 같습니다.

2022.01.12. 06:44