This commit is contained in:
Your Name 2025-05-12 20:31:38 +12:00
parent d001825cd5
commit d544b8953d
2 changed files with 40 additions and 15 deletions

View File

@ -4,14 +4,16 @@
#include <unistd.h>
#include <cstring>
#include <sstream>
#include <filesystem>
#include "version.h"
#include "b64ed.hpp"
// Recursively decode and print if nested bb64 command is found
void recursive_print(const std::string &decoded)
{
std::cout << std::string(80, '-') << std::endl;
std::cout << decoded << std::endl;
std::cout << std::string(80, '-') << std::endl;
size_t pos = decoded.find("bb64 ");
if (pos != std::string::npos)
@ -34,6 +36,33 @@ constexpr unsigned int hash(const char *s, int off = 0)
return !s[off] ? 5381 : (hash(s, off + 1) * 33) ^ s[off];
}
int update_bb64()
{
std::cout << "Updating bb64..." << std::endl;
// determine path to this executable
std::filesystem::path bb64_path = std::filesystem::canonical("/proc/self/exe");
std::cout << "bb64 path: " << bb64_path << std::endl;
return 0;
}
int decode_and_run(const std::string &encoded)
{
// Default: decode and run
std::string decoded = base64_decode(encoded);
if (decoded.empty())
{
std::cerr << "Failed to decode base64 command." << std::endl;
return -1;
}
// Replace current process with bash -c "decoded"
execlp("bash", "bash", "-c", decoded.c_str(), (char *)nullptr);
// If execlp returns, there was an error
std::cerr << "Failed to execute command." << std::endl;
return -1;
}
int main(int argc, char *argv[])
{
if (argc < 2)
@ -46,34 +75,30 @@ Usage:
bb64 BASE64COMMAND Decodes and runs the command
bb64 -[i|d] BASE64COMMAND Displays the decoded command
bb64 -e COMMAND Encodes the command and prints the result
bb64 -u Updates bb64 to the latest version (may require sudo)
)" << std::endl;
return -1;
}
std::string mode = argv[1];
if (argc == 2)
{
// Default: decode and run
std::string decoded = base64_decode(argv[1]);
if (decoded.empty())
{
std::cerr << "Failed to decode base64 command." << std::endl;
return -1;
}
// Replace current process with bash -c "decoded"
execlp("bash", "bash", "-c", decoded.c_str(), (char *)nullptr);
// If execlp returns, there was an error
std::cerr << "Failed to execute command." << std::endl;
return -1;
if (mode == "-u")
return update_bb64();
else
return decode_and_run(mode);
}
std::string mode = argv[1];
std::ostringstream oss;
switch (hash(mode.c_str()))
{
case hash("-i"):
case hash("-d"):
std::cout << "Decoding command..." << std::endl
<< std::endl;
recursive_print(base64_decode(argv[2]));
break;
case hash("-e"):

View File

@ -1 +1 @@
static const char *VERSION = "8";
static const char *VERSION = "10";