# 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']))