女娲补天:指星期天打了一天的V3,再不学re👶要被开了(确信
rocket
官方给了个Hint: rocket题目环境建议使用Ubuntu22.04,racket版本8.2
先配环境,直接按照hint去github上找.sh脚本安装的话运行程序会一直报permission denied的错而且解决不了(如果有大爹解决了请务必告诉我)。
只能就着一部分动调+静态嗯逆了。main函数里可以看见许多判断路径的操作,在最开始疯狂报错的动调中也可以发现他应该是在找文件路径,并且尝试附加参数什么的。并且就报错信息而言可以怀疑是racket语言编写的程序自带的一个函数。报错差不多就下面这样
并且,main函数里的动调可以发现变量file来自调用函数sub_5592080D70F0(),里面是/proc/self/exe,这是readlink()操作,代表从当前的程序读取。
随后用v17打开file,并不断通过ptrace操作进行跟踪。
通过代码分析可以发现其目的是执行255行的if ( !strcmp((const char *)ptrc + (unsigned int)v103[0], ".rackprog") )
,
ptrc是一个指针,v103是通过sys_read读的东西,根据前面file来自我们自己的程序,那么.rackprog也在我们程序里面吧大概。
尝试010 Editor搜一下,发现有两处
第一处感觉是报错信息啥的,但第二处很显然是个代码段的名字。找一下.rackprog代码段,会发现里面有一个巨大的data数组
把data给dump下来,尝试搜了下关键字rocket,然后会发现一堆诸如hex->string的明文操作,然后还有一步特别像运算的^([[:xdigit:]]{2})*$
然后大眼瞪了一万年只发现了把字符串转换成整型,以及把数据转换成hex数据再转换成字符串的操作,十分自闭。
随后直接去GitHub配了最新版的racket重新动调,然后execv()里有一步syscall,附加调试报错
然后生无可恋,自暴自弃想了下会不会就只有^([[:xdigit:]]{2})*$
一步操作,猜测这玩意是做了一次乘2或者平方或者立方,用output的数据一个一个试了一下,然后发现
import gmpy2
import binasciienc = 7212272804013543391008421832457418223544765489764042171135982569211377620290274828526744558976950004052088838419495093523281490171119109149692343753662521483209758621522737222024221994157092624427343057143179489608942837157528031299236230089474932932551406181
# enf = gmpy2.iroot(enc, 2)[0].digits()
enf = gmpy2.iroot(enc, 3)[0].digits()
print(enf)# flag = 193207530030250486323082807418528242300453594901698934812368796575822264198418283118461
# print(hex(flag))enf = "6374667b746831735f69735f7265346c6c795f626561757431666c795f72316768743f7d"
hex = enf.encode('utf-8')
str = binascii.unhexlify(hex)flag = str.decode('utf-8')
print(flag)
十分懵逼地得到flag:ctf{th1s_is_re4lly_beaut1fly_r1ght?}
(真的是太美丽了