CTFSHOW内部赛 逆向4_好好学习 天天向上

admin 2022年1月5日23:13:16评论363 views字数 1347阅读4分29秒阅读模式

>

### id="flarum-content">

CTFSHOW内部赛 逆向4_好好学习 天天向上

CCCPuser

首先用x64dbg打开程序,搜索字符串,发现以下内容:
CTFSHOW内部赛 逆向4_好好学习 天天向上
因此很容易可以找到main函数入口位于00007FF714301250,函数如下:
CTFSHOW内部赛 逆向4_好好学习 天天向上
可以发现如果我们输入的是正确的flag的话,算法函数结束后al不会为0,因此我们接下来跟进算法函数内部进行观察
进入函数后发现其还调用了三次同一个函数:
CTFSHOW内部赛 逆向4_好好学习 天天向上
CTFSHOW内部赛 逆向4_好好学习 天天向上
我首先跟进了这个被调用的函数
CTFSHOW内部赛 逆向4_好好学习 天天向上
分析得知该函数:

  1. 以cl寄存器存储的值为参数
  2. 以eax存储的值为返回值
  3. 行为:检查一段指定的字符串中是否包含cl寄存器中的字符,该字符串为” abdefglostuyp{}”,如果包含,则将eax设为该字符对于字符串首地址的偏移,如cl==p,则返回的eax==0x0C;如果不包含,则将eax设为FFFFFFFF。
    注:若cl==0x00,则会返回0x10;
    因此我们需要在调用此函数前关注cl寄存器的值,调用后关注eax的值;
    回到算法函数,继续分析,
    函数先是使用了一个循环得到了我们输入字符串的长度,并将其与0x20比较,不等则跳转至xor al,al处,并随即return,根据之前条件可知,只有返回后al不为0才能输出正确,因此这一跳转直接转向了判定错误,因此我们得知:flag长度应为0x20.
    紧接着,在之后的代码中发现了程序进行了0x20次循环,因此我们判定函数要循环处理输入的每个字符,具体循环流程分析如下:
    设当前循环序号为i;(从0开始)
    1. 取第string这个字符存入cl,调用函数判断其是否在字符串中,不在则跳转至错误,否则继续;
    2. 定义变量,var1 = i0x10;
    3. 调用函数,取得string在字符串中的偏移offset1;
    4. 定义变量,var2 = (offset1 + var1)
    0x11;
    5. 调用函数,取得string[i+1]在字符串中的偏移offset2;
    6. 定义变量,var3 = var2 + offse2;
    7. 接下来程序直接取了一个地址作为基址,var38作为偏移量,读取了8个字节的内容,加在了一个新的变量var4(初始时为0),然后i++;
    注意:var4为各循环所得累加。
    循环结束后,程序直接将var4与0x1C836D8E5C11047F进行比较,不等就会失败,相等的话最后还会判断一下输入字符串的最后一个字符是不是0x7D(’}’),其实此时我们不看0x1C836D8E5C11047F的内容就可以发现,这题根本没法通过正常手段解出flag。
    但是我们也通过逆向得到了一些条件,如flag由” abdefglostuyp{}
    ”这16个字符组成,并且长度为0x20,最后一个字符为’}’;
    此时根据直觉我们可以猜想出flag格式应为flag{
    ****},而后根据题目信息“好好学习 天天向上”,结合可用字符串,出题者的用意,现ctf出题规律等因素可得出,正确flag可能为“flag{good_good_study_day_day_up}”,进入程序输入该字符串发现程序得出成功提示,因此可知,正确flag确实如此。

注:这题我真是蒙的


yuchoxuuan

CCCPuser
这就是预期解


fffdy

师傅牛皮


CCCPuser

fffdy 我是真的新手,第一次比赛,基本啥也不会


  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月5日23:13:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTFSHOW内部赛 逆向4_好好学习 天天向上https://cn-sec.com/archives/720112.html

发表评论

匿名网友 填写信息