.
This commit is contained in:
parent
d001825cd5
commit
d544b8953d
53
bb64.cpp
53
bb64.cpp
@ -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"):
|
||||
|
Loading…
x
Reference in New Issue
Block a user