retdec
rustc_codegen_gcc
retdec | rustc_codegen_gcc | |
---|---|---|
6 | 49 | |
7,786 | 881 | |
0.8% | 2.3% | |
7.0 | 9.7 | |
2 days ago | 12 days ago | |
C++ | Rust | |
MIT License | Apache License 2.0 |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
retdec
-
need help with an old game trainer
found something called retdec @ https://github.com/avast/retdec
-
How to compile to make reverse engineering easy?
RetDec
-
rust to c complication?
https://github.com/avast/retdec (multiple machine code formats to C/C++)
-
CDDC 2022 in Thailand Outfield
// // This file was generated by the Retargetable Decompiler // Website: https://retdec.com // Copyright (c) Retargetable Decompiler // #include #include #include #include // ------------------------ Structures ------------------------ struct _IO_FILE { int32_t e0; }; // ------------------- Function Prototypes -------------------- int64_t __do_global_dtors_aux(void); int64_t __libc_csu_fini(void); int64_t __libc_csu_init(int64_t a1, int64_t a2, int64_t a3); int64_t _fini(void); int64_t _init(void); int64_t _start(int64_t a1, int64_t a2, int64_t a3, int64_t a4); int64_t deregister_tm_clones(void); int64_t frame_dummy(void); int32_t function_7b0(char * s1, char * s2, int32_t n); int32_t function_7c0(int64_t * ptr, int32_t size, int32_t n, struct _IO_FILE * stream); int32_t function_7d0(struct _IO_FILE * stream); void function_7e0(void); int32_t function_7f0(char * format, ...); char * function_800(char * s, int32_t n, struct _IO_FILE * stream); int32_t function_810(struct _IO_FILE * stream, char * buf, int32_t modes, int32_t n); struct _IO_FILE * function_820(char * filename, char * modes); void function_830(char * s); void function_840(int32_t status); void function_850(int64_t * d); int64_t readflag(void); int64_t register_tm_clones(void); // --------------------- Global Variables --------------------- int64_t g1 = 2400; // 0x200d70 int64_t g2 = 2336; // 0x200d78 struct _IO_FILE * g3 = NULL; // 0x201020 struct _IO_FILE * g4 = NULL; // 0x201030 char g5 = 0; // 0x201038 char * g6; // 0x201040 int32_t g7 = 0; // 0x400 int32_t g8; // ------------------------ Functions ------------------------- // Address range: 0x788 - 0x79f int64_t _init(void) { int64_t result = 0; // 0x796 if (*(int64_t *)0x200fe8 != 0) { // 0x798 __gmon_start__(); result = &g8; } // 0x79a return result; } // Address range: 0x7b0 - 0x7b6 int32_t function_7b0(char * s1, char * s2, int32_t n) { // 0x7b0 return strncmp(s1, s2, n); } // Address range: 0x7c0 - 0x7c6 int32_t function_7c0(int64_t * ptr, int32_t size, int32_t n, struct _IO_FILE * stream) { // 0x7c0 return fread(ptr, size, n, stream); } // Address range: 0x7d0 - 0x7d6 int32_t function_7d0(struct _IO_FILE * stream) { // 0x7d0 return fclose(stream); } // Address range: 0x7e0 - 0x7e6 void function_7e0(void) { // 0x7e0 __stack_chk_fail(); } // Address range: 0x7f0 - 0x7f6 int32_t function_7f0(char * format, ...) { // 0x7f0 return printf(format); } // Address range: 0x800 - 0x806 char * function_800(char * s, int32_t n, struct _IO_FILE * stream) { // 0x800 return fgets(s, n, stream); } // Address range: 0x810 - 0x816 int32_t function_810(struct _IO_FILE * stream, char * buf, int32_t modes, int32_t n) { // 0x810 return setvbuf(stream, buf, modes, n); } // Address range: 0x820 - 0x826 struct _IO_FILE * function_820(char * filename, char * modes) { // 0x820 return fopen(filename, modes); } // Address range: 0x830 - 0x836 void function_830(char * s) { // 0x830 perror(s); } // Address range: 0x840 - 0x846 void function_840(int32_t status) { // 0x840 exit(status); } // Address range: 0x850 - 0x856 void function_850(int64_t * d) { // 0x850 __cxa_finalize(d); } // Address range: 0x860 - 0x88b int64_t _start(int64_t a1, int64_t a2, int64_t a3, int64_t a4) { // 0x860 int64_t v1; // 0x860 __libc_start_main(2518, (int32_t)a4, (char **)&v1, (void (*)())2816, (void (*)())2928, (void (*)())a3); __asm_hlt(); // UNREACHABLE } // Address range: 0x890 - 0x8c2 int64_t deregister_tm_clones(void) { // 0x890 return (int64_t)&g3; } // Address range: 0x8d0 - 0x912 int64_t register_tm_clones(void) { // 0x8d0 return 0; } // Address range: 0x920 - 0x95a int64_t __do_global_dtors_aux(void) { // 0x920 if (g5 != 0) { // 0x958 int64_t result; // 0x920 return result; } // 0x929 if (*(int64_t *)0x200ff8 != 0) { // 0x937 __cxa_finalize((int64_t *)*(int64_t *)0x201008); } int64_t result2 = deregister_tm_clones(); // 0x943 g5 = 1; return result2; } // Address range: 0x960 - 0x96a int64_t frame_dummy(void) { // 0x960 return register_tm_clones(); } // Address range: 0x96a - 0x9d6 int64_t readflag(void) { struct _IO_FILE * file = fopen("flag", "rb"); // 0x980 if (file != NULL) { // 0x9a6 fread((int64_t *)&g6, (int32_t)&g7, 1, file); fclose(file); return 0; } // 0x990 perror("[-] flag file "); exit(0); // UNREACHABLE } // Address range: 0x9d6 - 0xaf7 int main(int argc, char ** argv) { int64_t v1 = __readfsqword(40); // 0x9e1 setvbuf(g3, NULL, 1, 0); setvbuf(g4, NULL, 1, 0); readflag(); printf("[+] password => %p\n", (int64_t *)"P4s$w0rD"); int64_t str; // bp-1048, 0x9d6 fgets((char *)&str, (int32_t)&g7, g4); printf((char *)&str); if (strncmp("P4s$w0rD", "weakpass", 8) != 0) { // 0xac4 printf("[!] password is %s\n", "P4s$w0rD"); } else { // 0xaaa printf("[+] %s", (char *)&g6); } int64_t result = 0; // 0xaee if (v1 != __readfsqword(40)) { // 0xaf0 __stack_chk_fail(); result = &g8; } // 0xaf5 return result; } // Address range: 0xb00 - 0xb65 int64_t __libc_csu_init(int64_t a1, int64_t a2, int64_t a3) { int64_t result = _init(); // 0xb2c if ((int64_t)&g2 - (int64_t)&g1 >> 3 == 0) { // 0xb56 return result; } int64_t v1 = 0; // 0xb34 while (v1 + 1 != (int64_t)&g2 - (int64_t)&g1 >> 3) { // 0xb40 v1++; } // 0xb56 return result; } // Address range: 0xb70 - 0xb72 int64_t __libc_csu_fini(void) { // 0xb70 int64_t result; // 0xb70 return result; } // Address range: 0xb74 - 0xb7d int64_t _fini(void) { // 0xb74 int64_t result; // 0xb74 return result; } // --------------- Dynamically Linked Functions --------------- // void __cxa_finalize(void * d); // void __gmon_start__(void); // int __libc_start_main(int *(main)(int, char **, char **), int argc, char ** ubp_av, void(* init)(void), void(* fini)(void), void(* rtld_fini)(void), void(* stack_end)); // void __stack_chk_fail(void); // void exit(int status); // int fclose(FILE * stream); // char * fgets(char * restrict s, int n, FILE * restrict stream); // FILE * fopen(const char * restrict filename, const char * restrict modes); // size_t fread(void * restrict ptr, size_t size, size_t n, FILE * restrict stream); // void perror(const char * s); // int printf(const char * restrict format, ...); // int setvbuf(FILE * restrict stream, char * restrict buf, int modes, size_t n); // int strncmp(const char * s1, const char * s2, size_t n); // --------------------- Meta-Information --------------------- // Detected compiler/packer: gcc (7.5.0) // Detected functions: 22
- Old C code – how to upgrade it?
- RetDec – retargetable machine-code decompiler based on LLVM
rustc_codegen_gcc
-
How hard would it be to port the Rust toolchain to a new non-POSIX OS written in Rust and get it to host its own development? What would that process entail?
Alternatively, there's another initiative called codegen_gcc which is about using GCC as a backend for the rustc compiler. It's (much) more advanced in Rust support, but I am not sure how easy it would be to use a modified libgccjit from there.
-
"Rust makes me never want to touch C again" -- Matthew Ahrens
In addition to what others have said about platform support, Rust is also on its way to gaining more platform support through rustc_codegen_gcc, the GCC codegen backend for rustc, as an alternative to the LLVM backend. That means many of the platforms GCC supports will suddenly become available with Rust.
-
Rust contributions for Linux 6.4 are finally merged upstream!
Yeah, rustc_codegen_gcc is a GCC backend for rustc, and its making a lot of good regular progress.
-
GCC 13 and the State of Gccrs
gcc-rs is one of two projects for bringing Rust to gcc. gcc-rs is the more ambitious of the two, with an entirely new frontend. There is also rustc_codegen_gcc (https://github.com/rust-lang/rustc_codegen_gcc) that keeps the rustc frontend, and only swaps out LLVM for GCC at the codegen stage.
-
rustc_codegen_gcc: Progress Report #22
Fixing unwinding in release mode is still ungoing. I could use some help here, so anyone with some understanding of unwinding, landing pads or GCC, please come on this issue to discuss this.
-
Any alternate Rust compilers?
Additionally, there is gcc codegen for rustc (https://github.com/rust-lang/rustc_codegen_gcc), which is not a compiler per se, but an alternative code generator, with more architectures supported and other nice things. It's also coming along, but there's still a lot of work to do there too. There's also Cranelift codegen (https://github.com/bjorn3/rustc_codegen_cranelift), which is designed to make debug builds faster, but this is not as exciting/useful as the other 2.
-
rustc_codegen_gcc: Progress Report #21
Good idea. I added the tag "help wanted" to the issue.
-
Challenges writing a compiler frontend targeting both LLVM and GCC?
Also, there are indeed ABI issues, e.g. for 128-bit integers and NaN.
-
A brave new world: building glibc with LLVM
I'm excited about both the backend & the frontend.
-
Rust front-end merged in GCC trunk
There is also a project for rustc to use GCC instead of LLVM for codegen.
https://github.com/rust-lang/rustc_codegen_gcc
What are some alternatives?
copycat - A concatenative language on Scheme
gccrs - GCC Front-End for Rust
stoical - An ancient forth like language
gcc-rust - a (WIP) Rust frontend for gcc / a gcc backend for rustc
unwebpack-sourcemap - Extract uncompiled, uncompressed SPA code from Webpack source maps.
min-sized-rust - 🦀 How to minimize Rust binary size 📦
stoical-mentoring
databend - 𝗗𝗮𝘁𝗮, 𝗔𝗻𝗮𝗹𝘆𝘁𝗶𝗰𝘀 & 𝗔𝗜. Modern alternative to Snowflake. Cost-effective and simple for massive-scale analytics. https://databend.com
mstoical - MStoical - a Forth like language, but better
compiler-explorer - Run compilers interactively from your web browser and interact with the assembly
oscp - Designed for automated enumeration for ethical hacking and penetration testing
libgccjit-patches - Patches awaiting review for libgccjit