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游戏,运行后输入,点击按钮检验输入
dnSpy打开Who is he\Who is he_Data\Managed\Assembly-CSharp.dll
在TestClick类中找到OnClick方法,将输入与Decrypt方法返回的字符串比较
whoishe-logic
Decrypt方法,标准的DES.CBC解密,iv=key
whoishe-decrypt
已知密钥"1234",密文"1Tsy0ZGotyMinSpxqYzVBWnfMdUcqCMLu0MA+22Jnp+MNwLHvYuFToxRQr0c+ONZc6Q7L0EAmzbycqobZHh4H23U4WDTNmmXwusW4E+SZjygsntGkO2sGA==",解DES.CBC,注意,在C#中,字符串转成字节数组,在每个字符字节后都要加一个"\x00",然而提交明文失败

from Crypto.Cipher import DES
import base64
key=''.join(['1','\x00','2','\x00','3','\x00','4','\x00'])
cipher=base64.b64decode("1Tsy0ZGotyMinSpxqYzVBWnfMdUcqCMLu0MA+22Jnp+MNwLHvYuFToxRQr0c+ONZc6Q7L0EAmzbycqobZHh4H23U4WDTNmmXwusW4E+SZjygsntGkO2sGA==")
iv=key
des=DES.new(key,DES.MODE_CBC,iv)
plaintext=des.decrypt(cipher)
print(plaintext.decode('utf-16'))
#He_P1ay_Basketball_Very_We11!Hahahahaha!

看了别的师傅的wp,使用ce,搜索字符串"Emmmmm",在内存中发现完全不同的密文和密钥
whoishe-ce
解DES.CBC得到flag,提交成功

from Crypto.Cipher import DES
import base64
key=''.join(['t','\x00','e','\x00','s','\x00','t','\x00'])
data="78 00 5A 00 57 00 44 00 5A 00 61 00 4B 00 45 00 68 00 57 00 4E 00 4D 00 43 00 62 00 69 00 47 00 59 00 50 00 42 00 49 00 6C 00 59 00 33 00 2B 00 61 00 72 00 6F 00 7A 00 4F 00 39 00 7A 00 6F 00 6E 00 77 00 72 00 59 00 4C 00 69 00 56 00 4C 00 34 00 6E 00 6A 00 53 00 65 00 7A 00 32 00 52 00 59 00 4D 00 32 00 57 00 77 00 73 00 47 00 6E 00 73 00 6E 00 6A 00 43 00 44 00 6E 00 48 00 73 00 37 00 4E 00 34 00 33 00 61 00 46 00 76 00 4E 00 45 00 35 00 34 00 6E 00 6F 00 53 00 61 00 64 00 50 00 39 00 46 00 38 00 65 00 45 00 70 00 76 00 54 00 73 00 35 00 51 00 50 00 47 00 2B 00 4B 00 4C 00 30 00 54 00 44 00 45 00 2F 00 34 00 30 00 6E 00 62 00 55 00 3D"
cipher=[]
for i in range(0,len(data),6):cipher.append(int('0x'+data[i:i+2],16))
iv=key
des=DES.new(key,DES.MODE_CBC,iv)
plaintext=des.decrypt(base64.b64decode(''.join(chr(i) for i in cipher)))
print(plaintext.decode('utf-16'))
#She_P1ay_Black_Hole_Very_Wel1!LOL!XD!

[FlareOn2]very_success

exe程序,运行后输入password,无壳,ida分析
sub_401000函数修改栈指针平衡栈后,F5反编译
读取输入,进入sub_401084函数进行验证,返回非0验证成功
verysuccess-logic
进入sub_401084函数,检验输入的长度是否大于等于37,输入input参与的只是8位的异或运算,v14为0xc7,v10在运算过程中始终为1,v4初始为0,每次都要加一个字节参与运算后的结果
verysuccess-sub_401084
v7可通过动调得到,只有32个字节可见,不过影响不大,写逆脚本即可得到flag,缺的5个字符按照Description文本文件提示补齐

