REVERSE-PRACTICE-BUUCTF-23

  • [2019红帽杯]Snake
  • [BSidesSF2019]blink
  • [De1CTF2019]Re_Sign
  • [ACTF新生赛2020]Splendid_MineCraft

[2019红帽杯]Snake

unity游戏,dnSpy打开Snake\Snake_Data\Managed\Assembly-CSharp.dll
发现要载入Interface这个dll

ida打开Snake\Snake_Data\Plugins\Interface.dll
交叉引用字符串"You win! flag is "来到GameObject函数
分析GameObject函数,该函数只有一个参数a1,当a1∈[0,99]时,会执行if语句包络的代码,其中就有输出flag的语句


于是考虑爆破,写C代码,载入Interface.dll,调用GameObject函数,传入从0到99之间的整数,爆破成功即可得到flag,从flag可以知道是RSA加密算法

#include<iostream>
#include<Windows.h>
#include"ida_defs.h"
//函数指针
typedef signed __int64(*Dllfunc)(int);
using namespace std;
int main()
{Dllfunc GameObject;//GameObject是dll中想要调用的函数名称HINSTANCE hdll = NULL;hdll = LoadLibrary("Interface.dll");//加载dll                             if (hdll == NULL){cout << "加载动态库失败\n";}else{GameObject = (Dllfunc)GetProcAddress(hdll, "GameObject");//到dll中定位函数if (GameObject == NULL){cout << "加载动态库方法失败\n";}else{for (int i = 0; i <= 99; i++){signed __int64 res = GameObject(i);}}}FreeLibrary(hdll);//释放dllreturn 0;
}
/*
You win! flag is
flag{Ch4rp_W1th_R$@}
*/

[BSidesSF2019]blink

apk文件,jadx-gui打开,com.example.blink.MainActivity什么都没有
在com.example.blink.r2d2中,将一段字符串解base64,分割成byte数组,填入一个图像文件中

apk在模拟器中双击运行会直接退出
按照jeb调试apk smali的方法,在启动apk activity时,将MainActivity改成r2d2,即adb shell am start -D -n com.example.blink/com.example.blink.r2d2,jeb附加后运行即可得到flag

[De1CTF2019]Re_Sign

exe程序,运行后输入,有upx壳,ESP定律脱壳后ida分析
交叉引用字符串"Success"来到sub_401000函数,程序脱壳后不能运行,ida和x32dbg配合分析
调试发现,sub_402BA0函数读取输入,sub_402E40函数和sub_sub_402F80函数都是简单的赋值,调试的输入为"abcdefg",经过sub_401233函数变换为"GD9MH6SeHd==",而正常的base64编码结果为"YWJjZGVmZw==",猜测sub_401233函数是变表base64,重要的是找到变表

F7单步步入sub_401233函数,在这个地方找到变表

验证一下,sub_401233函数的变表就是找到的这个表

分析sub_401F0A函数,输入经变表base64编码后,在while循环体中,一个字节一个字节拷贝到v30,v30赋给v37,v37传入sub_2160函数,返回值与v25(ebx)指向的int数据比较

sub_402160函数中使用到了常规base64表,调试输入为"abcdefg",变表base64后为"GD9MH6SeHd==",第一个字节"G"传入sub_402160函数,返回值为7,也就是"G"在常规base64表中的位置(下标从1开始),于是可知要去比较的数据也是某字符在常规base64表中的位置(下标从1开始)

x32dbg调试得到要去比较的数据

写逆运算脚本即可得到flag

#coding:utf-8
import base64
table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
table_changed="0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm+/="
data=[0x08,0x3b,0x01,0x20,0x07,0x34,0x09,0x1f,0x18,0x24,0x13,0x03,0x10,0x38,0x09,0x1b,0x08,0x34,0x13,0x02,0x08,0x22,0x12,0x03,0x05,0x06,0x12,0x03,0x0f,0x22,0x12,0x17,0x08,0x01,0x29,0x22,0x06,0x24,0x32,0x24,0x0f,0x1f,0x2b,0x24,0x03,0x15,0x41,0x41]
s=""
ss=""
for i in data:s+=table[i-1]       #s赋完值其实是输入经变表base64后的结果
for c in s:ss+=table[table_changed.find(c)]    #由变表和常规表的映射得到常规base64编码的结果
print(base64.b64decode(ss))
#de1ctf{E_L4nguag3_1s_K3KeK3_N4Ji4}

[ACTF新生赛2020]Splendid_MineCraft

exe程序,运行后输入,无壳,ida分析
交叉引用字符串"Welcome to ACTF_Splendid_MineCraft!“来到sub_401080函数
读取输入,验证输入的长度是否为26,strtok函数用字符’_'将输入分割成三个部分,于是可知输入的格式为"ACTF{xxxxxx_yyyyyy_xxxxxx}”,v12-v13(v14-v15)为{}中的第一部分"xxxxxx",v8-v9为{}中的第二部分"yyyyyy",v10-v11为{}中的第三部分"xxxxxx"

