Beginner

shell_basic

pwnable
  • 문제 정보
  • 풀이 112
  • 난이도 투표 31
  • 질문 56
  • 최근 풀이자 2832
  • 댓글 89

문제 설명

Description

입력한 셸코드를 실행하는 프로그램이 서비스로 등록되어 작동하고 있습니다.

main 함수가 아닌 다른 함수들은 execve, execveat 시스템 콜을 사용하지 못하도록 하며, 풀이와 관련이 없는 함수입니다.

flag 파일의 위치와 이름은 /home/shell_basic/flag_name_is_loooooong입니다.
감 잡기 어려우신 분들은 아래 코드를 가지고 먼저 연습해보세요!

플래그 형식은 DH{...} 입니다. DH{}도 모두 포함하여 인증해야 합니다.

참고

$ cat write.asm
section .text
global _start
_start:
    ;/* write(fd=1, buf='hello', n=48) */
    ;/* push 'hello\x00' */
    mov rax, 0x0a6f6c6c6568
    push rax
    mov rsi, rsp
    push 1
    pop rdi
    push 0x6
    pop rdx
    ;/* call write() */
    push 1
    pop rax
    syscall
$ nasm -f elf64 write.asm
$ objcopy --dump-section .text=write.bin write.o
$ xxd write.bin
00000000: 48b8 6865 6c6c 6f0a 0000 5048 89e6 6a01  H.hello...PH..j.
00000010: 5f6a 065a 6a01 580f 05                   _j.Zj.X..
$ cat write.bin | ./shell_basic
shellcode: hello
[1]    1592460 done                cat write.bin |
       1592461 segmentation fault  ./shell_basic
$

출제자 정보

avatar
Dreamhack
대표 업적 없음

First Blood!

kileak
대표 업적 없음
출제된 지 10분 만에 풀이 완료!

난이도 투표 31

질문 56

문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
어셈블리어에서 셀코드(OpCode)로 변환 후 제출은 어떻게 하나요?
밑에 다른 게시글도 보고 어셈에서 OpCode로 변환하는 방법 찾아서 테스트 삼아 Hello world!!!\n를 출력하는 셀코드를 전송하였는데 아무 반응이 없습니다. 아래는 쉘 코드에 적용된 어셈블리로 작성된 코드 입니다. 주석은 이해를 돕기 위해 md 파일에만 작성되어 있으며 실제 코드에서는 주석이 없습니다. .globl main .type main, @function .intel_syntax noprefix main: push rbp mov rbp, rsp mov rax, 0xa212121646c726f ; 스택에 hello world!!!\n 저장중 push rax ; 스택에 hello world!!!\n 저장중 mov rax, 0x77202c6f6c6c6548 ; 스택에 hello world!!!\n 저장중 push rax ; 스택에 hello world!!!\n 저장중 xor rax, rax ; rax = 0 xor rdx, rdx ; rdx = 0 mov al, 0x1 ; al(rax) = 1 ; write mov rdi, rax ; rdi = rax(1) ; stdout lea rsi, [rsp] ; rsi = 스택에 저장된 hello world!!!\n 주소 mov dl, 0x10 ; rsi = 16 ; 출력할 글자 수 syscall ; write(stdout, 스택에 저장된 hello world!!!\n 주소, 16) xor rax, rax ; rax = 0 ; return 0 leave ret 해당 코드 작성 이후 gcc a.s -o a.out 커맨드를 통하여 어셈블리어를 컴파일하였고 ./a.out 커맨드 실행 결과로 Hello, world!!!\n이 나왔습니다. 이후 objdump -d a.out 커맨드로 OpCode를 확인하였고 이를 쉘 코드로 변경하였습니다. 아래는 objdump -d a.out 커맨드 출력 결과입니다. ...다른 코드들 00000000000005fa <main>: 5fa: 55 push %rbp 5fb: 48 89 e5 mov %rsp,%rbp 5fe: 48 b8 6f 72 6c 64 21 movabs $0xa212121646c726f,%rax 605: 21 21 0a 608: 50 push %rax 609: 48 b8 48 65 6c 6c 6f movabs $0x77202c6f6c6c6548,%rax 610: 2c 20 77 613: 50 push %rax 614: 48 31 c0 xor %rax,%rax 617: 48 31 d2 xor %rdx,%rdx 61a: b0 01 mov $0x1,%al 61c: 48 89 c7 mov %rax,%rdi 61f: 48 8d 34 24 lea (%rsp),%rsi 623: b2 10 mov $0x10,%dl 625: 0f 05 syscall 627: 48 31 c0 xor %rax,%rax 62a: c9 leaveq 62b: c3 retq 62c: 0f 1f 40 00 nopl 0x0(%rax) ...다른 코드들 아래는 위 결과를 셀 코드(OpCode)로 변환한 결과입니다. \x55\x48\x89\xe5\x48\xb8\x6f\x72\x6c\x64\x21\x21\x21\x0a\x50\x48\xb8\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x50\x48\x31\xc0\x48\x31\xd2\xb0\x01\x48\x89\xc7\x48\x8d\x34\x24\xb2\x10\x0f\x05\x48\x31\xc0\xc9\xc3\x0f\x1f\x40\x00 이후 해당 셀 코드가 정상 작동하는지 C 코드를 통해 확인 후 nc host1.dreamhack.games <custom port> 커맨드를 통해 제출하였는데 하다못해 에러 메세지조차도 없으며 아무런 반응이 없습니다. 아래는 C 코드를 통한 확인 및 제가 진행한 제출 과정입니다. 아래 코드에서는 shellcode: 이후 엔터가 들어간 것처럼 보이나 실제로는 한줄로 구성되어 있으며 길이가 길어 엔터가 들어간 것처럼 보이는 것입니다. root@dev:~/dh# cat a.c char s[] = "\x55\x48\x89\xe5\x48\xb8\x6f\x72\x6c\x64\x21\x21\x21\x0a\x50\x48\xb8\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x50\x48\x31\xc0\x48\x31\xd2\xb0\x01\x48\x89\xc7\x48\x8d\x34\x24\xb2\x10\x0f\x05\x48\x31\xc0\xc9\xc3\x0f\x1f\x40\x00"; int main(void) { ((void ()()) s)(); } root@dev:~/dh# gcc -fno-stack-protector -z execstack -o shell.out a.c root@dev:~/dh# ./shell.out Hello, world!!! root@dev:~/dh# nc host1.dreamhack.games <some port> shellcode: \x55\x48\x89\xe5\x48\xb8\x6f\x72\x6c\x64\x21\x21\x21\x0a\x50\x48\xb8\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x50\x48\x31\xc0\x48\x31\xd2\xb0\x01\x48\x89\xc7\x48\x8d\x34\x24\xb2\x10\x0f\x05\x48\x31\xc0\xc9\xc3\x0f\x1f\x40\x00 root@dev:~/dh# 어떻게 제출해야지 인식이 될까요...
하설