v7=[0xAA, 0xEC, 0xA4, 0xBA, 0xAF, 0xAE, 0xAA, 0x8A, 0xC0, 0xA7,0xB0, 0xBC, 0x9A, 0xBA, 0xA5, 0xA5, 0xBA, 0xAF, 0xB8, 0x9D,0xB8, 0xF9, 0xAE, 0x9D, 0xAB, 0xB4, 0xBC, 0xB6, 0xB3, 0x90,0x9A, 0xA8]
v7=v7[::-1]
flag=""
v4=0
for i in range(len(v7)):tmp=(1<<(v4&0x3))flag+=chr((v7[i]-tmp-1)^0xc7)v4+=v7[i]
print(flag)
#a_Little_b1t_harder_plez@flare-o(n.com})

[NPUCTF2020]Baby Obfuscation

exe程序,运行后输入,无壳,ida分析
main函数,输入后紧接的for循环,有4个if语句,其中第1和第3个if语句永真,第2和第4个if语句永假,于是,与输入相关的运算有两处,"v33[j]=input[j-1]-v39[(j-1)%len(v39)]"给v33赋值,"v33[j]^=v39[(j-1)%len(v39)]"是v33的变换,v33的元素乘10后再与已知比较

int __cdecl main(int argc, const char **argv, const char **envp)
{int v3; // eaxint v4; // ebxint v5; // esiint v6; // ebxint v7; // ebxint v8; // esiint v9; // ediint v10; // ebxint v11; // ebxint v12; // ebxint v13; // esiint v14; // eaxint v15; // ebxint v16; // esiint v17; // ebxint v18; // eaxbool v19; // blint v20; // eaxint v21; // esiint v22; // ebxint v23; // ebxint v24; // eaxint v25; // eaxint v26; // eaxint v27; // eaxint v28; // ebxint a[64]; // [rsp+20h] [rbp-60h]int v31; // [rsp+120h] [rbp+A0h]char input[1008]; // [rsp+130h] [rbp+B0h]int v33[1000]; // [rsp+520h] [rbp+4A0h]int v34; // [rsp+14C0h] [rbp+1440h]int v35; // [rsp+14D0h] [rbp+1450h]int v36; // [rsp+14D4h] [rbp+1454h]int v37; // [rsp+14D8h] [rbp+1458h]int v38; // [rsp+14DCh] [rbp+145Ch]int v39; // [rsp+14E0h] [rbp+1460h]int v40; // [rsp+14E4h] [rbp+1464h]int v41; // [rsp+14E8h] [rbp+1468h]int v42; // [rsp+14ECh] [rbp+146Ch]int input_len; // [rsp+14F0h] [rbp+1470h]int k; // [rsp+14F4h] [rbp+1474h]int j; // [rsp+14F8h] [rbp+1478h]int i; // [rsp+14FCh] [rbp+147Ch]_main();memset(v33, 0, sizeof(v33));v34 = 0;memset(a, 0, sizeof(a));v31 = 0;for ( i = 0; i <= 64; ++i )                   // a的元素都是固定的值,a[0]==1,a[1]==2a[i] = i + 1;v39 = 2;v40 = 3;v41 = 4;v42 = 5;v35 = 2;v36 = 3;v37 = 4;v38 = 5;puts("WHERE IS MY KEY!?");scanf("%32s", input);input_len = strlen(input);v3 = gcd(a[j], a[j]);                         // v3==a[0]==1for ( j = v3 / a[j]; j <= input_len; ++j )    // j从1开始,到input_len,双闭合{v4 = (a[j] + a[j + 1]) * (a[j] + a[j + 1]); // v4==(a[j]+a[j+1])**2if ( v4 >= axxb(2, 2) * a[j] * a[j + 1] )   // axxb函数指a**b,a的b次方,(a+b)**2>=4ab,永真{v5 = ~input[a_sub_b(j, 1)];v6 = a_sub_b(j, 1);v33[j] = ~(v5 + *(&v39 + v6 % axxb(2, 2)));// v33[j]=input[j-1]-v39[(j-1)%len(v39)]}v7 = gcd(a[j], a[j + 1]);                   // 永为1if ( v7 > gcd(a[j + 1], ~(~a[j + 1] + a[j])) )// gcd(a[j+1],a[j+1]-a[j])==1,永假{v8 = v33[j];v9 = ~v33[j];v10 = a_sub_b(j, 1);v33[j] = ~(v9 + a[v10 % axxb(2, 2)]) * v8;}v11 = a[j + 1];v12 = axxb(2, 1) * v11;                     // 2*a[j+1]v13 = a[j];v14 = axxb(2, 1);v15 = gcd(v13 * v14, v12);                  // gcd(2*a[j],2*a[j+1])v16 = axxb(2, 1);if ( v15 == v16 * gcd(a[j], a[j + 1]) )     // 永真{v17 = a_sub_b(j, 1);                      // j-1v33[j] ^= *(&v39 + v17 % axxb(2, 2));     // v33[j]^=v39[(j-1)%len(v39)]}v18 = axxb(V0X3, a[j]);v19 = v18 < a[j] + 1;                       // 3**a[j]<a[j]+1v20 = axxb(2, 4);                           // 16if ( aeqbeq1(v20 >= j, v19) )               // 永假{v21 = ~input[a_sub_b(j, 1)];v22 = a_sub_b(j, 1);v33[j] ^= ~(v21 + *(&v39 + v22 % axxb(2, 2)));}v23 = axxb(2, 3);                           // 8v24 = gcd(a[j], a[j]);                      // a[j]v33[j] *= v23 + axxb(2, v24 / a[j]);        // v33[j]*=10}v25 = axxb(2, 4);                             // 16v26 = a_sub_b(v25, 1);                        // 15if ( v26 == input_len )                       // input_len==15{v27 = gcd(a[k], a[k]);                      // 1for ( k = v27 / a[k]; k <= input_len; ++k ) // k从1开始,到input_len,双闭合{v28 = v33[k];                             // 从v33取值if ( v28 == a_sub_b(A0X6[k], 1) / 10 )    // 比较++V0X2;}if ( V0X2 == input_len )puts("\nPASS");elseputs("\nDENIED");}else{puts("\nDENIED");}return 0;
}