v12-v13,即{}中的第一部分要进入dword_4051D8,经SMC后,验证{}中的第一部分
来到data段dword_4051D8,按d转成字节形式的数据,按c转成代码,可看到SMC的代码

调试,SMC执行完成后是这个样子

往下走,来到验证{}内的第一部分的代码,“3@1b;b"和"elcome"两个字符串异或,再加0x23,结果与传入的{}内的第一部分比较,可知正确的第一部分的6个字符为"yOu0y*”

由于v5与{}内的第一部分的6个字符相关,更新输入后调试,可知v5==0x20
执行完SMC后,来到验证{}内第二部分的代码,eax指向的是数组byte_DC5018,于是这段代码的验证思路就是,cl=byte_DC5018[input[i]^(i+0x83)],写脚本可知第二部分为"knowo3"

往下走(期间要修改几次ZF的值),来到验证第三部分的代码,这里直接比较第三部分和已知字符串"5mcsM<"

于是三个部分的脚本放在一起就是,输入flag,验证成功

#coding:utf-8
flag="ACTF{"
#第一部分
s1="3@1b;b"
s2="elcome"
data=[]
for i in range(len(s1)):data.append(ord(s1[i])^ord(s2[i]))
for i in range(len(data)):data[i]+=0x23
flag+=''.join(chr(i) for i in data)
flag+='_'
#第二部分
data=[0xF6, 0xA3, 0x5B, 0x9D, 0xE0, 0x95, 0x98, 0x68, 0x8C, 0x65,0xBB, 0x76, 0x89, 0xD4, 0x09, 0xFD, 0xF3, 0x5C, 0x3C, 0x4C,0x36, 0x8E, 0x4D, 0xC4, 0x80, 0x44, 0xD6, 0xA9, 0x01, 0x32,0x77, 0x29, 0x90, 0xBC, 0xC0, 0xA8, 0xD8, 0xF9, 0xE1, 0x1D,0xE4, 0x67, 0x7D, 0x2A, 0x2C, 0x59, 0x9E, 0x3D, 0x7A, 0x34,0x11, 0x43, 0x74, 0xD1, 0x62, 0x60, 0x02, 0x4B, 0xAE, 0x99,0x57, 0xC6, 0x73, 0xB0, 0x33, 0x18, 0x2B, 0xFE, 0xB9, 0x85,0xB6, 0xD9, 0xDE, 0x7B, 0xCF, 0x4F, 0xB3, 0xD5, 0x08, 0x7C,0x0A, 0x71, 0x12, 0x06, 0x37, 0xFF, 0x7F, 0xB7, 0x46, 0x42,0x25, 0xC9, 0xD0, 0x50, 0x52, 0xCE, 0xBD, 0x6C, 0xE5, 0x6F,0xA5, 0x15, 0xED, 0x64, 0xF0, 0x23, 0x35, 0xE7, 0x0C, 0x61,0xA4, 0xD7, 0x51, 0x75, 0x9A, 0xF2, 0x1E, 0xEB, 0x58, 0xF1,0x94, 0xC3, 0x2F, 0x56, 0xF7, 0xE6, 0x86, 0x47, 0xFB, 0x83,0x5E, 0xCC, 0x21, 0x4A, 0x24, 0x07, 0x1C, 0x8A, 0x5A, 0x17,0x1B, 0xDA, 0xEC, 0x38, 0x0E, 0x7E, 0xB4, 0x48, 0x88, 0xF4,0xB8, 0x27, 0x91, 0x00, 0x13, 0x97, 0xBE, 0x53, 0xC2, 0xE8,0xEA, 0x1A, 0xE9, 0x2D, 0x14, 0x0B, 0xBF, 0xB5, 0x40, 0x79,0xD2, 0x3E, 0x19, 0x5D, 0xF8, 0x69, 0x39, 0x5F, 0xDB, 0xFA,0xB2, 0x8B, 0x6E, 0xA2, 0xDF, 0x16, 0xE2, 0x63, 0xB1, 0x20,0xCB, 0xBA, 0xEE, 0x8D, 0xAA, 0xC8, 0xC7, 0xC5, 0x05, 0x66,0x6D, 0x3A, 0x45, 0x72, 0x0D, 0xCA, 0x84, 0x4E, 0xF5, 0x31,0x6B, 0x92, 0xDC, 0xDD, 0x9C, 0x3F, 0x55, 0x96, 0xA1, 0x9F,0xCD, 0x9B, 0xE3, 0xA0, 0xA7, 0xFC, 0xC1, 0x78, 0x10, 0x2E,0x82, 0x8F, 0x30, 0x54, 0x04, 0xAC, 0x41, 0x93, 0xD3, 0x3B,0xEF, 0x03, 0x81, 0x70, 0xA6, 0x1F, 0x22, 0x26, 0x28, 0x6A,0xAB, 0x87, 0xAD, 0x49, 0x0F, 0xAF]
res=[0x30,0x4,0x4,0x3,0x30,0x63]
for i in range(len(res)):for j in range(len(data)):if data[j]==res[i]:flag+=chr(j^(i+0x83))
flag+='_'
#第三部分
flag+="5mcsM<"
flag+='}'
print(flag)
#ACTF{yOu0y*_knowo3_5mcsM<}

