フラグを2文字取ってきて計算する処理があるので、gdbで動かして取ってきて脳死z3で解ける。
import gdb
e = lambda c: gdb.execute(c, to_string=True)
p = lambda x: gdb.parse_and_eval(x)
デコンパイル結果を持ってきてブルートフォース。
enc1 = [0x08, 0x23, 0x03, 0x03, 0x13, 0x03, 0x13, 0x03, 0x01, 0x23, 0x31, 0x13, 0x11, 0xC8, 0x03, 0xC8, 0x03, 0x13, 0x01, 0xC8, 0x13, 0x13, 0x03, 0x13, 0x13, 0x11, 0x13, 0x23, 0x00, 0x00, 0x00, 0x00]
enc2 = [0x02, 0x40, 0x80, 0x08, 0x08, 0x08, 0xC8, 0xC8, 0x80, 0x88, 0x08, 0x80, 0x88, 0x32, 0x08, 0x32, 0x80, 0x80, 0x80, 0x32, 0x08, 0x80, 0x08, 0x08, 0x48, 0x88, 0x80, 0xC8, 0x00]
flag = ''
for i in range(100):
WOLF RPGエディターで作られたゲーム。起動するとゲームが始まって、配置されている宝箱に触るとflag?と聞いてくる。
Data/MapData/SampleMapA.mps
の中にflag?という文字列があり、おそらくここがflagチェック処理が含まれているバイナリであるがどういったものかは不明。{}QWERTYUIOPASDFGHJKLZXCVBNM_
やTKTNT}RRUAPRHDSH{SXMREISUAH}RE}PUYPUQYDBQTLKXWCJXTY
の文字列が見えるが、適当にxorしてもflagにはならないのでguessは諦める。
https://silversecond.com/WolfRPGEditor/ のエディタでそのまま開けるようだったので処理を読む。\v[0]
のような文章を追加するとV0
の変数を表示できるのでデバッグが楽。
あとは1文字ずつブルートフォースして求めた。
FROM python:3.7-stretch | |
WORKDIR /app | |
RUN pip install uwsgi==2.0.17 | |
COPY foobar.py . | |
COPY __init__.py foo/bar/__init__.py | |
CMD ["uwsgi", "--http", ":9090", "--wsgi-file", "foobar.py", "--py-autoreload", "1"] |
# -*- coding: utf-8 -*- | |
from z3 import * | |
s = Solver() | |
seed1 = [BitVec('s1_%d' % i, 64) for i in range(64+1)] | |
seed2 = [BitVec('s2_%d' % i, 64) for i in range(64+1)] | |
r1 = BitVec('r1', 64) | |
r2 = BitVec('r2', 64) |
# -*- coding: utf-8 -*- | |
import os | |
import sys | |
import time | |
import re | |
import struct | |
import socket | |
p = lambda x: struct.pack('<I', x) | |
u = lambda x: struct.unpack('<I', x)[0] |
# -*- coding: utf-8 -*- | |
import os | |
import sys | |
import time | |
import re | |
import struct | |
import socket | |
from pwn import * | |
context.update(arch='amd64', os='linux') |
# -*- coding: utf-8 -*- | |
import os | |
import sys | |
import time | |
import re | |
import struct | |
import socket | |
p = lambda x: struct.pack('<Q', x) | |
u = lambda x: struct.unpack('<Q', x)[0] |
# -*- coding: utf-8 -*- | |
import os | |
import sys | |
import time | |
import re | |
import struct | |
import socket | |
from libformatstr import FormatStr | |
p = lambda x: struct.pack('<I', x) |