📔
Cyber Security Notes
  • Introduction
  • CVEs
    • CVE-2022-33106
  • Paper Reviews
    • Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice
  • Security Basics Notes
    • Identification, Authentication and Authorization
  • Enumeration and Initial Compromise
    • Methodology
    • Footprinting
    • Network Protocols
      • FTP
      • SMB
      • DNS
      • NFS
      • SMTP
      • IMAP/POP3
      • SNMP
      • MySQL
      • MSSQL
      • Oracle TNS
      • IPMI
    • Nifty One Liners
    • Brute-Force Web Pages
      • Hydra
    • Network Pentest
      • Quick SMB cheatsheet
      • SSH keypair basics
      • Compromise using SSH Key
      • Networking fundamentals Interview topics
      • nmap quick cheatsheet
      • Metasploit Quick Reference
    • Web Pentest
      • Web Pentest Interview top topics
      • Wordpress Exploitation
      • Joomla Exploitation
      • Login Bypass using Cookie Tampering/Poisoning
      • Subdomain Enumeration
      • CSRF mitigation
      • XSS mitigation
      • CSP bypass with JSONP
      • PHP Vulnerabilities
      • Python Serialization Vulnerabilities - Pickle
      • SQL Injections
        • SQLmap
      • SSTI
      • XSS
    • Buffer Overflow Prep
      • Understanding CPUs
      • Virtual Memory and Paging
      • Syscalls
      • Theorem Proving
      • Stripping readable function names
      • Insecure C functions
      • Stack Canaries
      • Linking - GOT,PLT
      • Return Oriented Programming
    • Active Directory - Basics
      • AD DS
      • Managing OUs
      • Group Policies
      • Authentications
      • Trees, Forests and Trusts
      • Kerberos
      • Attacking Kerberos
      • Priv Esc (Post Exploitation)
    • DNS/Domain Enum Masterguide
  • Post Exploitation
    • Shell Escape Techniques
    • Getting stable shell after compromise
    • Linux Privilege Escalation
      • Sudoers file
      • Sudoers entry - Yum
      • Wildcards - Basics
      • Wildcards - Chown
      • Wildcards - Tar
      • Linux Permissions & SUID/SGID/Sticky Bit
      • SUID - nmap
      • SUID - bash
      • SUID - man
      • NFS no_root_squash
      • SUID - pkexec
      • Bad permissions
    • Windows Privilege Escalation
      • SeImpersonatePrivilege Token Impersonation
      • Firefox Creds
      • Potatoes
      • Print Spooler Basics
      • Print Spooler CVE 2020-1030
      • SpoolFool
    • Data Exfiltration Post Exploitation
  • Port Forwarding Cheatsheet
  • Powershell Essentials
    • Powershell Basics
    • Powershell Enumeration
    • Powershell Port Scanner
    • Powershell One Liner Port Scanning
    • Powershell Port Scan in a given CIDR
  • Application Security
    • System Calls in Linux
    • Buffer Overflow Defenses
    • Format string vulnerabilities
    • Sample Github Actions
    • Basic Bugs in Demo Application
    • Using AFL++
  • Linux 64-bit Assembly
    • GDB Basics
      • My relevant GDB cheatsheet
      • Task 1 - Tamper strcmp logic
      • Breakpoints
      • Always starting with intel flavor
      • GDB TUI Mode
    • Basic Hello World Program
    • Registers in 64-bit
    • global directive
    • Reducing instructions and Removing NULL-> Optimizing memory in Assembly
    • Data Types
    • Endianness
    • Moving Data
    • push, pop, and the stack
    • Analysis - Writing data on memory location and referencing
    • Arithmetic Operations
    • Bitwise Logical Operations
    • Bit-Shifting Operations
    • Control Instructions
    • Loops
    • Procedures
    • Stack-Frames and Procedures
    • String Operations
    • Shellcoding basics
      • Introduction and Common Rules
      • Basic Shellcodes->Exit
      • Testing shellcode->Skeleton Code
      • Techniques-> JMP,CALL,POP
      • Techniques-> Stack
      • Techniques-> (64-bit only) RIP Relative Addressing
      • Shellcode 1 -> execve(/bin/sh) STACK PUSH
      • Shellcode 1 -> execve(/bin/sh) JMP CALL POP
      • Techniques-> XOR-Encoder
  • Cloud Security
    • Foundational Technology
    • Learning Through Project Omega
    • IAM Essentials
      • Deep dive into IAM - Part 1
    • Amazon S3
    • Risk Management & Data Controls
    • Enumeration
      • S3 - Enum Basics - PwnedLabs
      • S3 - Identify the AWS Account ID from a Public S3 Bucket
      • EBS - Loot Public EBS Volumes
      • S3- Exploit Weak Bucket Policies for Privileged Access
  • API Security
    • WSDL
  • Reverse Engineering
    • Some string Operations
    • Numbers and Inputs
    • Address inputs
    • Recursive Function
    • Crackme: level1
    • Crackme: level2
    • CTF: Memory Dereferencing
    • CTF: Monty Python
  • CTF Challenge Learnings
    • vsCTF 2024
      • Sanity Check
      • not-quite-caesar
      • Intro to reversing
    • NCL Individual 2024
      • Web Challenges
        • PiratePals
        • Pierre's Store
    • Pico CTF 2024
      • Web Exploitation
        • Bookmarklet
        • WebDecode
        • Unminify
        • Trickster
      • General Skills
        • Commitment Issues
        • Time Machine
        • Blame Game
        • Collaborative Development
        • Binary Search
        • Dont-you-love-banners
    • Sunshine CTF
      • Knowledge Repository
    • Amazon WiCys CTF
      • I am Lazy
      • Password Locker on the Web
      • Happy Birthday Card Generator
      • Bloggergate
      • simple offer
      • Bad Actor
      • Secret Server
      • Simple PCAP
      • Hidden Message
    • C code using getenv()
    • Command Injection with filter
    • Pwning
      • Shoddy_CMP
      • PLT_PlayIT
  • Applied Cryptography
    • Linear Congruential Generator
  • Tools for everything
