首页 > 其他分享 >[NPUCTF2020]Baby Obfuscation

[NPUCTF2020]Baby Obfuscation

时间:2023-08-18 15:14:13浏览次数:32  
标签:Obfuscation temp hex 0x00 A0X6 flag A0X1 Baby NPUCTF2020

[NPUCTF2020]Baby Obfuscation

将该文件使用ida打开并直接查看main()函数

image-20230809183505135

发现程序的主要逻辑为判断用户的输入是否符合要求,推测用户的输入为flag

image-20230809183647856

image-20230809183658255

此时我们倒着分析来看,发现A0X1的值要与F0X4(A0X6[i_1], 1) / 10的值相等

image-20230809192927883

此时我们进入F0X4()函数分析

image-20230809193012386

该函数的功能是返回a - b的值,所以此时需要A0X1的值与(A0X6 - 1)/10的值相等,而A0X6的值是已知的,因此本地的关键要用A0X1的值逆向推出用户的输入

image-20230809193800365

此时我们可以看到有五处对A0X1进行操作的地方,因此我们需要逐一分析

首先查看第一处

image-20230809194036832

F0X1()函数的功能如下所示,查询资料得知该函数是求两数的最大公约数

image-20230809194148906

F0X5()函数的功能如下所示,发现该函数返回a的b次方

image-20230809194404745

根据不等式(x+y)×(x+y) >= 4xy,因此第一处的判断恒成立,所以第一处的操作会执行

执行的操作为A0X1[i] = input - A0X4[i%4],接下来分析第二处

image-20230809195034494

此时我们计算得知不等号两边的值都为1,因此此时if 的判断条件不成立,而接下来对A0X1的操作不会执行,然后我们再看第三处

image-20230809195301797

相关变量的值已经通过注释标出,此时if 的判断条件成立,因此第三处的操作会执行,所以此处执行的操作实际上为异或操作:A0X1 ^= A0X4[i%4]

我们继续查看第四处

image-20230809195629568

我们点进F0X3函数()进行查看

image-20230809195719683

发现还欠嵌套了一个F0X2()函数,我们继续查看

image-20230809195816055

综合分析得知只有当a == b == 1的时候F0X3()会返回true,因此此处的if 判断不会成立,操作不会执行

我们最后查看第5处

image-20230809200205451

此处没有判定条件,一定会执行,此处执行的操作为*A0X1[i] = 10

综上所述,可以逆向三处操作的顺序来得到正确用户输入,解题脚本如下:

