Positive Hack Days CTF-åœéçãªæ
å ±ä¿è·ç«¶æ
ãCapturethe Flagã®ã²ãŒã ååã«åŸã£ãŠéå¬ãããŸãã å²ãåœãŠãããæéã«ããã€ãã®ããŒã ããããã¯ãŒã¯ãå®ããèŠç¥ãã¬äººãæ»æããŸãã åå è
ã®äž»ãªã¿ã¹ã¯ã¯ãæµã®ã·ã¹ãã ã®è匱æ§ãç¹å®ããç§å¯æ
å ±ïŒãã©ã°ïŒã«ã¢ã¯ã»ã¹ãããšåæã«ãã·ã¹ãã ã®ãã®ãããªè匱æ§ãæ€åºããŠæé€ããããšã§ãã
ä»æ¥ã®ãããã¯ã§ã¯ãéå»ã®å€§äŒã®åå è
ãçŽé¢ããããã€ãã®èå³æ·±ãã¿ã¹ã¯ã®åæã玹ä»ããŸãã
æŽå²ãšå°ç
ä»å¹ŽPHDays CTFã¯4åç®ã®éå¬ãšãªããŸãã 2011幎ã®Positive Hack Daysãã©ãŒã©ã ã§åããŠã³ã³ãã¹ããéå¬ããããã®åŸãã¢ã¡ãªã«ã®PPPããŒã ã®åå è
ãåè
ãšãªãããã·ã¢ããŒã ã®ãªãŒãã¢ã¢ãç¿å¹Žããªã©ã³ãã®EindbazenãPHDays IIIã®ãã£ã³ããªã³ã«ãªããŸããã æ¯å¹Žãäžçäžã®ããŒã ããç±³åœããæ¥æ¬ãŸã§ãPHDays CTFã«åå ããŠããŸãã
ä»å¹Žã600以äžã®ããŒã ãäºéžå€§äŒã«åå ããããã«ç»é²ããŸããã
ã¯ãšã¹ããšé°å²æ°
確ç«ãããäŒçµ±ã«ãããšãã²ãŒã ã®ã¿ã¹ã¯ãšã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ã競æã®äŒèª¬ã«åºã¥ããŠæºåãããŸããããã¯ãPHDays CTFã¿ã¹ã¯ã®åçŽãªã»ãããç®æšã®ãããšããµã€ãã£ã³ã°ãªç«¶æã«å€ããç¹å¥ãªã¹ããŒãªãŒã§ãã ããšãã°ãæšå¹Žãåå è
ã¯æ¶ç©ºã®D'Errorimã®äžçãæ»ããæããŸããã ä»åŸã®ç«¶æäŒã¯
ãã®ç©èªãç¶ããŸãã
競äºã®ã¿ã¹ã¯ã¯éåžžãå®éã®ãããã¿ã€ãã«åºã¥ããŠããŸããCTFã®ã¿ã¹ã¯ãšãµãŒãã¹ã®è匱æ§ã¯ãå®éã®ããŸããŸãªã·ã¹ãã ã«èŠãããŸãã PHDays CTF競æã¯ããªãªãžãã«ã®ã²ãŒã ã¡ã«ãã¯ã¹ã«ãšã£ãŠãèå³æ·±ããã®ã§ãããã²ãŒã ããã¬ã€ããããã®ããŸããŸãªç°ãªãæŠç¥ã®å®è£
ãå¯èœã«ããŸãïŒ
PHDaysã®Webãµã€ããåç
§ïŒã
éåžžãäž»å¬è
ã¯ããããã³ã°ã«çŽæ¥é¢ä¿ã®ãªãããŒã ã®ããã«ç°åžžãªã¿ã¹ã¯ãæºåããŸãã ããšãã°ãPHDays 2012ã§ã¯ãç¹å¥ãªãŽãç®±ã§ããŒãã¹ãã©ã°ãèŠã€ããããšã§è¿œå ãã€ã³ããç²åŸã§ããPHDays IIIã§ã¯ãã
ããã«ãŒè¿·è·¯ ã-ã¬ãŒã¶ãŒãã£ãŒã«ãã远跡ã»ã³ãµãŒãã·ãŒã¯ã¬ãããã¢ããã°ããã®ä»ã®èå³æ·±ããã¹ãã
ãããããã¡ãããäž»èŠãªãã€ã³ãã¯ãæ
å ±ã»ãã¥ãªãã£ã®ããŸããŸãªåé¡ã解決ããéçšã§ã®ã¿ç²åŸãããŸãã ãããã®ããã€ããèŠãŠã¿ãŸãããã
解æ
競äºã®è³æ Œæ®µéïŒPHDays CTF QualsïŒã¯ãã¿ã¹ã¯ããŒã¹ã®CTFã®ã¿ã€ããæããŸããã€ãŸããããŒã ã¯ã¿ã¹ã¯ã解決ãããã€ã³ããç²åŸããå¿
èŠããããŸãã ã¿ã¹ã¯ã¯ã次ã®ã«ããŽãªã®ããããã«åé¡ã§ããŸãã
- æ³å»åŠ-ã³ã³ãã¥ãŒã¿ãŒæ³å»åŠæ€æ»ã
- ãªããŒã¹ïŒãªããŒã¹ãšã³ãžãã¢ãªã³ã°ïŒ-ãã€ããªã³ãŒãåæã
- Pwn-è匱æ§ã®æªçšã
- 管çè
-管çã¹ãã«ã
- ãããã¯ãŒã¯-ãããã¯ãŒã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ãšãããã³ã«ã®ç¥èã
- æå·-æå·åã
- ã¹ãã¬ã-ã¹ãã¬ãã°ã©ãã£ãŒã
- PPCïŒããã®ããã°ã©ãã³ã°ãšã³ãŒãã£ã³ã°ïŒ-ãªãªã³ããã¯ããã°ã©ãã³ã°ã
- Web-Webè匱æ§ã®æ€çŽ¢ãšäœ¿çšã
- ãã®ä»-ãã®ä»ã
æåŸã®ã«ããŽãªããå§ããŸãããã
æçœã§ãªãã¯ãšã¹ã
MPDays IV CTF Qualsã®åå è
ã¯ã
mp3ãã¡ã€ã«ã«é ãããŠããã¡ãã»ãŒãžã解èªããããã«å¿
èŠãªã¿ã¹ã¯ã®1ã€ãšããŠã
ååãšããŠãåé¡ã®ç¶æ
ãã³ã³ãããŒã«é ãããã¡ãã»ãŒãžã®æœåºã«èšåããŠããå Žåãã¹ãã¬ãã°ã©ãã£ãŒã®åéããã®æ¢æã®ãœãªã¥ãŒã·ã§ã³ã®1ã€ã䜿çšãããŸãã ãã®å ŽåãçããèŠã€ããã«ã¯ãéåžžã埩å·åããããã°ã©ã ãéžæããæ£ããããŒã§å®è¡ããå¿
èŠããããŸãã ã€ãŸããç¹å®ã®ã¿ã¹ã¯ã解決ããéã®ãæåã®éµãã¯ãèè
ã«ãã£ãŠä»¥åã«èŠå®ãããé©åãªãªãã·ã§ã³ã®æ€çŽ¢ã«ãããŸãã
ç§ãã¡ã®å Žåããã¹ãŠãå€å°ç°ãªããŸãã ææ¡ããããã¡ã€ã«ãããã¹ããšãã£ã¿ã§éããšã次ã®ããã«ãªããŸãã
ãã¡ã€ã«ã®å
é ã«ã¯ãID3圢åŒã®ã¡ã¿ããŒã¿ããããŸãã æåã«TRCKïŒãã©ãã¯çªå·ïŒã¿ã°ãããã次ã«ããã€ãã®ããã¹ãããããŸãã
RGB7 5.183ãNULL RGB6 0.42,159 RGB5 194,244,68 RGB4 47,77,6 RGB3 44,73,141 RGB2 140,207,72 RGB1 120,156,203ãã®æ
å ±ã¯ã7ã€ã®ã¬ã³ãŒãïŒRGB7ããRGB1ãŸã§ïŒã«åå²ã§ããŸãã
RGB7 5.183ãNULL
RGB6 0.42.159
RGB5 194,244.68
RGB4 47.77.6
RGB3 44.73.141
RGB2 140,207.72
RGB1 120,156,203åRGBèå¥åã®åŸã«3ã€ã®å€ããããŸãã ãããã¯éåžžæ°å€ã§ãããããå Žåã«ã¯NULLã§ãã ããã¯ã¬ã³ãŒãã®é
åã§ãããåã¬ã³ãŒãã«ã¯æ倧3ã€ã®ã·ã³ã°ã«ãã€ãå€ãå«ãŸãããšä»®å®ããã®ã¯ç°¡åã§ãã ããšãã°ã次ã®ããã°ã©ã ã䜿çšããŠã10é²ã³ãŒããæåã«ãœãŒããçµåãå€æãã16é²ã§å°å·ã§ããŸãã
>>> a = [120,156,203, 140,207,72, 44,73,141, 47,77,6, 194,244,68, 0,42,159, 5,183]
>>> print "".join(map(chr, a)).encode("hex")
ãã®çµæã以äžãåŸãããŸãã
789ccb8ccf482c498d2f4d06c2f444002a9f05b7
16é²ã·ãŒã±ã³ã¹ã¯ãã³ãŒã0x78 0x9Cã®ãã€ãã§å§ãŸããzlibããŒã¿å§çž®ã¢ã«ãŽãªãºã ã䜿çšãããŠããããšãããããŸãã ããã©ã«ãã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠå§çž®ã¢ãŒãã§zlibã䜿çšããå Žåãåºåã·ãŒã±ã³ã¹ã¯ãããã®ãã€ãã§å§ãŸããŸãã
Pythonã®zlibã©ã€ãã©ãªã®è§£åæ©èœã1ååŒã³åºããšãããã¯ãããã¡ãã»ãŒãžã解åã§ããŸãã
>>> import zlib >>> print zlib.decompress("".join(map(chr, a)))
ãããŠãããã¹ãã衚瀺ãããŸãïŒ
i_hate_ucucuga倧äŒã®äž»å¬è
ã«éããªããã°ãªããªãã£ãã®ã¯ãã®æã§ããã
ç¡å¹ãªæå·å
ãã®å²ãåœãŠã¯ãCryptoã«ããŽãªã«å±ããŸãã äŒèª¬ã«ããã°
ãéä¿¡ã»ãã·ã§ã³ãååããããããããŒã ã¯éä¿¡ãããã¡ãã»ãŒãžã解èªããå¿
èŠããããŸãã
ãŸããããŒã亀æããŠããæå·åãããããŒã¿ãéä¿¡ããããã»ã¹ãã¯ã£ãããšèŠããŸãã ãã®ãããªéä¿¡ãæ§ç¯ã§ããæå·ã®åºç€ã«åºã¥ããŠç解ããå¿
èŠããããŸãã
ã¿ã¹ã¯ã¯marsãšåŒã°ããããã¯å€æŽãããRSAãæå³ãããšæ³å®ã§ããŸãã
åããŒã¯2ã€ã®éšåã§æ§æãããäž¡æ¹ã®å Žåã®2çªç®ã®éšåã¯0x010001 == 65537-RSAã®é »ç¹ã«äœ¿çšãããå
¬éææ°ïŒeïŒã§ãã ãã®ãããéä¿¡ã»ãã·ã§ã³ã§ã¯ãæåã«å
¬ééµã®äº€æïŒn
1 / e
1 ãn
2 / e
2 ïŒãããã次ã«ãããã§æå·åãããã¡ãã»ãŒãžã®äº€æïŒc1ãc2ïŒããããŸãã
ãããæ¬åœã«RSAã«äŒŒãŠããå Žåãci = powïŒm
i ãe
i ãn
i ïŒã m
1ãšm
2ãèŠã€ããå¿
èŠããããŸãã
pow-ã¢ãžã¥ã©ãŒã¹ãä¹ã®é¢æ°ãpowïŒvalãexpãmodulusïŒ== val
exp ïŒ
modulusã
RSAã¢ã«ãŽãªãºã ã«ãããšïŒ
- m i = powïŒc i ãd i ãn i ïŒã
- d i * e iâ¡1 modÏïŒn i ïŒã
- n iã¯ããã€ãã®çŽ æ°ã®ç©ã§ãã
- ÏïŒnïŒã¯ãªã€ã©ãŒé¢æ°ã§ãããèªç¶æ°ã®æ°ã¯nãšäºãã«çŽ ã§næªæºã§ãã
ã¿ã¹ã¯n
1ããã³n
2ã®é·ãã¯1535ãããã§ããã€ãŸããå æ°å解ïŒåçŽãªå åã«å解ïŒããããšã¯ã§ããŸããã
Pythonã®æ¡åŒµãŠãŒã¯ãªããã¢ã«ãŽãªãºã ã®å®è£
ã䜿çšããŸãã
def egcd(a, b):
æ°å€n
1ããã³n
2ã®GCDïŒæ倧å
¬çŽæ°ïŒãèŠã€ããŸãã
gcd = egcd(n1,n2)[0]
GCDïŒn
1 ãn
2 ïŒã®é·ãã¯1024ãããã§ãã æ°å€n
1ããã³n
2ã®ä»ã®çŽæ°ãèŠã€ããŸãã
p1 = n1 / gcd p2 = n2 / gcd
p
1ãšp
2ã¯512ãããã®çŽ æ°ã§ãgcdã¯1024ãããã®åææ°ïŒãããã512 * 512ïŒã§ãããå解ããã«ã¯å€§ããããŸã...
ç®çã®ã¡ãã»ãŒãžm
iãp
iãè¶
ããªãæ°ã§è¡šãããšãã§ããå ŽåãèããŸãã
n
i = p
i * q * rãšãããšã0 <m
i <p
iã®å Žåã次ã®åŒãæå¹ã«ãªããŸãã
powïŒm i ãe i ãn i ïŒïŒ
p i == powïŒm i ãe i ãp i ïŒæ¬¡ã«ã埩å·åã®ææ°d '
iã¯ã次ã®åŒãæºããå¿
èŠããããŸãã
e
i * d 'iâ¡1 modÏïŒp
i ïŒ
d '
iã®å€ã¯ã代æ°ã®è£æ°ãèšç®ããããšã§èŠã€ããããšãã§ããŸãã
d '
i = invmodïŒe
i ãÏïŒp
i ïŒïŒ
ãã©ã€ã p
iã®å Žåã
ÏïŒp
i ïŒ== p
i-1 ã
ãããã£ãŠïŒ
d '
i = invmodïŒe
i ãp
i-1 ïŒ
代æ°è£æ°ã®èšç®ã¯ãPythonã®æ¬¡ã®é¢æ°ã«ãã£ãŠå®è£
ãããŸãã
def invmod(a, m):
ãŸããæ°å€ãè¡ã«å€æããæåŸã®æåã\ 0ãããè¡æ«ãŸã§ã®ããã¹ãã®ã¿ãæ®ãé¢æ°ãå¿
èŠã«ãªããŸãã
def showX(v): print ("%0256X" % v).decode("hex").split('\0')[-1]
diãèšç®ãã埩å·åãå®è¡ããŸãã
d1 = invmod(e, p1-1) d2 = invmod(e, p2-1) showX(pow(c1, d1, p1)) showX(pow(c2, d2, p2))
ãããŠçµæãåŸãããŸãïŒ
ãªã¯ãšã¹ãïŒGET_FLAGïŒçœ²åïŒ5e2d5e0323591b1cïŒã
å¿çïŒits_n0t_ab0ut_p4dd1ng
ãã©ã°ã¯æååã
its_n0t_ab0ut_p4dd1ng
ãã§ãã
CCCæå·å²ãåœãŠ
æå®ïŒecc.pyããã³task.pyãã¡ã€ã«ãå«ãsource.tar.gzã¢ãŒã«ã€ãã«ã¯
ãæ¥åæå·ã䜿çšããŠå®è£
ãã
ãããŒæ€èšŒ
ã¹ããŒã ãå«ãŸããŸãã ã¢ãã¬ã¹195.133.87.171ã§ããŒã5555ã«æ¥ç¶ããããšã«ããããµãŒããŒãšã®æ¥ç¶ã確ç«ã§ããããšãç¥ãããŠããŸãã
nc 195.133.87.171 5555
password: secch4l*
ãœãŒã¹ãæäŸãããŠãããããåæããå§ãã䟡å€ããããŸãã å®è¡ããããšãã§ããŸãã
libnumã¢ãžã¥ãŒã«ããªãã£ããããèªåã§äœæããå¿
èŠããããŸããã åè¿°ã®ã¢ãžã¥ã©ãŒå転ã®æ©èœãšãããã«ãã£ãŠäœ¿çšãããæ¡åŒµãŠãŒã¯ãªããã¢ã«ãŽãªãºã ãå®è£
ããã ãã§ååã§ãã
def egcd(a, b):
ãããã£ãŠã
task.py
ã®
main
é¢æ°ïŒ
def main(): print "Auth:â auth = raw_input() if hashlib.sha1(auth).hexdigest() != "375d5c01ca1b8c3863024d10aac7713472eb5033": # secch4l* print "nopeâ return prefix = os.urandom(8) print "Proof of work, pleaseâ print "Prefix is (hexed) ", prefix.encode("hex") test = raw_input().decode("hex") if not test.startswith(prefix) or len(test) > 16: print "nopeâ return h = hashlib.sha1(test).hexdigest() if not h.startswith("000000"): print "nopeâ return goflag()
è¡ãèªã¿åãããŸããSHA-1ã¯ãæå®ãããå€ïŒ "secch4l *"ïŒãšçãããªããã°ãªããŸããã
次ã«ãã©ã³ãã ãª8ãã€ãã®ãã¬ãã£ãã¯ã¹ãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããŸãã ãã€ãã¯16é²æååãšããŠãšã³ã³ãŒããããŸãã å¿çãšããŠãã¯ã©ã€ã¢ã³ãã¯æå®ããããã¬ãã£ãã¯ã¹ã§å§ãŸãããã«16ãã€ã以äžã®æååãéä¿¡ããå¿
èŠãããããã®æååã®SHA-1å€ã®æåã®3ãã€ãã¯ãŒãã§ãªããã°ãªããŸããã ãã¹ãŠã®ã¹ããããæåãããšãgoflagïŒïŒé¢æ°ãåŒã³åºãããŸãã
次ã®ã³ãŒãã¯ããµãŒããŒã«æ¥ç¶ãããã¹ã¯ãŒããéä¿¡ãããã¬ãã£ãã¯ã¹ãåä¿¡ããå¿çãèšç®ããŠéä¿¡ããŸãã
def readLn(sock): a = [] while True: c = sock.recv(1) if '\n' == c: return "".join(a) a.append(c) HOST = "195.133.87.171" PORT = 5555 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) print readLn(sock)
ã¯ã©ã€ã¢ã³ãåŽã§ãã®ã³ãŒããå®è¡ããåŸããµãŒããŒã¯goflagïŒïŒé¢æ°ãå®è¡ãã次ã®ããã¹ãã衚瀺ããŸãã
ECãã¹ã¯ãŒããã§ãã¯
R = 572115218124168948525078362547166172445820217705568707355669424304224832114
å
±æç§å¯= R ^ãã¹ã¯ãŒã
æå·åãããã¡ãã»ãŒãžïŒ7a93846a011e0d0382e94f32d705239e6298169dcec20da5d6goflag
é¢æ°ã§äœãèµ·ãããïŒ
def goflag(): print "EC PASSWORD CHECK" r = random.randint(31337, 1 << 250) R = p256.power(G, r) print "R =", R print "SHARED SECRET = R ^ PASSWORD" S = p256.power(R, PASSWORD) key = p256.derive(S) cipher = encrypt(FLAG, key) print "ENCRYPTED MESSAGE:", cipher.encode("hex")
æ¥åæ²ç·ã®é察称æå·åã䜿çšãããŸãã NISTãæšå¥šããP-256æ²ç·ãéžæãããŠããŸãã ã«ãŒããã€ã³ãã«å¯Ÿããæäœã®å®è£
ã«ã¯ãæãããªè匱æ§ã¯å«ãŸããŠããŸããã
Rã®å€ã¯ç¥ã£ãŠããŸãããPASSWORDïŒpassword.txtãã¡ã€ã«ãããµãŒããŒã«ãã£ãŠèªã¿åãããïŒã®å€ãããããªããšãSãèšç®ã§ããŸãããSãç¥ã£ãŠãããšãããŒãç°¡åã«èšç®ã§ããŸãã æå·åã¯ãšã©ãŒã§å®è£
ãããŠããã®ã§ããããïŒ
task.py
ã®
encrypt
æ©èœïŒ
def encrypt(msg, key): iv = os.urandom(8) stream = hashlib.sha256(iv + key).digest() stream = hashlib.sha256(stream + iv + key).digest() cipher = iv + xor(msg, stream) return cipher
ãã®ã³ãŒãã¯ãæå·åãããã¡ãã»ãŒãžã®åã«ã©ã³ãã ãª8ãã€ãã®åæåãã¯ãã«ivãããã2ã€ã®SHA-256èšç®ã®åºåãšããŠã¬ã³ããçæãããXORãã©ã°ãšããŠæå·åãå®è¡ãããããšã瀺ããŸãã ããŒã®æå³ãç¥ããªããŠããã¬ã³ããååŸããã®ã¯éçŸå®çã§ãã ããããããã°ã©ã ã§ããŒã¯ã©ã®ããã«ååŸãããŸããïŒ
task.pyã®æŽŸçé¢æ°ïŒ
def derive(self, p): return hashlib.sha256(str((p[0] << 10) / p[1])).digest()
ãã€ã³ãSã®å€ïŒxãšyã®2ã€ã®åº§æšã§æ§æãããïŒãå
¥åSHA-256ãšããŠäœ¿çšãããããšãããããŸãã å®éãstrïŒintïŒx * 1024 / yïŒïŒãããã·ã¥å
¥åã«æäŸãããŸãã xãšyã¯å€ãè¿ãïŒãããã¯å€§ããªæŽæ°ã§ããïŒãããç®è¡æŒç®ã®çµæã¯1024ã«è¿ãã¯ãã§ãïŒãã ããæ°åãããè¶
ããããšããããŸãïŒã
ãããã£ãŠã掟çé¢æ°ã®ç¹å®ã®å®è£
ã«ãããããŒå€ã¯éåžžã«å°æ°ã®ç¶æ
ããšãããšãã§ããŸãã ããããã¹ãŠãåçŽã«ãœãŒãããåããŒã®ã¡ãã»ãŒãžã埩å·åããŠã¿ãŠãã ãããå°å·ãããæåã®ã¿ã§æ§æãããŠããå ŽåãæåããŠããŸãã
import hashlib, ecc enc = "7a93846a011e0d0382e94f32d705239e6298169dcec20da5d6".decode("hex") iv = enc[:8] def decrypt(key): stream = hashlib.sha256(iv + key).digest() stream = hashlib.sha256(stream + iv + key).digest() return ecc.xor(enc[8:], stream) for i in xrange(0x7FFFFFFF): s = decrypt(hashlib.sha256(str(i)).digest()) for c in bytearray(s): if c < 32 or c >= 128: break else: print s
ãããã£ãŠããã©ã°ã¯ãecc_is_too_s3cureããšããè¡ã§ãã
ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã Shadelt900
ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã¯ãå¥ã®äžè¬çãªãžã§ãã«ããŽãªã§ãã CTFã«å ããŠãBest Reverserã³ã³ãã¹ãã¯PHDaysã³ã³ãã¹ãããã°ã©ã ã«å«ãŸããŠããŸãã
Shadelt900ã®å²ãåœãŠã¯ãåã®3ã€ãšåæ§ã«ã2014幎1æã«éå¬ãããPHDays IV CTF Qualsããã°ã©ã ã®äžéšã§ããã ããŒã ã¯ãderrorim_enc.bmpããšããç»åã埩å·åããå¿
èŠããããŸããã æå·åã«äœ¿çšããããŒã«ã¯Shadelt9000.exeãšåŒã°ããŠããŸãããã埩å·åããŒã«ãèŠã€ãããŸããã§ããã ãããç»åã§ãïŒ
Shadelt9000.exeãã¡ã€ã«ãããèŠããšãã¢ããªã±ãŒã·ã§ã³ãOpenGLã䜿çšããŠããããšãæããã«ãªããŸãã èäœæš©ã€ã³ãã¬ãŒã1.2.8 Copyright 1995-2013 Mark Adlerãããããã®ããã°ã©ã ãäžè¬çãªzlibå§çž®ã©ã€ãã©ãªã䜿çšããŠããããšã瀺ããŠããŸãã
zlibé¢æ°ã®åŒã³åºãå
ã®éã¢ã»ã³ãã©ãèŠããšããã®ãããªã³ãŒããããã«èŠã€ãããŸãã
ã¢ãã¬ã¹0x47F660ããã³0x47F7B8ã«ã¯ãzlibã«ãã£ãŠããã¯ãããããŒã¿é
åããããŸãã ããããé梱ããŸãã
from zlib import decompress as unZ base = 0x47C000 - 0x7AE00
解ååŸã1.txtãã¡ã€ã«ã«ã¯ãã¯ã»ã«ã·ã§ãŒããŒãå«ãŸããŠããŸãã
2.txtãã¡ã€ã«ã«ã¯é ç¹ã·ã§ãŒããŒãå«ãŸããŠããŸãã
attribute vec3 a_param; varying vec4 texCoord0; varying vec3 v_param; void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; texCoord0 = gl_MultiTexCoord0; v_param = a_param; }
ãã¯ã»ã«ã·ã§ãŒããŒã«é¢ããäž»ãªæ
å ±ã¯èµ€ã§åŒ·èª¿è¡šç€ºãããŠããŸãã
å€æ°tã¯ãåŠçããããã¯ã¹ãã£ïŒå
¥åãã¡ã€ã«ïŒã®çŸåšã®èŠçŽ ã§ããããšãããããŸãã
å€æ°gã«ã¯ãçŸåšã®ã¬ã³ãèŠçŽ ïŒæ¬äŒŒã©ã³ãã ãªæ¹æ³ã§çæãããïŒã
å€æ°sã«ã¯ãåŸã§sã®åŸªç°ã·ããã«äœ¿çšãããå€ããããŸãã
åºåå€ã¯å®éã«ã¯æ¬¡ã®ããã«èšç®ãããŸã
(rol(t,s) ^ g)
ããã«ãåãå
¥åãã¡ã€ã«ã§ããã°ã©ã ãè€æ°åå®è¡ãããšãåèŠçŽ ã®gã®å€ã¯éå§ããéå§ãŸã§å€åããtãšsã¯åããŸãŸã§ãã
ã¬ã³ãã®çææ¹æ³ã確èªããŸãã
unsigned char *pbGamma = malloc(cbGamma); srand(time(0)); for (i = 0; i < cbGamma; i++) { pbGamma[i] = rand(); }
çŸåšã®æå»ã«äŸåããŠããããšãããããŸãã
å
ã®ã¢ãŒã«ã€ããããderrorim_enc.bmpãã¡ã€ã«ã2014幎1æ21æ¥18æ37å52ç§ã«äœæãããããšãããããŸãã
ãã®æç¹ã§timeïŒïŒé¢æ°ãè¿ãå€ãååŸããŸãã
>>> import time >>> print hex(int(time.mktime((2014,1,21, 18,37,52, 0,0,0))))
0x52de8640次ã«ãShadeIt9000.exeãã¡ã€ã«ãShadeIt9000_f.exeã«ã³ããŒããŠä¿®æ£ããŸãã
ãªãã»ãã00015557ã§ãã€ããå¿
èŠ
E8 A5 31 01 00
ã«çœ®ãæãã
B8 40 86 DE 52
ããã¯ã眮æãšåçã§ã
mov eax,52de8640h
ãŸãã
ãããã£ãŠãShadeIt9000_fã®ããŒãžã§ã³ãååŸããŸãããããã¯ã察象ã®ãã¡ã€ã«ãæå·åããããšããšåãè²åã§åžžã«æå·åãããŸãã
次ã«ãç»åã®è§£èªã«åœ¹ç«ã€å€ãæºåããå¿
èŠããããŸãã
import os bmp=open("derrorim_enc.bmp", "rb").read() hdr = bmp[:0x36] abData = bytearray(bmp[0x36:]) cbBody = len(bmp) - len(hdr) open("00.bmp", "wb").write(hdr + '\0'*cbBody) open("XX.bmp", "wb").write(hdr + '\2'*cbBody) os.system("ShadeIt9000_f.exe 00.bmp") os.system("ShadeIt9000_f.exe XX.bmp")
00_enc.bmpãã¡ã€ã«ã«ã¯ããŒããã€ãã§æ§æãããç»åã®æå·åã®çµæãå«ãŸããŸãã ããã¯ãæãçŽç²ãªåœ¢åŒã®ã¬ã³ãã«ãªããŸãã
XX_enc.bmpãã¡ã€ã«ã«ã¯ãå€2ã®ãã€ãã§æ§æãããç»åã®æå·åçµæãå«ãŸããŸããããã«ãããåãã€ãã埪ç°çã«ã·ãããããããæ°ãããããŸãã
æåŸã«ãShadelt9000ã埩å·åããŸãã
def rol(v,i): return (((v<<i) & 0xFF) | ((v>>(8-i)) & 0xFF)) def ror(v,i): return (((v>>i) & 0xFF) | ((v<<(8-i)) & 0xFF)) dRot = {rol(1,i):i for i in xrange(8)} bmp=open("derrorim_enc.bmp", "rb").read() hdr = bmp[:0x36] abData = bytearray(bmp[0x36:]) abGamma = bytearray(open("00_enc.bmp", "rb").read()[0x36:]) abRot = bytearray(open("XX_enc.bmp", "rb").read()[0x36:]) for i,b in enumerate(abGamma): abRot[i] = dRot[abRot[i] ^ b] for i,b in enumerate(abGamma): abData[i] = ror(abData[i] ^ b, abRot[i]) open("derrorim.bmp", "wb").write(hdr + str(abData))
ç§éã¯åŸãïŒ
ã¿ã¹ã¯ã解決ããããã®æ£ããæ¹æ³ã§ãããæãå¹æçã§ã¯ãããŸããã ãã£ãšçãæ¹æ³ããããŸãã
ã¢ãã¬ã¹0x47F848ããã³0x47F9A0ã®é ç¹ã·ã§ãŒããŒã®ããåŸãã«ããã¯ã»ã«ãšé ç¹ã·ã§ãŒããŒã®ããã¯ãããzlibã³ãŒãããããéå€æãå®è¡ããŸãã ããããã圌ã¯èª€ã£ãŠã¿ã¹ã¯ãã¶ã€ããŒã«å¿ããããŠããã®ã§ãããã ãŸãã¯ãæå³çã«æ®ããŠããããšãã§ããŸãã
æå·åãšåŸ©å·åã®é ç¹ã·ã§ãŒããŒã³ãŒãã¯åäžã§ããããããããã«è§ŠããŠãæå³ããããŸããã ãã¯ã»ã«ã·ã§ãŒããŒã亀æãããšã©ããªããŸããïŒ
ShadeIt9000_f.exeãShadeIt9000_d.exeã«ã³ããŒããŠä¿®æ£ããŸãã
00015775: 60 F6 ==> 48 F8
次ã«ãShadeIt9000_d.exe derrorim_enc.bmpãå®è¡ããŸãã ãããŠã埩å·åããããã¡ã€ã«derrorim_enc_enc.bmpã®åºåãååŸããŸããããã¯ïŒå°ããªã¢ãŒãã£ãã¡ã¯ããé€ãïŒPythonã¹ã¯ãªããã§åŸ©å·åããããã®ãšäžèŽããŸãã
ä»æ¥ã¯ä»¥äžã§ãïŒ ãæž
èŽããããšãããããŸãããã³ã¡ã³ãã®è³ªåã«ãçãããŸãã
PHDays IV CTFã®ãã¡ã€ãã«ã¯5æ21æ¥ãš22æ¥ã«Positive Hack Daysãã©ãŒã©ã ã§éå¬ãããŸãã 競æã®é²è¡ç¶æ³ããµã€ãäžã§çŽæ¥ç£èŠã§ããã ãã§ãªããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠç£èŠããããšãã§ããŸãã
ãã¥ãŒã¹ã«åŸã£ãŠãã ããïŒ
ãŸãèªãïŒPHDays IVã®ãªã³ã©ã€ã³ã³ã³ãã¹ã
HashRunnerãšã
Competitive Intelligence ããžã®åå ãæ¢ã«ç»é²ãããŠããããšããç¥ããããŸãã
PSãã¹ãŠã®PHDays CTFããã³CTF Qualså²ãåœãŠã®ã¢ãŒã«ã€ãã¯
ãPHDays Webãµã€ãã§èŠã€ããããšãã§ããŸãã ã ãããããªããèªåèªèº«ããã¹ããããã®ã§ããã°ãå
ã«é²ãã§ãã ããïŒ
PPSãã®ãããã¯ã§ç€ºãããŠããã¿ã¹ã¯ã®è©³çŽ°ãªåæã¯ãDmitry Sklyarovãäž»å¬ããç¹å¥ãªãŠã§ãããŒã§è¡ãããŸããã ãŠã§ãããŒãšã³ããªã¯ã
http ïŒ
//my.webinar.ru/record/290241/ã§å
¥æã§ããŸãã