**

pwnable.kr 1-fd

**

链接服务器

ssh [email protected] -p2222
输入密码guest
pwnable.kr 1-fd
输入ls -l 查看文件 发现有三个文件fd fd.c flag
cat flag 返回permission denied 权限被拒绝
cat fd 出现乱码
cat fd.c 出现了代码 说明是可读的
{fd和fd.c文件都只有读的权限,fd为fd.c编译出来的C程序,而flag则是要运行的夺旗程序}
如下:
pwnable.kr 1-fd
查了网上大佬说明
argc为保存参数的数量的参数
argv[]是保存参数具体值的数组
envp是存放系统环境变量的数组
pwnable.kr 1-fd
如果参数数量小于2 则输出pass argv[1] a number 且返回值0
pwnable.kr 1-fd
atoi:将字符串转化为整形数据 将argv[1]转化成整形数据减去0x1234为fd的值

{#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count); }

read()会把参数fd所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有作用并返回0.返回值为实际读取到的字节数,如果返回0,表示已经到达文件尾或是无可读取的数据,然后文件读写位置会随读取到的字节移动

read函数从打开的设备或文件中读取数据。
pwnable.kr 1-fd
明显当fd=0时 要复制给buf的值就可以从键盘输入了

返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
{参数count
是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。比如用fgetc读一个字节,fgetc有可能从内核中预读1024个字节到I/O缓冲区中,再返回第一个字节,这时该文件在内核中记录的读写位置是1024,而在FILE结构体中记录的读写位置是1。注意返回值类型是ssize_t,表示有符号的size_t,这样既可以返回正的字节数、0(表示到达文件末尾)也可以返回负值-1(表示出错)。
read函数返回时,返回值说明了buf中前多少个字节是刚读上来的。有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:读常规文件时,在读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0。}from:UltraVires
pwnable.kr 1-fd
strcmp比较“LETMEWIN”与buf中的数据,如果相同,则返回0,若大于,则返回大于0的值,小于则返回小于0的值
{要使这句话生效,要么相等返回0,然后非0得1,要么小于,这个小于的也好构造,把L改成L之前的任何一个数都行}
system("/bin/cat flag");
调用系统调用,来输出flag

{fd呢是拥有者是fd_pwn,而flag的拥有者也是fd_pwn,所以这个时候这个代码执行后是有权限打开flag的。
然后我们怎么去改这个buf的内容呢,buf是从fd中读进去的数据,所以我们要改fd,要让fd读取我们的输入,这里就是linux的io接口知识 了。}
pwnable.kr 1-fd
网上大佬测试,发现fd为4660 4661 4662时都可以使得stremp比较成立 但不知道如何来的
这里要输入十进制数,而不是十六进制数
pwnable.kr 1-fd
经过证明,flag=mommy!I think I know what a file descriptor is!!

相关文章:

  • 2021-11-04
  • 2022-12-23
  • 2021-10-29
  • 2021-12-15
  • 2021-05-11
  • 2022-02-01
  • 2021-12-29
  • 2021-09-13
猜你喜欢
  • 2021-09-05
  • 2021-08-03
  • 2021-04-28
  • 2022-01-07
  • 2020-10-04
  • 2021-08-23
相关资源
相似解决方案