최근 풀이자 2832

avatar
Guccudas0209
워게임: 20
Kcits970
대표 업적 없음
ccclllara
대표 업적 없음
avatar
黑猫
대표 업적 없음
mo.on
대표 업적 없음
Mungsul
워게임: 1
D3lvoid
대표 업적 없음
Jino
대표 업적 없음
bibong
대표 업적 없음
avatar
상혁
워게임 고인물

댓글 89

daeseong1209
대표 업적 없음
매우 어려운!
Ma_Mu0228
대표 업적 없음
1. 스택에 경로 넣을 때 먼저 null 넣기 2. 리틀에디안 방식으로 스택에 정확한 경로 넣기 2. 필요한 셸코드 정확하게 추출하기 3. pwn 모듈 사용해서 서버에 데이터 전송할 줄 알기 4. 문제 파일에 있는 소스코드 해석하기 p.s. shellcraft 사용 안하는 강의 방식은 초보자에겐 진짜 어려운 것 같아요
avatar
스카이넷
강의 수강: 10
ez
avatar
Mooney
워게임: 50
어려우신 분들에게 도움을 드리자면 문제 상에서는 execve가 막혔다고 했으니 orw 셸코드를 사용해서 읽는 방법을 사용해보세요
avatar
techq__
워게임: 50
겁나 어렵네여
O_F
대표 업적 없음
레벨 2
avatar
DEMON1
Dreamhack CTF S3 Ⅵ - Div2 참여
손수 풀었습니다.
PaulSohn
대표 업적 없음
Lecture에서 이 문제로 처음 들어온 워린이입니다. 처음 워게임 하는 입장에서는 문제 설명이 좀 불친절할 수 있을 것 같아요. "접속 정보에 나와있는 호스트(`host3.dreamhack.games:10322`)는 바이너리로 입력한 셸코드를 실행시킨다" 정도는 쓸 수 있지 않을까요
avatar
Deft
대표 업적 없음
어려워요 ...........
avatar
emzei
대표 업적 없음
레지스터 확인을 잘하자