---
# System prepended metadata

title: 10002-modohayaku

---

# 10002-modohayaku


## Intro
shellcode with validation on some bytes

## Deposit

<!-- var_8 = i -->
<!-- ![](https://i.imgur.com/8E0tqLd.png) -->

打開程式隨便亂 key 資料發現不會 overflow，先來反編一下。
> 這裡不知為啥 IDA 沒辦法 F5 編出東西，用 Ghidra 就可以
![](https://i.imgur.com/cgbUhqI.png)

可以發現一開始用 read 固定讀 176 個字元，不會 overflow

接下來的檢查滿有趣的：
- 先看輸入有沒有任何 `\x90`(nop)，有的話會嫌你太慢把你幹掉
- 再來依照以下規律檢查，若 i 代表第幾個數：
    - $i\ mod\ 11 == 0$ 時，該字元為 `\x0c`
    - $i\ mod\ 11 == 1$ 時，該字元為 `\x87`
    - $i\ mod\ 11 == 2$ 時，該字元為 `\x63`
    - 上述條件每輪檢查一次，每次三個條件需要至少完成一個，否則會說你用錯劍技一樣把你幹掉
    > FAIL:  
    > ![](https://i.imgur.com/0aHiSXK.png)
    > PASS:   
    > ![](https://i.imgur.com/LESJDNX.png)
    > PASS:  
    > ![](https://i.imgur.com/rc0bbyN.png)

如果成功通過以上檢查，系統會直接把你的輸入當 code 來跑。

意圖明顯。我們需要編制一個符合條件的 shellcode。
首先我們先找能開 bash 的 shellcode：

![](https://i.imgur.com/2QMXXlT.png)
> https://www.exploit-db.com/shellcodes/46907


想辦法在不影響核心功能的情況下符合那些麻煩的 `no-noop`, `0c8763` 條件：  
像`test` 不會動到任何 reg，只會標 flag ，就滿適合我們需求的  
- 8545**63** test
- 8545**87** test
- a9**63636363**

這裡我用 try-and-error 慢慢試，試了一整天，真是謝謝喔我就爛。


![](https://i.imgur.com/EkwiOqS.png)


![](https://i.imgur.com/gYNxuZj.png)



---

###### flag
`ADL{574r8ur57_57r34m!!!https://youtu.be/jUuknk81n2w}`