学习一下攻防世界pwn专题😂
level0
首先用checksec查看一下保护
是一个64位的程序,开了NX防护(堆栈不可执行)
这边有个system()函数
在这个函数中,buf分配了128个字节,但是read()函数中,我们却可以传入0x200个字节
rbp+8是read函数的返回地址
我们需要把rbp+8给覆盖掉,并且在后面添加callsystem函数的地址,这样就会执行callsystem,可以进行下一步的cat falg操作了……
1 | from pwn import * |
level 2
查看一下保护,没有开站保护,所以可以栈溢出
进入vulnerable_function()函数,可以看到buf的大小为0x88,但是读入的字符串大小为0x100,所以存在栈溢出漏洞是实锤了。
而且还发现有system()函数,还缺一个”/bin/sh”来提权,
查看字符串,是否有可以利用的字符串
所以我们的思路就是:
- 填充字符串使buf溢出
- 溢出之后,把buf函数的地址改成system的返回地址,
字符串的地址:0x0804A024
system函数的地址:0x08048320
1 | from pwn import * |
分配的buff空间为0x88个字节,因为是32位程序,所以返回地址我们填入的是4个字节,所以是0x88+4个字节,然后下面的是system函数的地址,后面的地址是压入栈的返回地址,所以可以随便填写,因为会直接进行后面的提权,然后就是局部变量,binsh_addr的地址。
也就是在32位程序运行中,函数参数直接压入栈中
调用函数时栈的结构为:调用函数地址->函数返回地址->参数n->参数n-1->参数1
所以要在函数地址后面首先要去覆盖它的返回地址