zoukankan      html  css  js  c++  java
  • pwnable.krfd

    题目:

    链接登录:
    ssh fd@pwnable.kr -p2222

    查看文件及权限:
    ls –al

    看到flag文件,但是当前用户fd并没有读权限。
    cat fd.c

    分析程序:
    int argc
    这个东东用来表示你在命令行下输入命令的时候,一共有多少个参数。比方说你的程序编译后,可执行文件是test.exe
    D:\tc2>test
    这个时候,argc的值是1
    但是
    D:\tc2>test.exe myarg1 myarg2
    的话,argc的值是3。也就是 命令名 加上两个参数,一共三个参数
    argc 是参数的个数,argv[]是参数,argv[0]是文件名,argv[1]是第一个参数...
    char *argv[]
    这个东东用来取得你所输入的参数
    D:\tc2>test
    这个时候,argc的值是1,argv[0]的值是 "test"
    D:\tc2>test myarg1 myarg2
    这个时候,argc的值是3,argc[0]的值是"test",argc[1]的值是"myarg1",argc[2]的值是"myarg2"。
    这个东东一般用来为程序提供非常重要的信息,如:数据文件名,等等。
    如:copy a.c b.txt
    这个时候,a.c和b.txt就是所谓的“非常重要的信息”。不指定这两个文件,你没法进行拷贝。
    当你的程序用到argc和argv这两个参数的时候,可以简单地通过判断argc的值,来看看程序的参数是否符合要求

    char *envp[]
    这个东东相对来说用得比较少。它是用来取得系统的环境变量的。
    如:在DOS下,有一个PATH变量。当你在DOS提示符下输入一个命令(当然,这个命令不是dir一类的内部命令)的时候,
    DOS会首先在当前目录下找这个命令的执行文件。如果找不到,则到PATH定义的路径下去找,找到则执行,
    找不到返回Bad command or file name
    int fd = atoi( argv[1] ) - 0x1234;
    int len = 0;
    len = read(fd, buf, 32);
    fd 是打开的文件的句柄,它代表的是你打开的文件,就是说read从fd 代表的文件中读32个字节传到buf中;
    目标:执行system(“/bin/cat flag”);
    则:strcmp(“LETMEWIN\n”, buf) == 0
    则:buf = “LETMEWIN\n”
    则:read(fd, buf, 32)将buf设为”LETMEWIN\n”
    fd == 0为标准输入
    fd == 1为标准输出
    fd == 2为标准错误输出
    所以我们可以使fd == 0,然后从终端输入LETMEWIN后回车
    要使fd == 0,
    则:输入的参数 == 0x1234,即4660

    mommy! I think I know what a file descriptor is!!

  • 相关阅读:
    C语言资料分享
    vue子组件添加事件无效解决
    vue-cli3 vue动画 打包后不生效解决
    setTimeOut定时器实现数组内容循环获取
    echart 之仪表盘 动态分段颜色实现
    elementUI table树默认箭头修改
    《二》打包发布工程-README.md编辑
    《一》打包发布工程--npm 打包发布js库篇
    npm打包发布js库包npm ERR! 403 Forbidden
    安装nrm 后执行报错TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string
  • 原文地址:https://www.cnblogs.com/spd2016/p/5487683.html
Copyright © 2011-2022 走看看