ssh [email protected] -p 2222
(password:guest
)
po上源码
1 |
|
这条题目主要是用来练习Linux编程的几个常见函数
- execv()
- fork()
- pipe()
- dup2()
- socket编程
argv
argc用来保持程序运行时的参数数目(包括程序完整路径),argv用来具体保存参数(argv[0]是程序运行路径),envp用来具体保存程序运行时的环境变量。
1
2
3
4
5
6
7char *argv[101] = {0};
for(int i = 0; i < 101; i++)argv[i] = "a";
argv[0] = "/home/input2/input";
argv['A'] = "\x00";
argv['B'] = "\x20\x0a\x0d";
argv[100] = NULL;
argv['C'] = "2333"//端口stdio
可见程序比较了标准输入流(0),标准错误流(2)中的各四个字节,可以考虑用管道重定向这两个流,利用fork()函数产生子进程,子进程将字节写入管道,父进程从管道重定向到标准流中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16int myin[2], myerr[2];
pipe(myin);//建立一个用于输入流的管道
pipe(myerr);//建立一个用于错误流的管道
pid_t pid = fork();//产生子进程,共享这两个管道
if(pid == 0){//如果是子进程
close(myin[0]);
close(myerr[0]);//关闭读取的一端
write(myin[1], "\x00\x0a\x00\xff", 4);
write(myerr[1], "\x00\x0a\x02\xff", 4);//向管道写数据
}else if(pid > 0){//如果是父进程
close(myin[1]);
close(myerr[1]);//关闭输入的一端
dup2(myin[0], 0);//重定向到标准输入流
dup2(myerr[0], 2);//重定向到标准错误流
execve(argv[0], argv, envp);//父进程启动目标程序
}env
直接设置环境变量
1
char *envp[2] = {"\xde\xad\xbe\xef=\xca\xfe\xba\xbe", NULL};
file
直接写文件
1
2
3FILE *fp = fopen("\x0a", "wb");
fwrite("\x00\x00\x00\x00", 4, 1, fp);
fclose(fp);network
socket编程,建立套接字然后连接,发送数据,注意端口设置在
argv['C']
中1
2
3
4
5
6
7
8
9struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(2333);
serv.sin_addr.s_addr = inet_addr("127.0.0.1");
int sock = socket(PF_INET, SOCK_STREAM, 0);
connect(sock, &serv, sizeof(serv));
char *buf = "\xde\xad\xbe\xef\n";
send(sock, buf, strlen(buf), 0);
close(sock);
完整代码:input2.c
注意需要在运行程序的目录tmp底下建立flag的软连接ln /home/input2/flag flag