A0X6 = [0x00, 0x00, 0x00, 0x00, 0x79, 0x1E, 0x00, 0x00, 0x79, 0x1E, 
  0x00, 0x00, 0x35, 0x21, 0x00, 0x00, 0x0D, 0x17, 0x00, 0x00, 
  0x41, 0x1F, 0x00, 0x00, 0x01, 0x19, 0x00, 0x00, 0xED, 0x2C, 
  0x00, 0x00, 0xF9, 0x11, 0x00, 0x00, 0x49, 0x26, 0x00, 0x00, 
  0x81, 0x25, 0x00, 0x00, 0xB5, 0x2D, 0x00, 0x00, 0xB5, 0x14, 
  0x00, 0x00, 0xE5, 0x25, 0x00, 0x00, 0x31, 0x2A, 0x00, 0x00, 
  0xD5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x70, 0x57, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

A0X4 = [2,3,4,5]
num1 = []
flag = ''

for i in range(len(A0X6)):
    if i%4 == 0:
        temp = ''
        if A0X6[i+3] !=0:
            if len(hex(A0X6[i+3])[2:]) == 1:
                temp = '0'+hex(A0X6[i+3])[2:]
            else:
                temp = hex(A0X6[i+3])[2:]
        if A0X6[i+2] !=0:
            if len(hex(A0X6[i+2])[2:]) == 1:
                temp = temp + '0'+hex(A0X6[i+2])[2:]
            else:
                temp = temp + hex(A0X6[i+2])[2:]
        if A0X6[i+1] !=0:
            if len(hex(A0X6[i+1])[2:]) == 1:
                temp = temp + '0'+hex(A0X6[i+1])[2:] 
            else:
                temp = temp + hex(A0X6[i+1])[2:]
        if A0X6[i] !=0:  
            if len(hex(A0X6[i])[2:]) == 1:
                temp = temp + '0'+hex(A0X6[i])[2:]
            else:
                temp = temp + hex(A0X6[i])[2:]
        if temp == '':
            temp = '00'
        num1.append(int(('0x'+temp), 16))        
print(num1)
for i in range(1,16):
    A0X1 = (num1[i] -1) / 10
    A0X1 = int(A0X1 / 10)
    A0X1 = A0X1 ^ A0X4[(i-1)%4]
    flag += chr(A0X1 + A0X4[(i-1)%4])

print(flag)

image-20230809200554294

最后可以得到本题的flag:

flag{0bfu5er}

标签:Obfuscation,temp,hex,0x00,A0X6,flag,A0X1,Baby,NPUCTF2020
From: https://www.cnblogs.com/h40vv3n/p/17617901.html

相关文章

  • [GXYCTF 2019]BabyUpload
    [GXYCTF2019]BabyUpload题目来源:nssctf题目类型:web涉及考点:文件上传1.题目要求直接传马,先试试`muma.php`不行,再试试muma.jpg:提示说明一句话木马内不能有php标志(即<?),我们看看响应标头,使用的是php5.6.23因此可以构造<scriptlanguage='php'>eval($_POST['r00ts']);<......
  • [NISACTF 2022]babyupload
    [NISACTF2022]babyupload题目来源:nssctf题目类型:web涉及考点:文件上传1.题目说传一个图片文件,那我们传个muma.jpg看看但是上传失败:回去检查一下源代码,发现有/source直接访问下载了一个压缩文件,解压之后是一个py文件,随后进行代码审计2.代码审计fromflaskimportFl......
  • [NISACTF 2022]babyserialize
    非常典型的一道POP链构造题目源码<?phpinclude"waf.php";classNISA{public$fun="show_me_flag";public$txw4ever;publicfunction__wakeup(){if($this->fun=="show_me_flag"){hint();}......
  • bjdctf_2020_babyrop
    bjdctf_2020_babyrop0x01注意这题位64位。32位和64位传参有区别思路:利用puts函数泄露出puts函数真实地址通过puts函数地址计算出libc基地址,从而计算出system和binsh的真实地址构造rop链栈溢出getshellputs函数通过poprdi;ret传参用ROPgadget可以找到0x02exp#enc......
  • [HarekazeCTF2019]baby_rop2
    [HarekazeCTF2019]baby_rop264位的ret2libc30x01利用printf泄露libc版本和基地址,传参的时候需要传入格式化字符串%s给寄存器rdi(程序中第二个printf函数自带,返回至该格式化字符串地址即可);并将想要泄露的read_got传给寄存器。0x02expfrompwnimport*fromLibcSearcherimp......
  • [OGeek2019]babyrop
    [OGeek2019]babyrop0x0164位程序,开启NX没有system函数和/bin/sh字符串0x02分析程序:main函数中,先读取一个随机数到fd,并作为参数传入sub_804871F函数,再将sub_804871F函数的返回值作为参数传入sub_80487D0函数里。main函数sub_804871F函数sub_80487D0函数观察程序我们可......
  • CTFer成长记录——CTF之Web专题·极客大挑战—BabySQL
    一、题目链接https://buuoj.cn/challenges#[%E6%9E%81%E5%AE%A2%E5%A4%A7%E6%8C%91%E6%88%98%202019]BabySQL二、解法步骤  本题是SQL注入,那么先尝试万能密码:1'or1=1#  发现or后面的东西都失效了,猜测对or进行了过滤,这里用双写绕过试试:1'oorr1=1#:  登陆成功。接......
  • m1 mac 上使用 babylon native 构建项目注意事项
    目前(2023-07-29)babylon不支持arm架构的模拟器,所以需要开启Rosetta构建命令(使用模拟器64位,x86_64)cmake-Bbuild/iOS-GXcode-DCMAKE_TOOLCHAIN_FILE=Dependencies/ios-cmake/ios.toolchain.cmake-DPLATFORM=SIMULATOR64-DENABLE_ARC=0-DDEPLOYMENT_TARGET=16xcode......
  • DeepObfusCode:Source Code Obfuscation Through Sequence-to-Sequence Networks
    一、Introduction代码混淆技术旨在解决代码逆向对抗问题。本质上,代码混淆技术的目标是:在保持一个程序逻辑结构不变以及完整保存的前提下,同时让攻击者不易识别,以此保护软件的完整性和知识产权。传统的防护策略包括:插入空白/冗余的逻辑运算增加不必要的条件运算等传统的混淆......
  • [SWPUCTF 2021 新生赛]babyrce
    [SWPUCTF2021新生赛]babyrce题目来源:nssctf题目类型:web涉及考点:Cookie注入、代码审计1.上来先代码审计<?phperror_reporting(0);header("Content-Type:text/html;charset=utf-8");highlight_file(__FILE__);if($_COOKIE['admin']==1){include"../next.p......