From ff3aee6beed938b0abeada88531ba00b38e86431 Mon Sep 17 00:00:00 2001 From: s3nn Date: Tue, 30 Apr 2024 18:58:05 +0300 Subject: [PATCH] rev(license-ops): re-commit challenge --- reverse/license-ops/challenge.yml | 28 +++++++ reverse/license-ops/docker-compose.yml | 13 +++ reverse/license-ops/public/license | Bin 0 -> 16080 bytes reverse/license-ops/setup/Dockerfile | 15 ++++ reverse/license-ops/setup/flag.txt | 1 + reverse/license-ops/setup/license | Bin 0 -> 16080 bytes reverse/license-ops/setup/license.c | 95 +++++++++++++++++++++ reverse/license-ops/sol/sol.py | 109 +++++++++++++++++++++++++ 8 files changed, 261 insertions(+) create mode 100644 reverse/license-ops/challenge.yml create mode 100644 reverse/license-ops/docker-compose.yml create mode 100644 reverse/license-ops/public/license create mode 100644 reverse/license-ops/setup/Dockerfile create mode 100644 reverse/license-ops/setup/flag.txt create mode 100644 reverse/license-ops/setup/license create mode 100644 reverse/license-ops/setup/license.c create mode 100644 reverse/license-ops/sol/sol.py diff --git a/reverse/license-ops/challenge.yml b/reverse/license-ops/challenge.yml new file mode 100644 index 0000000..d6a572e --- /dev/null +++ b/reverse/license-ops/challenge.yml @@ -0,0 +1,28 @@ +name: "License Ops" +author: "s3nn" +category: reverse + +description: | + You are thrust into a clandestine digital realm, where enigmatic forces threaten global stability. As a recruit of an elite cyber task force, your mission is to navigate the shadowy depths of encrypted networks. Unravel the mysteries of covert communications, decrypt encrypted traffic, and decipher the intentions behind cryptic commands. Amidst the chaos, you'll confront the challenge of dissecting obscure digital artifacts, piecing together their secrets to safeguard the digital frontier. Are you prepared to dive into the unknown and emerge as a master of the digital domain? + +value: 500 +type: dynamic_docker +extra: + initial: 500 + minimum: 100 + decay: 25 + redirect_type: direct + compose_stack: !filecontents docker-compose.yml + +flags: + - CCSC{Y0ur_Rev3rsing_Journey_Just_st4rted} + +tags: + - reverse + - easy + +files: + - "public/license" + +state: visible +version: "0.1" \ No newline at end of file diff --git a/reverse/license-ops/docker-compose.yml b/reverse/license-ops/docker-compose.yml new file mode 100644 index 0000000..d3b4c84 --- /dev/null +++ b/reverse/license-ops/docker-compose.yml @@ -0,0 +1,13 @@ +version: "3.7" + +services: + challenge: + image: ghcr.io/cybermouflons/ccsc2024/license-ops:latest + restart: always + ports: + - 1337:1337 + build: + context: ./setup + dockerfile: Dockerfile + labels: + ctf.challenge.name: License Ops \ No newline at end of file diff --git a/reverse/license-ops/public/license b/reverse/license-ops/public/license new file mode 100644 index 0000000000000000000000000000000000000000..a5bf3de5f00f51e7232e2028061dec3b35f0ec0d GIT binary patch literal 16080 zcmeHOe{dAl9e;Nr5LA+&pb-QX6-#P4@|y&q93%@H1qqmFwXMr>w@Gfi++FWB5VX*= zAx>k=h}tS`?exbVHtnF3R>mS)djXq(ww<6(hw0EZ+B$P-qK%by&{nSB?|bjN*<0_N zPCL^-I`?jNzwi6`{&??w_wC->-S2)$-MZQBaxp4-?9&Xnv0{OErJ!kztN`({S~d^% zOW6`O8~9lq6LPO0AQk1TJDnCtJP#<^m0%?Uy+*){DD@C2+GQ)JWCKK*90%IvqmksD z^fVVTMwH}MdkPvuQTX1X=TQL)QM(<+W^5G~v$6H*^pK3pkfdaXEZU7ryK!k}QQ6+O zq!dq#32wDAo=)lo85S?!Gv>7Gl6FqoAoYo28(408%MAP{?KMfea|(CEoOGRl8BuC) z2iRd;{@p@{d8ceI+i@t9@h2+7%2tPhyKAaehXSiY!Ek5Ss;=6aRW((fc*Ik|yMX;F zgAJ$6mRnnxyPG8tBYPKfrSWdbg9Yoai-d%htwC^?HS;%Bod(s;zou71JA=x9I^RX0!$4rV(r2Rv(Iljb`8OkO57$ zbwt9l6S`2%s0a~o!+GF>Ef3~4?(rvhu@~HZph**XK`=NE&xBrybuJ3d#k1)l$sc|A zF*qIE>|4NNq3bWjJ%J|&l(X{sN_bS_pYd|Bb)6(Wu|eQ?uHoFHa>|CwODPwP+3-tA z8R%IXUTDL|Z8**iDl~8KdP6Zl8OWk}(;1wH=GAb**qJ|j76p=D7?ioWI4wO}Dy`qZvB^CX!jdt@tJEi`wK6WyGD1bJK@Ohh^V0P?uBnApYnuON?0iisxRaXjU3H};*mTkCsM>-p1kQ?pv0 zC_k+YtUnH&NG*KD12^lfo}y(3!2||8u>MYPpbg~jL{fLbTnM3f8k8^;b5r9*%eqnT zq@zmew-`SuIU&zy3BifmZ<^piAUpgpAjkgvpYnZXe{&lba5X7vr zvPJ7ze-~D@zPHSITL1bHU{VV;*eCrkn34R~q3Zhl$(jD1Y@Mm&@j!nQZJ^r%KC~}S zDR3kLTK}vSE4f?sLU{tlwzLr27=hZAyf&JA>0&CS_4Ou^^!yA7Gj~ib)dqT}xde6J zg9Vn>H+l>_v1C2M{a@z>Lg__Z0E0ZKp{O^}c|z+K4gov=VJbCQ1Wuk2PLi(ya7gP{ zF9ft3Meoe~Nr%R zqMC#%-YIB(>h!2Oh(nny>sJT0!&?8=UnHPIhjCtj{MR^?CD0)l$t8Tu6X!tCqYk=y z_7BcJ@G|OZJ&C-cXW2U4lq%1mtq{zDHja&|M*v}ymHp}w%|8aBW14FWO;#UR@DZ%` zz#QJvWM_|h1e!TA`@ra^I)olZ)uY_el797Qnxmo@6Ftc?mpas=9tD%5vk&~PUmZe~ z;H!^b-}s0&{Aa~=V)z4h-|+DJ%SvDFJ2U)7Ug??AQ++3TUo~ZW`N!~#)%siTa4g`H z1rEpdf7%X**Lf(8ZI1;b;igzbJ8t^RLd%yg$EYT>z7{+n1+YrDCd-xJNE=Ycjw{$o z-^kB#D9K`uw!o28$F#oR@OT3R@t(uGGnvnW;q29O|FHE+arUY|{~K_Rj)#FA$E(hZ zSVPyZf*G8N{h6glQ97zlq4ubHo*ND1-wwBE)*yDE%78j`9PdA@LEHl9huON-hGq2;?G=i$E>{xd`MUkc&Vr0@)+rl5YoMtTp6o^O#*GTY>NX z)L1MMTdTB$@m-E$MihL>q@a${8Vng8R#{oes;a73b#*nXsi|RW)~sQ*wY99Su8yf; zcp0Qbeew9-NGz~cL4O?bDR%_JfymytQdg}+W063o-&F1~_JIoAR}iNJhGo_A?*WXf+daa4GjlD@yQvl^K1^u%ODYutdLC#q(6^^ksjmSY zd^eTC8?80(rBbg0{T0yjKo`J<#dYsa=ISbTExv3{!6CS3LL74v4uhW?P@!QCe;so@ zRI6Ycdnc9R_iu&8n+r>BF1mDYK{wm5=%!CrUVkmBqwVKl+X3xAkHE&l;``n8^JcrB zg%*VTivUl7{2{zYBYEBfE>uAKCt&;RUsI{afLe0*!0W`+#XGGB^QBQ z1ac9`MIaY}Tm*6v$VDI*fm{UsKO#VRZIs7`w*Xk~6NKTr3|?ds8N3?fR%GEQ3 zwWsynBJUM*jgJoI}>%I+N7-P9g5O!7qgePT3sNZByxoOlsyzSxR0XJL~Ug&Us zP};+rSI$$M;kJ$Q2c`Ud$;;u&-u&+g<&QgCu95R#v!u66+A8TDN$;2RF-f14^jS$q zBqjfpFS(_@eyy?+vX@Jh@=8yIr(CHhtEeoiEh{I@%oO7}i@lr5B+Z25ym7IG%sEbR zA3xv9Gbewa;QCit^N8?l`OtTP!sVo7qhY8kHlC^vKqXVY?>ZQm!b(_^mox?aHjqsI zpXPWWJ1vtt`7;B+ehM4Hk3sqc*Qpw$1Ne1OEC!GO(E9JkzBmEkP- zYtqjZ(hq;u16FSWj^lN<`wrlW<#nb~;LeZ&b)IkWspOz zxJ)m%AWS9yxcqUE%buo=`R{1}D>78*Sz;q)FJAHRNE*s!k{qpO8v}X9%0BMN7-GI*p=xHo?fi!(xy|qFAxTO5_ z4+hfw=@34XF;9G7hw0l5)Qkz*PBr+dz=%beCmb;iPg}Ut1CM&6M$Fu2gLZcY;p3WM zKtdZgHLfz@KyvkVU%Z`p0{go*xzejF;P{FkT z+0#0c=#UH;_7STzep>GZ0mCknJ*``b(mEAXcyY%63xML9knCw4NR;A7{U<%52f!ZJ zn8edMlc<-sDq?K!zl7NUR4}GwPwQNw(^8SzcaHyYX}?M8(Yl$a-5%H0PW$fxhW#S{ z*8hwApP~B+=|1fn6vXh|hTUF~c0`BBP*N$jn)!jlp8mIqPB|tV*^}F+9QL#>B1-p5 zr0;OYo{{zxf2K%HNq;L@A{0O3aeas5C;M}XkPuxbSZnWWAJ>0&`;z5CmFPLkQdFGn zzXmX*i1Kp)HR!u3`hL=>Pdw2-fK8Fjp1!X-y9&L{%ooAU@MMqY7tS4d*|660*7vYD zI4F4jVj(*^j^_bG6|$%AwGyjQo3WLGSbMT3`aVeP_H>__l=khGrKpe{Q8yUd?P-16 zR3`MPpX7$@EFO#zqyF#m3dt^MuL#!KJN?a*?Mrn_kL;c2ANCcCozmPB60z@=4iCwW t;r|dGC+a_4Kj#8QeHWHuUtA?|cusKav0d literal 0 HcmV?d00001 diff --git a/reverse/license-ops/setup/Dockerfile b/reverse/license-ops/setup/Dockerfile new file mode 100644 index 0000000..7b08b17 --- /dev/null +++ b/reverse/license-ops/setup/Dockerfile @@ -0,0 +1,15 @@ + +FROM ubuntu + +RUN apt-get update && apt-get upgrade -y +RUN apt-get install -y socat gcc-multilib + +# set workdir and transfer binary +WORKDIR /root +COPY license . +COPY flag.txt . + +RUN chmod 755 license + +EXPOSE 1337 +CMD ["socat", "-v","TCP-LISTEN:1337,reuseaddr,fork,su=root", "EXEC:'/root/license'"] diff --git a/reverse/license-ops/setup/flag.txt b/reverse/license-ops/setup/flag.txt new file mode 100644 index 0000000..95aa91e --- /dev/null +++ b/reverse/license-ops/setup/flag.txt @@ -0,0 +1 @@ +CCSC{Y0ur_Rev3rsing_Journey_Just_st4rted} diff --git a/reverse/license-ops/setup/license b/reverse/license-ops/setup/license new file mode 100644 index 0000000000000000000000000000000000000000..a5bf3de5f00f51e7232e2028061dec3b35f0ec0d GIT binary patch literal 16080 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 t;r|dGC+a_4Kj#8QeHWHuUtA?|cusKav0d literal 0 HcmV?d00001 diff --git a/reverse/license-ops/setup/license.c b/reverse/license-ops/setup/license.c new file mode 100644 index 0000000..9fdd522 --- /dev/null +++ b/reverse/license-ops/setup/license.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include + +//gcc -o license license.c -g + +void get_flag() { + FILE *file = fopen("flag.txt", "r"); + if (file != NULL) { + char line[256]; + while (fgets(line, sizeof(line), file)) { + printf("%s", line); + } + fclose(file); + } else { + printf("Error: Unable to open flag file.\n"); + } +} + +bool isValidProductKey(char *productKey) { + // Check the first 3 characters + char *invalidPrefixes[] = {"333", "444", "555", "666", "777", "888", "999"}; + for (int i = 0; i < 7; i++) { + if (strncmp(productKey, invalidPrefixes[i], 3) == 0) { + return false; + } + } + + // Check the fourth character + if (productKey[3] != '_') { + return false; + } + + // Check the last 7 characters + char *lastSevenDigits = productKey + 4; // Skip the first 4 characters + for (int i = 0; i < 7; i++) { + if (lastSevenDigits[i] < '0' || lastSevenDigits[i] > '8') { + return false; + } + } + + // Calculate the sum of the last 7 digits + int sum = 0; + for (int i = 0; i < 7; i++) { + sum += (lastSevenDigits[i] - '0'); + } + + // Check if the sum is divisible by 7 + if (sum % 7 != 0) { + return false; + } + + // If all checks pass, the product key is valid + return true; +} + +bool check_password() { + char password[16] = "OrionProtc0l!!!"; + char user_input[32]; + + printf("Enter password: "); + read(0, user_input, 32); + + if (strcmp(user_input, password) == 0) { + return true; + } else { + return false; + } +} + +int main() { + setvbuf(stdout, NULL, _IONBF, 0); + setvbuf(stdin, NULL, _IONBF, 0); + + char productKey[12] = {0}; + printf("Enter a Windows 95 product key: "); + read(0, productKey, 12); + productKey[12] = '\0'; + + if (isValidProductKey(productKey)) { + printf("Product key is valid!\n"); + if (check_password()) { + printf("Password correct!\n"); + get_flag(); + } else { + printf("Incorrect password.\n"); + } + } else { + printf("Invalid product key.\n"); + } + + return 0; +} diff --git a/reverse/license-ops/sol/sol.py b/reverse/license-ops/sol/sol.py new file mode 100644 index 0000000..3930199 --- /dev/null +++ b/reverse/license-ops/sol/sol.py @@ -0,0 +1,109 @@ +#!/usr/bin/python + +import random +import os +from pwn import * + +os.chdir('../setup') + +elf = context.binary = ELF("license", checksec=False) +context.terminal = ['kitty', '@', 'launch', '--cwd', 'current', '--location', 'hsplit', '--title', 'DEBUG'] +gs = ''' +init-pwndbg +c +''' + +# wrapper functrns +def sl(x): r.sendline(x) +def sla(x, y): r.sendlineafter(x, y) +def se(x): r.send(x) +def sa(x, y): r.sendafter(x, y) +def ru(x): return r.recvuntil(x) +def rl(): return r.recvline() +def cl(): return r.clean() +def uu64(x): return u64(x.ljust(8, b'\x00')) +def uuu(x): return unhex(x[2:]) + +def run(): + if args.GDB: + return gdb.debug(elf.path, gdbscript=gs) + elif args.R: + HOST = args.R.split(':')[0] + PORT = args.R.split(':')[1] + return remote(HOST, PORT) + else: + return process(elf.path) + +def is_valid_license(license_key): + prefix, suffix = license_key.split('_') + + invalid_prefixes = ['333', '444', '555', '666', '777', '888', '999'] + if prefix in invalid_prefixes: + return False + + if sum(int(digit) for digit in suffix) % 7 != 0: + return False + + return True + +def num_digits(num): + ct = 0 + while num > 0: + ct += 1 + num //= 10 + return ct + +def sum_of_digits(num): + sm = 0 + while num > 0: + rem = num % 10 + sm += rem + num //= 10 + return sm + +def cd_key_gen(): + x1 = random.randint(0, 1000) + while x1 % 111 == 0: + x1 = random.randint(0, 1000) + x1str = "" + if x1 > 100: + x1str = str(x1) + if 10 < x1 < 100: + x1str = "0" + str(x1) + if x1 < 10: + x1str = "00" + str(x1) + x2 = 1 + while sum_of_digits(x2) % 7 != 0: + x2 = random.randint(0, 10000000) + while x2 % 10 == 0 or x2 % 10 == 8 or x2 % 10 == 9: + x2 = random.randint(0, 10000000) + length = num_digits(x2) + x2str = "" + for i in range(0, 7 - length): + x2str += "0" + x2str += str(x2) + return x1str + "_" + x2str + +# =-=-= Solution =-=-==- +r = run() +## Generate valid license and send +#license = cd_key_gen() +# assert(is_valid_license(license)) == True + +# send known good license +license = b'716_8206741' + +log.info(f'Valid License found: {license}') + +sla(b'Enter a Windows 95 product key: ', license) + +# Send null-terminated password to bypass strcmp +# add newline to terminate read() +sla(b'Enter password: ', b'OrionProtc0l!!!\x00\n') + +log.success(r.recvall()) + +# run multiple times for valid license key generator +# 716_8206741 +# 396_4332063 +# 513_0358586