写逆运算脚本即可得到flag

A0X6=[0,7801,7801,8501, 5901, 8001, 6401, 11501,4601, 9801,  9601,11701, 5301,  9701,  10801,  12501]
v39=[2,3,4,5]
for i in range(1,len(A0X6)):A0X6[i]=(A0X6[i]-1)//10//10A0X6[i]^=v39[(i-1)%len(v39)]A0X6[i]+=v39[(i-1)%len(v39)]
print(''.join(chr(i) for i in A0X6))
# NPUCTF{0bfu5er}

[HDCTF2019]MFC

MFC程序,加了vmp壳,用xspy扫一下
发现一个没有系统库名的OnMsg:0464
MFC-xspy
写C代码发送一条有关0x0464的信息

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int main()
{HWND handler = ::FindWindowA(NULL, "Flag就在控件里");if (handler){SendMessage(handler, 0x0464, NULL, NULL);}else {printf("no window");}system("pause");return 0;
}

看到一个DES的密钥
MFC-deskey
在这个地方看到密文
MFC-cipher
用一个飘云阁的加解密工具解des即可得到flag
MFC-flag

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

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

相关文章

浅谈常见的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;于是在这个版本中有了改善的版本…

REVERSE-PRACTICE-BUUCTF-29

REVERSE-PRACTICE-BUUCTF-29[FlareOn1]Shellolololol[CFI-CTF 2018]powerPacked[INSHack2018]Tricky-Part2[CFI-CTF 2018]Automated Reversing[FlareOn1]Shellolololol exe程序&#xff0c;直接不能运行&#xff0c;无壳&#xff0c;ida分析 简单F8单步调试发现&#xff0c;在…

