REVERSE-PRACTICE-BUUCTF-17

REVERSE-PRACTICE-BUUCTF-17

    • [网鼎杯 2020 青龙组]jocker
    • [2019红帽杯]childRE
    • [MRCTF2020]PixelShooter
    • [ACTF新生赛2020]SoulLike

[网鼎杯 2020 青龙组]jocker

exe程序,运行后提示输入flag,无壳,用ida分析
main函数平衡栈后,F5反汇编
主要逻辑为
读取输入,检验输入长度是否为24,对输入进行变换,与已知数组比较,执行一段从encrypt函数起始地址开始的SMC,分析可知,finally函数也会完全被SMC,未经变换的输入作为参数,调用encrypt函数和finally函数
jocker-main
先写input经过wrong变换和omg验证的逆运算脚本,得到的是假flag
jocker-fakeflag
往下走,在ida中使用idapython脚本完成SMC自修改代码

from idaapi import *
from idautils import *
start_addr = 0x401500
key = 0x41
for i in range(start_addr,start_addr+187):PatchByte(i,Byte(i)^key)

SMC前,encrypt函数和finally函数各自包含了一大段数据
jocker-presmc
SMC后,encrypt函数和finally函数的指令间都有一些db指令,实际上为花指令
encrypt函数:
jocker-pastsmc
finally函数:
jocker-pastsmc
手动nop掉多余的db指令,让ida能够自动分析成代码
完成nop后,发现encrypt函数,在两端黑色代码中间插有一段红色代码
jocker-nop
这时的处理方法是,在encrypt函数起始地址0x401500处,右键->undefine,变成黄色的数据,再按c转成代码,这时,encrypt函数起始地址与finally函数起始地址之间的代码全部为红色,再在encrypt函数起始地址0x401500处,右键->create function,平衡栈后,F5反汇编
这里encrypt函数反汇编后,好像没有用到未经变换的input,可能是patch代码的时候出错了,不过可以猜测为input和字符串“hahahaha_do_you_find_me?”异或,再与已知的unk_403040数组比较
jocker-encrypt
写encrypt函数的逆运算脚本,得到部分flag,之所以是部分flag,是因为长度为24的unk_403040的最后5个元素为0,“d_me?”与0异或不变,或者v6=19说明了只异或了19次,而且提交失败
jocker-partflag
同encrypt函数的解析步骤,对finally函数,先nop掉多余的db指令,undefine掉黑色代码,转成数据,按c再转成代码,右键->create function,F5反汇编
没看懂这个函数,看了其他师傅的wp,说这里也是异或,能看到的5个值[37,116,112,38,58]是异或后要比较的值,由于input的最后一位一定是“}”,它异或一个值(“71”)后与58相等,而且它之前的四位也是和这个值(“71”)异或,结果是58之前的四个值
jocker-finally
写finally函数的逆运算脚本得到后半部分的flag,替换掉“flag{d07abccf8a410cd_me?”的后5位,flag即为“flag{d07abccf8a410cb37a}”
jocker-partflag

[2019红帽杯]childRE

exe程序,运行后直接输入,无壳,ida分析
交叉引用字符串“flag{MD5(your input)}”来到sub_140001610函数
sub_140001610函数主要的逻辑为
读取输入,验证输入的长度是否为31,对输入进行位置变换处理,位置变换的结果放到v2(name),经调试可知,输入为abcdefghijklmnopqrstuvwxyz12345时,v2(name)的内容为pqhrsidtujvwkebxylz1mf23n45ogca
对v2(name)调用UnDecorateSymbolName函数处理,结果放到outputstring,验证outputstring的长度62及其内容

signed __int64 sub_7FF6DC281610()
{signed __int64 input_len; // rax_QWORD *v1; // raxconst CHAR *v2; // r11__int64 v3; // r10__int64 v4; // r9const CHAR *v5; // r10signed __int64 outputstring_len; // rcx__int64 v7; // raxsigned __int64 result; // raxunsigned int v9; // ecx__int64 v10; // r9int v11; // er10__int64 v12; // r8__int128 input; // [rsp+20h] [rbp-38h]__int128 v14; // [rsp+30h] [rbp-28h]input = 0i64;v14 = 0i64;sub_7FF6DC281080((__int64)"%s", &input);      // 读取输入input_len = -1i64;do++input_len;while ( *((_BYTE *)&input + input_len) );if ( input_len != 31 )                        // 输入的长度为31{while ( 1 )Sleep(0x3E8u);}v1 = sub_7FF6DC281280(&input);                // 对input的处理,通过调试可知,从31行到41行,是对input的位置变换,变换后的结果放入v2,也就是name// 例如,输入abcdefghijklmnopqrstuvwxyz12345,name=“pqhrsidtujvwkebxylz1mf23n45ogca”v2 = name;                                    // v2==nameif ( v1 ){sub_7FF6DC2815C0((unsigned __int8 *)v1[1]);sub_7FF6DC2815C0(*(unsigned __int8 **)(v3 + 16));v4 = dword_7FF6DC2857E0;v2[v4] = *v5;dword_7FF6DC2857E0 = v4 + 1;}UnDecorateSymbolName(v2, outputString, 0x100u, 0);// v2,也就是name,经过UnDecorateSymbolName函数处理,结果放到outputstring中outputstring_len = -1i64;do++outputstring_len;while ( outputString[outputstring_len] );if ( outputstring_len == 62 )                 // outputstring的长度为62{v9 = 0;v10 = 0i64;do                                          // do循环体在验证outputstring的内容{v11 = outputString[v10];v12 = v11 % 23;if ( table[v12] != *(_BYTE *)(v10 + 0x7FF6DC283478i64) )// (_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&_exit(v9);if ( table[v11 / 23] != *(_BYTE *)(v10 + 0x7FF6DC283438i64) )// 55565653255552225565565555243466334653663544426565555525555222_exit(v9 * v9);++v9;++v10;}while ( v9 < 0x3E );sub_7FF6DC281020("flag{MD5(your input)}\n", v11 / 23, v12, v10);result = 0i64;}else{v7 = sub_7FF6DC2818A0(std::cout);std::basic_ostream<char,std::char_traits<char>>::operator<<(v7, sub_7FF6DC281A60);result = 0xFFFFFFFFi64;}return result;
}

先写验证outputstring的长度62及其内容的逆运算脚本,得到outputstring,为一个未修饰的C++符号名
childre-outputstring
UnDecorateSymbolName函数反修饰指定已修饰的 C++ 符号名,参考:UnDecorateSymbolName
第1个参数为已修饰的 C++ 符号名,此名称能以始终为问号 (?) 的首字符鉴别,本题中为v2(name),第2个参数指向字符串缓冲区的指针,该缓冲区接收未修饰的名字,本题中为outputstring
可知需要对outputstring符号名修饰才能得到v2(name),参考:c/c++函数名修饰规则
或者通过写C++代码,调用__FUNCDNAME__宏(FUNCDNAME:只有在函数内部才有效,返回该函数经编译器修饰后的名字。如果编译器选项中设定了/EP或/P,则__FUNCDNAME__是未定义。)直接得到函数经编译器修饰后的符号名,需要注意的是函数所在的类,域,返回类型,函数名,参数类型都必须和已知完全相同

#include<iostream>
using namespace std;
class R0Pxx {//函数所在的类
public:R0Pxx() {//该类的构造函数unsigned char a;My_Aut0_PWN(&a);}private://函数属于私有域//函数的返回类型 函数名 以及参数类型char * My_Aut0_PWN(unsigned char*) {char * ret = NULL;//调用宏 输出该函数经编译器修饰后的符号名printf("%s", __FUNCDNAME__);return ret;}
};
int main() {new R0Pxx();getchar();return 0;
}

运行结果即为v2(name),注意是在x86架构下运行的结果
childre-name
写逆位置变换脚本即可得到输入,对输入进行md5散列即可得到flag
childre-script

[MRCTF2020]PixelShooter

apk文件,jadx-gui打开,什么都没发现
用Apktool Box反编译apk后,在PixelShooter->lib->armeabi-v7a目录下发现3个.so文件,依次分析,同样什么都没发现
突然想到这是个安卓unity游戏,而安卓unity游戏的核心逻辑一般位于assets\bin\Data\Managed\Assembly-CSharp.dll
用dnSpy打开,在类UIController的GameOver方法中找到flag
pixelshooter-flag

[ACTF新生赛2020]SoulLike

elf文件,无壳,ida分析
main函数,读取输入,验证输入的前5个字符是否为“actf{”,将输入{}内的字符放入v8,可知输入{}内的长度为12,调用sub_83A函数验证v8,且输入的最后一个字符为“}”
soullike
分析sub_83A函数,可以看到是对input{}内12个字符的超多异或运算
solulike-sub_83A
在sub_83A函数的最后,是input{}内的12个字符经过超多异或运算后的值与已知的v4到v15比较,因为会有类似input[3]^=input[2]的情况,所以不能通过调试得到每个字符最后等效的异或值是什么
不过当比较为不相同时,程序会打印输入是哪个位置的字符错了,于是可以写脚本爆破出flag
sloulike-sub_83A
爆破脚本

#coding:utf-8
from itertools import *
import subprocessflag=""
t=""
for i in range(12):for j in range(32,126):flag ="actf{"+t+chr(j)+"}" p = subprocess.Popen(["./SoulLike"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)p.stdin.write(flag)p.stdin.close()out=p.stdout.read()p.stdout.close()if "#"+str(i) not in out:t+=chr(j)breakprint(flag)

运行结果
soullike-flag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excluding Files From Team Foundation Version Control Using .tfignore Files

At one point I was coding on a hobby project, using Visual Studio Online for project management and source control. Because of the technologies involved, a large number of temporary files were being generated that I didn’t want checked in. Visual Studio’…

REVERSE-PRACTICE-BUUCTF-18

REVERSE-PRACTICE-BUUCTF-18[SWPU2019]ReverseMe[FlareOn1]Bob Doge[FlareOn5]Ultimate Minesweeper[GKCTF2020]Chellys identity[SWPU2019]ReverseMe exe程序&#xff0c;运行后提示输入flag&#xff0c;输入错误打印“Try again”&#xff0c;无壳&#xff0c;ida分析 交叉引…

VS2008中Web Reference和Service Reference的区别

很早就发现在vs2008中应用web service有两种方式&#xff0c;即Add Web Reference和Add Service Reference&#xff0c;但是一直不是很清楚这两者有什么区别。趁着今天有空实验一下这两者的区别并记录下来供大家参考。 首先在网上查找&#xff0c;发现有如下两个主要区别&#…

REVERSE-PRACTICE-BUUCTF-19

REVERSE-PRACTICE-BUUCTF-19[RoarCTF2019]polyre[安洵杯 2019]game[SCTF2019]Strange apk[CFI-CTF 2018]IntroToPE[RoarCTF2019]polyre elf文件&#xff0c;无壳&#xff0c;用ida分析 main函数的结构&#xff0c;多重循环&#xff0c;是控制流平坦化&#xff0c;参考&#xf…

REVERSE-PRACTICE-BUUCTF-20

REVERSE-PRACTICE-BUUCTF-20[SCTF2019]creakme[网鼎杯 2020 青龙组]bang[WUSTCTF2020]funnyreDig the way[SCTF2019]creakme exe程序&#xff0c;运行后提示输入ticket&#xff0c;无壳&#xff0c;用ida分析 交叉引用字符串“please input your ticket:”来到sub_402540函数 …

Web Reference和Service Reference的区别

今天因为项目需要使用服务引用&#xff0c;就按之前的经验添加上了&#xff0c;步骤如下&#xff1a; 项目根目录——引用——右键——添加服务引用——高级——添加Web引用——输入接口的URL地址——回车&#xff08;下方出现的就是接口的定义的方法&#xff09;——修改Web引…

REVERSE-PRACTICE-BUUCTF-21

REVERSE-PRACTICE-BUUCTF-21[SCTF2019]babyre[MRCTF2020]EasyCpp[GUET-CTF2019]encrypt[QCTF2018]Xman-babymips[SCTF2019]babyre elf文件&#xff0c;无壳&#xff0c;用ida分析 在start函数中看到main函数的字样&#xff0c;但是左侧函数窗没有找到main函数 原因是main函数中…

原型设计工具——“墨刀”的介绍与基本教程

一、产品介绍 &#xff08;1&#xff09;产品简介&#xff1a; 墨刀是一款在线原型设计与协同工具&#xff0c;借助墨刀&#xff0c;产品经理、设计师、开发、销售、运营及创业者等用户群体&#xff0c;能够搭建为产品原型&#xff0c;演示项目效果。 &#xff08;2&#xf…

MockPlus原型设计介绍

在第八周的课堂上&#xff0c;王文娟老师在校园系统上发布了对于自行选择的原型设计软件进行资料查找以及自学的任务。因为之前的课程学习需要&#xff0c;我们已经大概掌握了原型设计软件Axure的使用&#xff0c;因此在这里&#xff0c;我选择了另一原型设计进行介绍&#xff…

REVERSE-PRACTICE-BUUCTF-22

REVERSE-PRACTICE-BUUCTF-22[SCTF2019]Who is he[FlareOn2]very_success[NPUCTF2020]Baby Obfuscation[HDCTF2019]MFC[SCTF2019]Who is he unity游戏&#xff0c;运行后输入&#xff0c;点击按钮检验输入 dnSpy打开Who is he\Who is he_Data\Managed\Assembly-CSharp.dll 在Te…

浅谈常见的NoSQL技术方案和选型

前言 在互联网和大数据的背景下&#xff0c;越来越多的网站、应用系统需要支撑 海量数据存储、高并发请求、高可用、高可扩展性 等特性要求。传统的 关系型数据库 已经难以应对类似的需求&#xff0c;各种各样的 NoSQL&#xff08;Not Only SQL&#xff09;数据库因此而产生。…

REVERSE-PRACTICE-BUUCTF-23

REVERSE-PRACTICE-BUUCTF-23[2019红帽杯]Snake[BSidesSF2019]blink[De1CTF2019]Re_Sign[ACTF新生赛2020]Splendid_MineCraft[2019红帽杯]Snake unity游戏&#xff0c;dnSpy打开Snake\Snake_Data\Managed\Assembly-CSharp.dll 发现要载入Interface这个dll ida打开Snake\Snake_…

REVERSE-PRACTICE-BUUCTF-24

REVERSE-PRACTICE-BUUCTF-24[watevrCTF 2019]Timeout[SUCTF2019]hardcpp[CISCN2018]2ex[UTCTF2020]babymips[watevrCTF 2019]Timeout elf文件&#xff0c;无壳&#xff0c;ida分析 main函数中signal&#xff0c;alarm&#xff0c;delay三个函数配合使用是为了反调试 交叉引用…

REVERSE-PRACTICE-BUUCTF-25

REVERSE-PRACTICE-BUUCTF-25特殊的 BASE64[FlareOn1]Javascrap[WMCTF2020]easy_re[NPUCTF2020]BasicASM特殊的 BASE64 exe程序&#xff0c;运行后输入&#xff0c;无壳&#xff0c;ida分析 main函数&#xff0c;读取输入&#xff0c;进行变表base64编码&#xff0c;与rightFla…

REVERSE-PRACTICE-BUUCTF-26

REVERSE-PRACTICE-BUUCTF-26[FlareOn6]FlareBear[SUCTF2018]babyre[GKCTF2020]WannaReverse[FlareOn4]greek_to_me[FlareOn6]FlareBear apk文件&#xff0c;模拟器上运行&#xff0c;创建一个小熊&#xff0c;有三种方式交互&#xff0c;分别为“吃饭”&#xff0c;“篮球”以…

C#的变迁史02 - C# 2.0篇

在此重申一下&#xff0c;本文仅代表个人观点&#xff0c;如有不妥之处&#xff0c;还请自己辨别。 第一代的值类型装箱与拆箱的效率极其低下&#xff0c;特别是在集合中的表现&#xff0c;所以第二代C#重点解决了装箱的问题&#xff0c;加入了泛型。1. 泛型 - 珍惜生命&#x…

REVERSE-PRACTICE-BUUCTF-27

REVERSE-PRACTICE-BUUCTF-27[XMAN2018排位赛]Dragon Quest[羊城杯 2020]easyre[watevrCTF 2019]Repyc[2019红帽杯]calc[XMAN2018排位赛]Dragon Quest elf文件&#xff0c;无壳&#xff0c;ida分析 main函数&#xff0c;读取输入&#xff0c;start_quest函数验证输入&#xff0…

C#的变迁史03 - C# 3.0篇

C# 3.0 (.NET 3.5, VS2008) 第三代C#在语法元素基本完备的基础上提供了全新的开发工具和集合数据查询方式&#xff0c;极大的方便了开发。 1. WPF&#xff0c;WCF&#xff0c;WF 这3个工程类型奠定了新一代.NET开发的客户端模型&#xff0c;通信模型&#xff0c;工作流模型。 …

REVERSE-PRACTICE-BUUCTF-28

REVERSE-PRACTICE-BUUCTF-28[FlareOn6]Memecat Battlestation[b01lers2020]chugga_chugga[INSHack2018]Tricky-Part1[watevrCTF 2019]esreveR[FlareOn6]Memecat Battlestation .Net程序&#xff0c;运行后输入weapon code&#xff0c;用dnSpy打开 在Stage1Form直接找到第一个w…

C#的变迁史04 - C# 4.0 之多线程篇

在.NET 4.0中&#xff0c;并行计算与多线程得到了一定程度的加强&#xff0c;这主要体现在并行对象Parallel&#xff0c;多线程Task&#xff0c;与PLinq。这里对这些相关的特性一起总结一下。 使用Thread方式的线程无疑是比较麻烦的&#xff0c;于是在这个版本中有了改善的版本…