BUUCTF reverse16-20 WP

17 篇文章 4 订阅
8 篇文章 6 订阅

写脚本技术很菜,所以和其他wp相比看起来比较麻烦
笔记是按照当时的题目排序写的,顺序可能有出入
做题是从0开始做起,所以前面部分也会尽可能写的详细一点
只要能记录并且了解到怎么做即可,所以就没有去在意排版
遇到不会的函数尽可能去百度了解
因为前面的题难度不大,所以前面的每道题都没有去查壳,除非有特殊:)

题目:[GWCTF 2019]pyre、[BJDCTF2020]JustRE、rsa、CrackRTF、[ACTF新生赛2020]easyre

16.[GWCTF 2019]pyre
得到的 flag 请包上 flag{} 提交。

下载附件,得到attachment.pyc,打开kali,用uncompyle6进行反编译

uncompyle6 attachment.pyc > attachment.py

打开attachment.py

# uncompyle6 version 3.7.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.8.7 (default, Dec 22 2020, 10:37:26) 
# [GCC 10.2.1 20201207]
# Embedded file name: encode.py
# Compiled at: 2019-08-19 21:01:57
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[(i + 1)]

print code
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
# okay decompiling attachment.pyc

简单逆向,放入的input1经过变换之后成code,code经过异或之后成最终的code[],所以反过来即可

code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
l=len(code)
flag = ''
for i in range(l-2,-1,-1):
    code[i] = chr(ord(code[i]) ^ ord(code[(i+1)]))

for i in range(l):
    flag+=chr((ord(code[i])-i)%128)
print(flag)

flag{Just_Re_1s_Ha66y!}

17.[BJDCTF2020]JustRE
得到的 flag 请包上 flag{} 提交。来源:https://github.com/BjdsecCA/BJDCTF2020

下载附件,运行看看
在这里插入图片描述
IDA打开
shift+F12查看字符串,发现有DJB字样,双击跳转并跳转至函数
在这里插入图片描述

其中有个sprintf当4099F0==19999的时候,将字符串BJD{%d%d2069a45792d233ac}写入
那么%d分别应该对应的是19999和0
所以可以得到flag

flag{1999902069a45792d233ac}

18.rsa
ras是一个非常神秘的算法,那么它神秘在哪里 请少侠自己摸索! 注意:得到的 flag 请包上 flag{} 提交

下载得到enc和key,直接RsaCtfTool(github上自行下载)一把梭,原理和一般的题型见我另一篇https://blog.csdn.net/qq_42880719/article/details/114179370

python3 RsaCtfTool.py --publickey pub.key --uncipherfile flag.enc

在这里插入图片描述

flag{decrypt_256}

19.CrackRTF
在互联网时代,兼容就是胜利,兼容就是王道。为了遏制微软一家独大的趋势,小明自诩民族斗士,向微软CEO挑战,CEO给了他一个文件,据说破解后能得到一个微软的多信息文本格式文件。只有得到了才能获得挑战CEO的机会。小明绞尽脑汁,最后不得不求助大家。。。兄弟们该出手时就出手! 注意:得到的 flag 请包上 flag{} 提交

下载附件,IDA打开,找到main函数,开始审计

memset(&pbData, 0, 0x104u);
  memset(&String1, 0, 0x104u);
  v4 = 0;
  printf("pls input the first passwd(1): ");
  scanf("%s", &pbData);
  if ( strlen((const char *)&pbData) != 6 )
  {
    printf("Must be 6 characters!\n");
    ExitProcess(0);
  }
  v4 = atoi((const char *)&pbData);
  if ( v4 < 100000 )
    ExitProcess(0);
  strcat((char *)&pbData, "@DBApp");
  v0 = strlen((const char *)&pbData);
  sub_40100A(&pbData, v0, &String1);
  if ( !_strcmpi(&String1, "6E32D0943418C2C33385BC35A1470250DD8923A9") )
  {
    printf("continue...\n\n");
    printf("pls input the first passwd(2): ");
    memset(&String, 0, 0x104u);
    scanf("%s", &String);
    if ( strlen(&String) != 6 )
    {
      printf("Must be 6 characters!\n");
      ExitProcess(0);
    }
    strcat(&String, (const char *)&pbData);
    memset(&String1, 0, 0x104u);
    v1 = strlen(&String);
    sub_401019((BYTE *)&String, v1, &String1);
    if ( !_strcmpi("27019e688a4e62a649fd99cadaafdb4e", &String1) )
    {
      if ( !(unsigned __int8)sub_40100F(&String) )
      {
        printf("Error!!\n");
        ExitProcess(0);
      }
      printf("bye ~~\n");
    }
  }
  return 0;

