首先ssh连接服务器
看下有什么文件
有三个文件。我们能执行fd文件,查看fd.c。但是看不了flag。
fd是fd.c编译的程序。通过fd去查看flag
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;
}
分析下程序:
定义了32字节大小的buf
main函数:
1.argv是否<2
2.fd=atoi(argv[1])-0x1234
这句是什么意思呢。atoi函数用来转换整数,如果失败,则返回零
1admin->1
admin->0
3.len=read(fd,buf,32)
read(fd,buf,32)
参数分别是:文件描述符,变量,读取长度
文件描述符是个啥呢
文件描述符 通道名
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误
4.strcmp("LETMEWIN\n",buf)
比较buf。也就是上面我们read的值。是否等于LETMEWIN\n,一样就输出flag
现在理一下思路
argv传参。转换整数-0x1234,再放入read函数,输入-LETMEWIN\n
构造一下PAYLOAD,将argv传入4660,然后-0x1234=0
read(0,buf,32),再输入LETMEWIN\n,就能拿到flag了