---
# System prepended metadata

title: Canary

---

# Canary

checksec
![Screenshot_2025-07-30_08_28_08](https://hackmd.io/_uploads/r1cqckDDxg.png)

有開啟NX及Canary

使用IDA觀察main
![image](https://hackmd.io/_uploads/SJ2rsJvDgl.png)

進入vuln()
![image](https://hackmd.io/_uploads/SyeFs1DDxg.png)

v3就是canary，會在函數開始時寫在stack的尾端，並在return的時候檢查是否改變，用意是避免stack overflow導致return address遭竄改。

想要繞過canary保護有兩種方式，如果寫入的stack位址在canary之後，可以直接寫return address，但如果在canary之前，就必須先leak出canary的值，並在寫入時將正確的值寫到正確的位置

中間的for迴圈會執行兩次，會寫入buf最多0x200的長度，再印出buf

這邊要注意，read跟printf都會被\x00截斷，所以要寫入"適當"長度的字串才能leak出canary

buf長度為104，後方依序為canary、rbp、return address

以104個a為payload送出，進入dbg觀察
![Screenshot_2025-07-30_09_54_30](https://hackmd.io/_uploads/B1-Xhgvwxx.png)

canary第一位是\x00，所以如果只塞104，會印不出canary

leak出canary後，透過第二次的read寫入payload

p.sendline(b"b"*104+p64(canary)+p64(rbp)+p64(elf.symbols['getshell']))