pwnable.kr WP合集


[fd]

  1. 通过ssh连接到服务器后,通过"ls -l"发现当前目录下的三个文件,其中fd文件为可执行,fd.c为源代码,flag为答案文件,但无可读权限。
  2. 通过审计源代码可知,程序首先判断输入参数个数是否小于2,不小于则进入下一步。
  3. 将输入的第二个命令行参数减去0x1234,然后再将减去后的值赋给fd,同时将fd作为文件描述符读取32个字节的内容。通过查询可知标准输入stdin的文件描述符是0,即输入的第二个命令行参数减去0x1234,转换成十进制数就是4660,值为0则开始进入标准输入,故一开始输入的第二个命令行参数应为4660。
  4. 接下来开始标准输入,通过审计源代码可知此处的输入会与字符串"LETMEWIN"比较,如果相等则执行system("/bin/cat flag")读取到flag,故此处输入内容为LETMEWIN。

最终输入的命令依次如下:

./fd 4660
LETMEWIN

[collision]

  1. 通过ssh连接到服务器后,通过"ls -l"发现当前目录下的三个文件,其中collision文件为可执行,collision.c为源代码,flag为答案文件,但无可读权限。
  2. 通过审计源代码可知,程序首先判断输入参数个数是否小于2,不小于则进入下一步。然后判断输入内容是否为20个字节长度,如果长度不对出现提示信息。
  3. 输入的20个字节(数据类型为char)会分为5段,每段长度为4个字节(数据类型为int),如果这5个int型数据相加等于hashcode的0x21DD09EC,即十进制的568134124,则执行system("/bin/cat flag")读取到flag,故需要按照要求构造这个20字节的字符串。
  4. 由于0x00会出现截断问题,所以最简单的方式就是构造4个“\x01\x01\x01\x01”和1个“\x1DD905E8”(因为hashcode (0x21DD09EC) -0x1010101 * 4 = 0x1DD905E8),根据小段存储的原则,需要注意输入顺序。

最终输入的命令如下:

./col `python -c "print '\x01\x01\x01\x01' * 4 + '\xe8\x05\xd9\x1d'"`

[bof]

  1. 通过审计源代码可知,由于程序直接使用gets函数,存在栈溢出漏洞。通过分析程序,得知程序会判断key是否等于0xcafebabe,但由于程序输入内容并不传到变量key,所以需要通过栈溢出漏洞将输入内容覆盖变量key的内容,从而使判断结果为等于,进入shell程序。使用ida分析程序,输入内容与参数距离为44+8=52(0x2C+0x08),如图所示:

最终exp的python程序如下:

1 from pwn import *
2 
3 f = remote('pwnable.kr',9000)
4 
5 payload = 'a'*52 + '\xBE\xBA\xFE\xCA'
6 
7 f.sendline(payload)
8 
9 f.interactive()

相关