C#的变迁史05 - C# 4.0篇

C# 4.0 (.NET 4.0, VS2010) 第四代C#借鉴了动态语言的特性&#xff0c;搞出了动态语言运行时&#xff0c;真的是全面向“高大上”靠齐啊。 1. DLR动态语言运行时 C#作为静态语言&#xff0c;它需要编译以后运行&#xff0c;在编译的过程中&#xff0c;编译器要检查语法的正确性…

REVERSE-PRACTICE-BUUCTF-30

REVERSE-PRACTICE-BUUCTF-30[RCTF2019]DontEatMe[b01lers2020]little_engine[NPUCTF2020]你好sao啊[MRCTF2020]Shit[RCTF2019]DontEatMe exe程序&#xff0c;运行后输入&#xff0c;无壳&#xff0c;用ida分析 交叉引用字符串来到sub_401260函数&#xff0c;读取输入&#xff…

C#的变迁史06 - C# 4.0 之并行处理篇

前面看完了Task对象&#xff0c;这里再看一下另一个息息相关的对象Parallel。 Parallel对象 Parallel对象封装了能够利用多核并行执行的多线程操作&#xff0c;其内部使用Task来分装多线程的任务并试图将它们分配到不同的内核中并行执行。请注意“试图”这个词&#xff0c;Par…

REVERSE-PRACTICE-BUUCTF-31

REVERSE-PRACTICE-BUUCTF-31[羊城杯 2020]login[羊城杯 2020]Bytecode[羊城杯 2020]babyre[ACTF新生赛2020]fungame[羊城杯 2020]login exe程序&#xff0c;运行后输入&#xff0c;无壳&#xff0c;ida分析 没找到主要逻辑&#xff0c;在字符串窗口看到一些“py”的字样&#…

C#的变迁史07 - C# 4.0 之线程安全集合篇

作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题&#xff0c;解决临界资源的访问通常是加锁或者是使用信号量&#xff0c;这个大家应该很熟悉了。 而集合作为一种重要的临界资源&#xff0c;通用性更广&#xff0c;为了让大家更安全的使用它们&#xff0c;微软为我…

PWN-PRACTICE-BUUCTF-1

PWN-PRACTICE-BUUCTF-1test_your_ncripwarmup_csaw_2016ciscn_2019_n_1test_your_nc 附件的main函数直接system("/bin/sh")&#xff0c;nc直接连即可cat flag rip main函数中&#xff0c;gets函数读取一行会造成栈溢出 构造payload覆盖rip&#xff0c;使得return…

C#的变迁史08 - C# 5.0 之并行编程总结篇

C# 5.0 搭载于.NET 4.5和VS2012之上。 同步操作既简单又方便&#xff0c;我们平时都用它。但是对于某些情况&#xff0c;使用同步代码会严重影响程序的可响应性&#xff0c;通常来说就是影响程序性能。这些情况下&#xff0c;我们通常是采用异步编程来完成功能&#xff0c;这在…

REVERSE-PRACTICE-CTFSHOW-1

REVERSE-PRACTICE-CTFSHOW-1逆向签到题re2逆向4逆向5逆向签到题 ida打开即可得到明文flag re2 附件是一个加密过的flag文本和勒索病毒exe 运行程序&#xff0c;输入1&#xff0c;回车&#xff0c;直接退出&#xff0c;ida分析 选项1的逻辑为&#xff0c;打开flag.txt和enfl…

C#的变迁史09 - C# 5.0 之调用信息增强篇

Caller Information CallerInformation是一个简单的新特性&#xff0c;包括三个新引入的Attribute&#xff0c;使用它们可以用来获取方法调用者的信息&#xff0c; 这三个Attribute在System.Runtime.CompilerServices命名空间下&#xff0c;分别叫做CallerMemberNameAttribute&…