攻防世界 string

2021-10-04 06:52:15 字數 1843 閱讀 3580

這回終於做上了一道像乙個小系統一樣的題,有很多輸入輸出,程式邏輯也複雜了一點,比賽中我看都是這樣的題,一直以來遇到這樣的題都是不知所措,從這一道開始練手把

這是乙個文本版rpg game…

一開始看main函式看不出來什麼,注意到輸出了secret

輸出secret之後進入另乙個函式,將v4的值傳了進去

然後讓輸入名字,這裡好像沒有溢位,名字長度小於12

輸入名字之後進入三個函式的第乙個,開始敘述故事

到了while迴圈裡讓輸入往東還是往上走,輸入east進行下去,輸入up死迴圈。輸入別的就退出了

回到前面,進入第二個函式

讓輸入1還是0,1的話進入if,之後發現有個格式化字串漏洞,還不知道怎麼用

看第三個函式

輸出一堆然後要讓*a1a1[1]才能進入if,而這裡的a1就是main函式那個v4,

成功進入if後mmap分配一塊記憶體,mmap的第乙個引數是0,看網上說第乙個引數是null的話就是隨機分配一塊合適位址,這裡的0估計差不多吧,分配了很大地方之後,read進100,後面有乙個 ((void (__fastcall *)(_qword, void *))v1)(0ll, v1);,粗略的查了一下就是應該就是乙個call函式,呼叫以v1為指標的函式

那這就可以想到,read輸入進一串shellcode,然後他自己就呼叫了

問題是如何讓*a1a1[1],也就是*v4==v4[1]

回去再看main函式

v3是乙個dword的指標,,然後v3 malloc申請了8個unsign long long 的地方,也就是兩個64位int的位置

v4是乙個64位int,然後v3(強制轉換為了int64格式)的值傳給了v4,相當於v4裡面存的是第乙個64位int的位址

所以後面輸出了兩個secret就是這兩個64位整數的位址

之前的*a1 == a1[1],也就是判斷和兩個數相當於否

可用的漏洞只有乙個格式化字串,應該把第乙個數或者第二個數覆蓋為二者中另乙個數,在傳入shellcode就行了

一.網上很多wp的方法

網上的方法是利用printf之前的scanf輸入位址那一步,把v4位址傳進去,之後printf的時候這個引數偏移計算之後就是第7個引數,再通過%c和%n寫進去數,這也是這個題目搭好的台階。

可是我有個疑問:檢視棧之後發現scanf("%lld")這樣傳進去的數是大端存放的,這樣也能用於代表位址嗎?

二.我的想法是只用printf,把兩個位址和格式化字串函式都放入棧中,再用

偏移找,不過怎麼試都不行,所以還是上網找了答案。可能**不對吧,如果有明白的請指教。

攻防世界mfw 攻防世界 Web mfw

題目資訊 image.png 工具 githack,dirsearch 知識點 git漏洞 審計 開啟題目場景,檢查 發現這樣乙個頁面 image.png 訪問.git目錄,疑似存在git原始碼洩露 image.png 再用dirsearch掃瞄,發現git原始碼洩露 使用 githack獲取原始碼...

攻防世界Web lottery

開心!雖然第一次遇到git原始碼洩露寫了好久,但是寫出來了就很開心 開啟介面我們知道,要拿到flag,就要贏到足夠的錢,其實一開始我以為可以找到乙個地方直接修改餘額什麼的,把網頁源 中的檔案看了幾個都沒發現突破口 然後又沒思路了 嘗試了一下robots.txt,想看看有沒有什麼檔案,然後發現了 瞬間...

攻防世界 xctf Guess writeup

本題的解析官網上有,這裡是乙個自動化的指令碼,完成的是自動上傳乙個ant.jpg的檔案 ant.jpg是乙個ant.zip壓縮包重新命名的檔案,裡面是乙個ant.php的一句話木馬 執行返回的是在web後台這個檔案重新命名後的檔案的url。可通過zip偽協議訪問這個木馬。指令碼如下 import r...