From c15c5c5a7cc5815435c642e38d0e8361af4d486a Mon Sep 17 00:00:00 2001 From: Magdalunaa Date: Mon, 17 Nov 2025 17:46:00 +0100 Subject: [PATCH] upload kissy code --- kissy.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 kissy.c diff --git a/kissy.c b/kissy.c new file mode 100644 index 0000000..d6999cd --- /dev/null +++ b/kissy.c @@ -0,0 +1,94 @@ +/* KISSY (KISSY Interface for Sapphic Smooching over ttY) v1.0 by Magdalunaa + +This file needs to: +- be owned by the tty group (or whatever group owns the terminal devices in your system) +- have setgid set +- be group executable +- not be world writeable + +You can probably just use 2755 permissions. those work + +*/ + +#include +#include +#include +#include +#include +#include +#include + +// mreowww meow nya :3 + +int main (int argc, char **argv) { + // are we running with setgid? + struct stat stat_self; + stat("/proc/self/exe", &stat_self); + + if (!(stat_self.st_mode & S_ISGID && !(stat_self.st_mode & S_IWOTH))) { + printf("%s\n", "setgid is not set, or this file is world writeable."); + return 3; + } + + // check we have at least one argument + if (argc < 2) { + printf("%s\n", "Not enough arguments!\nUsage: kissy [target] "); + return 0; + } + + // try to find the target's uid + struct passwd *pw = getpwnam(argv[1]); + if (pw == NULL) { + printf("%s\n", "Cannot find target"); + return 1; + } + int target = pw->pw_uid; + + // get current username + struct passwd *pw2 = getpwuid(getuid()); + if (pw == NULL) { + printf("%s\n", "Cannot find user"); + return 2; + } + char* user = pw2->pw_name; + + // if we have a second argument, set a custom kiss message + char* kiss; + if (argc >= 3) + kiss = argv[2]; + else + kiss = "*mwah*"; + + short kissed = 0; + // iterate over all files in directory + DIR *dir = opendir("/dev/pts"); + while (1) { + struct dirent *ent = readdir (dir); + if (ent == NULL) + break; + + char filepath[strlen("/dev/pts/") + strlen(ent->d_name) + 1]; + strcpy(filepath, "/dev/pts/"); + strcat(filepath, ent->d_name); + + struct stat stats; + stat (filepath, &stats); + + // find all terminals with the correct user and that are group-writable + if (stats.st_mode & S_IWGRP && stats.st_uid == target) { + kissed = 1; + + if (stats.st_gid != getegid()) { // are we running as the tty user? + printf("%s\n", "Mismatch between file owner group and current effective group. Make sure this program is running with setgid."); + } else { + FILE *tty = fopen(filepath, "a"); // write to terminal! + fprintf(tty, "\n%s\n--%s\n", kiss, user); + fclose(tty); + } + } + } + + // print a message if a suitable terminal couldn't be found + if (!kissed) + printf("%s\n", "Couldn't find any suitable terminals. User is not logged in or has not enabled messages."); +} \ No newline at end of file