stage1부터.. 배열에 그냥 아무 값도 안넣으니까 argv['A'] 체크는 걍 해결됐고, 같은 방식으로 B,C(마지막 스테이지)도 해결.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main () {
//stage 1
char *argv[101] = {[0 ... 99] = ""};
char *envp[] = {"\xde\xad\xbe\xef=\xca\xfe\xba\xbe", NULL}; //stage 3
argv['B'] = "\x20\x0a\x0d";
argv['C'] = "11111";
//stage 2
int pipe1[2], pipe2[2];
if(pipe(pipe1)==-1 || pipe(pipe2)==-1) {
exit(1);
}
//child
if(fork() == 0) {
dup2(pipe1[0], 0);
close(pipe1[0]);
close(pipe1[1]);
dup2(pipe2[0], 2);
close(pipe2[0]);
close(pipe2[1]);
execve("/home/input/input", argv, envp);
}
//parent
else {
write(pipe1[1], "\x00\x0a\x00\xff", 4);
write(pipe2[1], "\x00\x0a\x02\xff", 4);
//stage 4
FILE* fp = fopen("\x0a", "w");
fwrite("\x00\x00\x00\x00", 4, 1, fp);
fclose(fp);
//stage 5
sleep(3);
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
if(client_socket == -1)
{
printf("socket err\n");
exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv['C']));
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(-1 == connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))
{
printf("conn failed\n");
exit(1);
}
send(client_socket, "\xde\xad\xbe\xef", 4, 0);
}
}
하고 /tmp/extr에 ln -s로 flag 파일 심볼릭링크 생성함