# DiceCTF 2021 Reversing > [TOC] ## Challenge 1: babymix (angr) > [name=ret2basic] ### Description Just the right mix of characters will lead you to the flag :) [babymix](https://github.com/sajjadium/CTFium/raw/master/DiceCTF/2021/reverse/babymix/babymix) ### Recon ```shell $ file babymix babymix: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=c7fdc6b7ac4f0465758600fa9062e8f07b1a47b9, for GNU/Linux 3.2.0, not stripped ``` ### Pseudocode ```c=1 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 v3; // rbp __int64 v4; // rdx int result; // eax __int64 v6; // [rsp-48h] [rbp-48h] unsigned __int64 v7; // [rsp-10h] [rbp-10h] __int64 v8; // [rsp-8h] [rbp-8h] __asm { endbr64 } v8 = v3; v7 = __readfsqword(0x28u); sub_1080(&unk_3008, argv, envp); sub_10A0("Please enter your admin password: "); sub_10B0(&v6, 48LL, _bss_start); if ( (unsigned int)check815546(&v6) ) { sub_1080("Correct! Wrap password in dice{} for the flag :)", 48LL, v4); result = 0; } else { sub_1080("\nIncorrect :(", 48LL, v4); result = -1; } if ( __readfsqword(0x28u) != v7 ) result = sub_1090(); return result; } ``` ### Analysis Use the [angr template](/@ret2basic-PwnieIsland/angr-Template). Modify parameters as needed. ### Exploit ```python=1 #!/usr/bin/env python3 import angr import claripy FLAG_LEN = 22 STDIN_FD = 0 base_addr = 0x100000 # To match addresses to Ghidra proj = angr.Project("babymix", main_opts={'base_addr': base_addr}) flag_chars = [claripy.BVS('flag_%d' % i, 8) for i in range(FLAG_LEN)] flag = claripy.Concat( *flag_chars + [claripy.BVV(b'\n')]) # Add \n for scanf() to accept the input state = proj.factory.full_init_state( args=['babymix'], add_options=angr.options.unicorn, stdin=flag, ) # Add constraints that all characters are printable for k in flag_chars: state.solver.add(k >= ord('!')) state.solver.add(k <= ord('~')) simgr = proj.factory.simulation_manager(state) find_addr = 0x10222c # Correct! Wrap password in dice{} for the flag :) avoid_addr = 0x10223f # \nIncorrect :( simgr.explore(find=find_addr, avoid=avoid_addr) if (len(simgr.found) > 0): for found in simgr.found: print(found.posix.dumps(STDIN_FD)) ``` #### Flag ``` dice{m1x_it_4ll_t0geth3r!1!} ``` ###### tags: `DiceCTF`