[클라우드 바우처] 80% 할인된 금액으로 드림핵 엔터프라이즈를 도입해 보세요. 자세히 알아보기
Beginner

shell_basic

pwnable
  • 문제 정보
  • 풀이 102
  • 난이도 투표 31
  • 질문 56
  • 최근 풀이자 2718
  • 댓글 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# 어떻게 제출해야지 인식이 될까요...
하설

최근 풀이자 2718

jjyyjj
대표 업적 없음
쿨비
대표 업적 없음
gssong
Closed Beta Tester
SIHO
대표 업적 없음
hobbyIsHack
대표 업적 없음
avatar
dhjisgod
워게임 고인물
einna
대표 업적 없음
Proson
대표 업적 없음
심심이
대표 업적 없음
dooch08
대표 업적 없음

댓글 89

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