Powered by GitBook
On this page

Was this helpful?

  1. Reverse Engineering

Some string Operations

PreviousReverse EngineeringNextNumbers and Inputs

Last updated 1 year ago

Was this helpful?

strops.bin

Upon opening it in Ghidra we see this:

I copied it into sublime and simplified it

int main(void)

{
  int i;
  char input [72];

  setup();
  printf("Enter your flag: ");
  read(1,input,64);
  i = 0;
  do {
    if (47 < i) {
      puts("Correct!");
label:
      return 0;
    }
    if ((char)~flag[(int)i] != input[(int)i]) {
      puts("Nope.");
      goto label;
    }
    i = i + 1;
  } while( true );
}

Things learned from the code:

  1. Initial variables are declared

  2. setup() is called -> no idea so far what it does

  3. read() function is used to read STDIN till 64 characters

  4. A loop begins where i is currently 0 so 1st if condition is false.

  5. Next if condition is encountered. If that is also false, goto makes the statement go to it's label where return 0 is there.

  6. Conclusion: Only 1 input is supposed to happen where a correct flag is supposed to be entered.

  7. Also, 2nd if condition on line 17 is the key

I inspected setup() and nothing special is happening

So, line 17 must be the key. Let's understand what is happening in English

if ((char)~flag[(int)i] != input[(int)i])

Translation: if the character encoded NOT value of the array flag[i] where i is the current iteration, is not equal to the input[i] then display "Nope"

But if it is, continue iteration until 48 correct inputs are given. If 47 inputs are correct display "Correct!"

So, we have to input correct flag array input by input

Another way to understand this translation: If (char)NOT flag[i] ==input[i], value is correct

So, let's inspect this flag array

This means, we have to pick up all these characters, bitwise NOT them and then input it in the program

So, first character is 99 in hex. Which means NOT(99) = 66. So on. I utilized ChatGPT to write me a code.

#include <stdio.h>
#include <stdint.h>

int main() {
    // The provided hex string
    uint8_t flag_bytes[] = {
        0x99, 0x93, 0x9e, 0x98, 0x84, 0x93, 0xcf, 0xcf,
        0x8f, 0x8c, 0xa0, 0x9e, 0x91, 0x9b, 0xa0, 0x87,
        0xcf, 0x8d, 0x8c, 0xa0, 0x9e, 0x91, 0x9b, 0xa0,
        0x8d, 0x9a, 0x9e, 0x9b, 0x8c, 0xa0, 0x90, 0xa0,
        0x92, 0x86, 0xa0, 0x9d, 0xc9, 0x99, 0xc8, 0x9a,
        0xcb, 0x99, 0xcd, 0xc6, 0x9c, 0x9a, 0xca, 0x82
    };
    
    size_t length = sizeof(flag_bytes) / sizeof(flag_bytes[0]);

    printf("Original: ");
    for (size_t i = 0; i < length; i++) {
        printf("%02X ", flag_bytes[i]);
    }
    printf("\n");

    printf("Bitwise NOT: ");
    for (size_t i = 0; i < length; i++) {
        uint8_t not_byte = ~flag_bytes[i];
        printf("%02X ", not_byte);
    }
    printf("\n");

    return 0;
}

Found the flag. EZ through manual execution

Let's translate this hex in ASCII:

https://www.rapidtables.com/convert/number/hex-to-ascii.html