首先判断输入的pdData长度是否为6,然后把值赋值给v4,判断v4是否>=100000,然后将@DBApp拼接在v4后面,v0=v4的长度(即12)
之后进入sub_40100A函数,出来后与6E32D0943418C2C33385BC35A1470250DD8923A9进行对比

通过了之后再进行新的判断,String的长度也要为6,并且拼接在pdData前面,进入sub_401019函数加密后,又与27019e688a4e62a649fd99cadaafdb4e进行判断,判断过后又要经过sub_40100F

首先查看sub_40100A函数,需要继续跟进sub_401230,
在这里插入图片描述

可以发现,使用了Hash加密,8004是指用什么方法去加密这里是指sha1,应该是调用了自带的加密库,所以直接写脚本爆破

import hashlib
r = '6E32D0943418C2C33385BC35A1470250DD8923A9'
flag='@DBApp'
for i in range(100000,1000000):
    if(hashlib.sha1((str(i)+flag).encode())).hexdigest().lower() == r.lower():
        print(str(i)+flag)

在这里插入图片描述
得到123321@DBApp

查看sub_401019,跟进查看,发现这次是调用8003(MD5)
输入6个字符如果纯爆破将会爆破很久,所以先查看sub_40100F函数,跟进查看sub_4014D0函数
在这里插入图片描述

看不懂了,去看了看其他大佬的博客

第1~21行:查找类型“AAA”,名称0x65的资源。
第22行:将第二段密码与查找到的资源进行某种变换(进入sub_401005函数)。
第23行~最后:将变换得到的信息写入dbapp.rtf文件。

查看sub_401005函数,函数是要把APP的开头6位与用户输入的6位进行异或
在这里插入图片描述

根据分析之前11-22行代码可以得知,这里是需要将AAA里面找到的特定字符与我们拼接好的字符进行异或然后写到dbapp.rtf文件中去
AAA的值需要使用ResourceHacker查看
在这里插入图片描述

因为是rft文件,所以可以去搜索文件头https://blog.csdn.net/dream_dt/article/details/79215798
可以发现前六个字符是{\rtf1
那么直接把app的前六位和{\rtf1异或即可得到需要用户输入的,写脚本

aaa = [0x5, 0x7d, 0x41, 0x15, 0x26, 0x1]
header = [0x7b, 0x5c, 0x72, 0x74, 0x66, 0x31]
flag = ''

for i in range(len(aaa)):
    flag+=chr(aaa[i]^header[i])
    print(flag)

在这里插入图片描述
所以合起来,用户输入的内容是

123321
~!3a@0

运行程序,按顺序输入,会生成一个dbapp.rtf文件,打开即是flag
在这里插入图片描述

flag{N0_M0re_Free_Bugs}

20.[ACTF新生赛2020]easyre
得到的 flag 请包上 flag{} 提交。

下载后IDA打开发现并未显示,winhex能明显看到UPX壳,exeinfope查壳

在这里插入图片描述
UPXShell脱壳,再用IDA打开
在这里插入图片描述

查看一下_data_start__
在这里插入图片描述
即v4和_data_start__函数中字符串里面寻找一个字符然后 -1 进行对比

tmp = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
main = [42, 70, 39, 34, 78, 44, 34, 40, 73, 63, 43, 64]
n=[]
flag=''
for i in main:
    n.append(tmp.find(chr(i))+1)
for i in n:
    flag += chr(i)
print('flag{'+flag+'}')

在这里插入图片描述

flag{U9X_1S_W6@T?}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值