pwnable.kr
一、要点
1.argc
与argv
对于C
语言int main(int argc char *argv[])
来说,argc
保存的是命令行总的参数个数(包括程序名),argv
这是传入参数的数组.
举个例子,当你执行: ./test 1 2 3
时,argc = 4
而 argv[0] = test",argv[1] = 1,argv[2] = 2,argv[3] = 3
2.atoi()
atoi
(表示 ascii to integer
)是把字符串
转换成整型数
的一个函数。char ======> int
3.read()
UNIX/Linux平台上,对于控制台(Console)的标准输入
,标准输出
,标准错误输出
,也对应了三个文件描述符(即fd = File Description )
。它们分别是0,1,2。也就是说read(0,buf,32)
表示从键盘读入至多32个字节到buf
中
二、解题步骤
1,查看源码
命令:cat fd.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
if(argc<2){
printf("pass argv[1] a number\n");
return 0;
}
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
system("/bin/cat flag");
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
2,分析
由源码可知,首先agrc
要大于等于2
,根据提示我们要输入一个数字argv[1]
,且 argv[1] - 0x1234 = fd = 0
,因为 fd
影响read()
函数,而我们需要输入LETMIWIN
才能完成解题,所以需要是fd = 0
.
3,解题
注:0x1234
须转换为十进制数 4660
flag
= mommy! I think I know what a file descriptor is!!
网友评论