题目:
链接登录:
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!!