日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

攻防世界Reverse进阶区-EasyRE-writeup

發布時間:2023/12/14 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 攻防世界Reverse进阶区-EasyRE-writeup 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 介紹

本題是xctf攻防世界中Reverse的進階區的題EasyRE。

下載下來以后是一個exe文件:210f1e18ac8d4a15904721a2383874f5.exe

2. 分析

首先看下文件格式為windows 下的32位程序

$ file 210f1e18ac8d4a15904721a2383874f5.exe 210f1e18ac8d4a15904721a2383874f5.exe: PE32 executable (console) Intel 80386, for MS Windows

先在windows下運行一下,輸入時提示:input:,輸入以后按下回車卻沒有輸出。

2.1 靜態分析

先拖進IDA 里看看吧!找到之前命令行中的提示字符串 input ,找到交叉引用該字符串的地方為函數sub_401080。(在查看strings windows的時候眼前一亮發現有個 flag{NP2NiaNXx1ClGYVQ50} ,但是輸入以后發現并不是真正的flag…

F5查看函數sub_401080的偽代碼。字符串 input 的地址為0x402150,結合代碼,可以判斷sub_401020函數為printf函數。再往下發現地址0x402158開始的字符串為%s,說明sub_401050應該是scanf函數,將用戶輸入保存到v7中。


得到輸入以后,對v7的長度進行檢查,從代碼中可知v7長度必須為24個字符。

接下來以 v8地址+7 位置處的字符賦值給v2,根據IDA的分析提示,v7的起始地址為ebp-24h(ebp-36), v8的起始地址為ebp-14h(ebp-20)。假設我輸入的是abcdefghijklmnopqrstuvwx ,那么在棧中應該是下面的情況。也就是v2的初始值是用戶輸入的最后一個字符x。

高地址ebp-13x
|ebp-14w
|
|ebp-20q
|
ebp-35b
低地址ebp-36a

每次循環中通過v1控制對用戶輸入字符串的遍歷,將v2的值賦值給v3,然后v2地址自減1,也就是逆序取下一個字符。將v3保存的當前字符賦值給數組 byte_40336C[v1]。所以這個部分其實就是逆序提取用戶輸入,保存到數組byte_40336C的過程。


接下來對數組byte_40336C的每個值x進行 (x+1)^6的操作。


最后將數組byte_40336C,也就是一個字符串,與地址0x402124開始的字符串進行比較。如果相同,即strcmp返回值為0,則調用printf函數輸出 right\n

雙擊unk_402124,選中24個字符,按下 Shift + E 提取,選擇 string literal ,得到的字符串為: xIrCj~<r|2tWsv3PtI\x7Fzndka 。

至此,整個程序的邏輯很清楚了:

  • 在第1個部分中,讀取用戶輸入
  • 在第2部分中,判斷用戶輸入的長度。逆序提取用戶輸入,保存到數組中(其實是個字符串)
  • 在第3部分中,對數組每個值x進行 (x+1)^6的操作
  • 在第4部分中,檢查得到的數組(字符串)與xIrCj~<r|2tWsv3PtI\x7Fzndka 是否相等,相等則成功解決。

用python寫腳本逆出正確的輸入 flag{xNqU4otPq3ys9wkDsN}:

# user_input逆序,存到arr數組中 # arr中的每個字符,進行 (each+1)^6 的操作 # 將arr與target比較,相同的時候輸出"right" res = "" for each in target:tmp = (ord(each) ^ 6) - 1 # 異或的優先級!!tmp_char = chr(tmp)# print("tmp:{}, tmp_char:{}".format(tmp, tmp_char))res += tmp_charres = res[::-1] print("flag:", res) # flag{xNqU4otPq3ys9wkDsN}

編寫腳本的過程中有兩個需要注意的:

  • 異或運算的逆運算還是異或,比如:
  • x = 5 y = x^6 # 3, 0b101 ^ 0b110 => 0b011# 已知y,求x x = y^6 # 0b011 ^ 0b110 => 0b101
  • 異或運算的優先級是低于減號的:
  • 5^6 -1 # => 0 (5^6) -1 # =>2

    2.2 動態調試

    一開始逆序提取那個部分有點迷,主要是不清楚那個v8的含義,也沒注意到IDA在函數的前面有提示v8的地址。于是我通過Ollydbg動態調試幫助理解。

    首先需要在動態調試過程中定位之前IDA分析的sub_401080函數。可以用字符串來定位。

    也可以通過程序運行的方式來定位:
    運行到0x1A134E時,控制臺輸出了 input:,說明這里可能就是我們需要分析調試的地方,但是不知道是printf函數還是就是IDA里的sub_401080函數。因此我輸入以后直接F8運行,發現沒有經過之前分析過的循環邏輯,程序就終止了。說明0x1A134E調用的函數應該是sub_401080函數。

    在0x1A134E按F2 打斷點,按ctrl+F2 重新運行。當再次運行到這里的時候,按F7 也就是Step Into,進入到函數中去調試。

    0x1A1080就是sub_401080函數的起始地址。

    需要分析IDA中 v2 = (char *)&v8 + 7; 的值是什么。通過調試可知是輸入的最后一個字符開始,也就是x

    3. 總結

    可以根據輸出字符串找到需要分析的函數,然后通過靜態分析尋找用戶輸入在函數中的變換,如果有不懂的先跳過,后續用Ollydbg動態調試輔助理解。先對整個函數的邏輯,每個塊的作用有個宏觀的了解。

    總結

    以上是生活随笔為你收集整理的攻防世界Reverse进阶区-EasyRE-writeup的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。