Reverse-1

點兩下check_password來看這個函數的內容

Reverse-2
和上題一樣點兩下check_password來看這個函數的內容

雖然看到flag了但有點空,把程式的邏輯寫出來
int main()
{
cin.tie(0)->sync_with_stdio(false);
string s;
cin >> s;
reverse(s.begin(), s.end());
/* equal
for(int i = s.size()-1, j = 0; j < i; i--, j++)
{
swap(s[i], s[j]);
}
*/
if(s == "}em4n3r{3SIA")cout << "Correct!";
else cout << "Wrong!";
}
Reverse-3

按Tab跳到組語
編輯組語

(上面的等式我也稍微改了一下)

儲存變更

Rev-HW-01
按 X 來看變數在哪裡被引用

Rev-HW-02

凱薩密碼 shift=1
可以直接用肉眼看外加一點點通靈 (_ + 1 == `)
AIS3{n0t_r4w_str}
(還是驗證一下比較好)

Rev-HW-03

兩兩交換

Rev-HW-04


點兩下看expected裝什麼

Rev-HW-05
他有多層防護
- 字串長度 == 64
- 字串的前 16 位要和 v3 相等
解法:所以只要直接在開場就呼叫win()就好


Rev-HW-06
第零關

這個等式永遠不成立第一關

- v2 = (a1 長度 > 31) + (a1[0] == 127)
- v2 -= 100*(v2 == 79218/3 == 26406)
- v2 == 2的話進入第二關
只要滿足(a1 長度 > 31) && (a1[0] == 127)即可
第二關

a1取最長不含0的前綴子字串的每個字元的合 == 10794
即可獲勝
統整一下要達成什麼
- len(a1) > 31
- a1[0] == 127
- a1取最長不含0的前綴子字串的每個字元的合 == 10794
就這樣而已嗎(?)
還有一個隱藏關卡

只能有63個字元
這是 Reverse 的最後一題了 接下來就是 Pwn
所以來直接用 pwn-tool 解吧
import pwn
r = pwn.process('00-challenges/AIS3-jr/hw/reverse/hw06.out')
del_char = b'\x7f'
max_char = b'\xff'
r.send(del_char + max_char*41 + b'\xd4' + b'\000'*64)
# 後記: r.sendline(del_char + max_char*41 + b'\xd4') 會更好
print(r.recvall())