REVERSE-PRACTICE-BUUCTF-23相关推荐

  1. 基于HTML5实现3D热图Heatmap应用

    Heatmap热图通过众多数据点信息,汇聚成直观可视化颜色效果,热图已广泛被应用于气象预报.医疗成像.机房温度监控等行业,甚至应用于竞技体育领域的数据分析. http://www.hightopo.c ...

  2. 通过printf设置Linux终端输出的颜色和显示方式

    前言 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据. 终端的字符颜色由转义序列(Escape Sequence)控制,是文 ...

  3. 针对多类型数据库,集群数据库的有序GUID

    一.背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramewor ...

  4. if break语句_8、嵌套if语句、switch语句

    1.嵌套if语句 嵌套if语句是指在 if...else分支中还存在if...else 语句. 不大难,题目后期当练习再补. 2.switch语句 示例3.20: 看起来不难,先判断是否是2种情况,不 ...

  5. Linux下输出不同颜色的字体详解

    1.介绍:终端字符的颜色是用转义序列进行控制,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以 ESC 开头,可以用 \033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 ...

  6. ML一:python的KNN算法

    (1):list的排序算法: 参考链接:http://blog.csdn.net/horin153/article/details/7076321 示例: DisListSorted = sorted ...

  7. 【算法竞赛学习】二手车交易价格预测-Task4建模调参

    二手车交易价格预测-Task4 建模调参 四.建模与调参 Tip:此部分为零基础入门数据挖掘的 Task4 建模调参 部分,带你来了解各种模型以及模型的评价和调参策略,欢迎大家后续多多交流. 赛题:零 ...

  8. linux 屏幕输出 高亮_通过printf设置Linux终端输出的颜色和显示方式

    转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出 ...

  9. 函数中的 arguments

    每个函数(非箭头)在被调用时都会自动取得两个特殊变量:this 和 arguments.内部函数在搜索这两个变量时,只会搜索到其活动对象为止. arguments 是一个类数组对象,里面保存着调用函数 ...

  10. python学习笔记之列表(list)

    列表 1.索引:序列中的所有元素都是有编号的--从0开始递增 >>> List=['hello','Jeff'] >>> List[0] 'hello' >& ...

最新文章

  1. diou ciou torch
  2. Linux 访问权限
  3. 使用Intellij IDEA 14.0.2 编译项目耗时特别长的问题
  4. 记录各种体育活动(持续更新到不更新为止)
  5. android第二十步摄像
  6. c语言递归求差分方程,如何使这个简单的递推关系(差分方程)尾递归?
  7. 查询SQLSERVER执行过的SQL记录
  8. 5.2创建socket
  9. PageHelper.cs(20170223)
  10. RN开发关闭所有黄色警告弹出(console.warn())
  11. 【UML 建模】在线UML建模工具 ProcessOn 使用详解
  12. data-toggle=dropdown/data-target/data-dismiss/data-backdrop/data-spy/data-slide/data-source是什么意思?
  13. 【已解决】MAC OS上teamviewer商业用途中断连接
  14. 假期之不务正业—— Qt+FFmpeg+百度api进行视频的语音识别
  15. Vue实战:简易布局Dome
  16. android中bitmap压缩的几种方法详解
  17. linux I2c设备注册
  18. js 忽略字母大小写
  19. 互联网产品经理的职责范围、能力要求
  20. WWDC 2018 | 软件全面迭代更新,无硬件发布

热门文章

  1. Java学习二:Javac Java的学习(原创)
  2. sqlite3使用简介(内含解决sqlite内存的方法)
  3. PHP面向对象2之变量、方法
  4. 基于ArcEngine实现分组统计面积的功能
  5. 语言差异引起的问题解决一例
  6. 【数据结构与算法】二叉树
  7. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第50篇]什么是BLS基于Weil对的签名方案?
  8. Vasya and Multisets CodeForces - 1051C 模拟|分类讨论
  9. ALLyeSNO 优化版浩方 第二版 Ver 2007 06 15 清除广告 自动挤房间
  10. MATLAB统计与回归