BUUCTF--[V&N2020 公开赛]strangeCpp

测试文件:https://www.lanzous.com/iauqjsd

代码分析

先找到程序运行显示处的代码

 1 // 个数,数组,环境变量
 2 __int64 __fastcall sub_140013AA0(__int64 a1, __int64 a2, __int64 *a3)
 3 {
 4   char *v3; // rdi
 5   signed __int64 i; // rcx
 6   __int64 v5; // rax
 7   __int64 v6; // rax
 8   __int64 v7; // rax
 9   __int64 v8; // rax
10   char v10; // [rsp+0h] [rbp-20h]
11   struct _SYSTEM_INFO SystemInfo; // [rsp+28h] [rbp+8h]
12   __int64 *j; // [rsp+78h] [rbp+58h]
13   __int64 v13; // [rsp+98h] [rbp+78h]
14   __int64 *v14; // [rsp+1A0h] [rbp+180h]
15
16   v14 = a3;
17   v3 = &v10;
18   for ( i = 94i64; i; --i )
19   {
20     *(_DWORD *)v3 = 3435973836;
21     v3 += 4;
22   }
23   sub_1400110AA((__int64)&unk_140027033);
24   GetSystemInfo(&SystemInfo);
25   putchar(byte_140021004);                      // w
26   putchar(byte_140021005);                      // e
27   putchar(byte_140021006);                      // l
28   putchar(byte_140021007);                      // c
29   putchar(byte_140021019);                      // o
30   putchar(byte_14002101A);                      // m
31   putchar(byte_140021005);                      // e
32   putchar(10);
33   puts("Let me have a look at your computer...");
34   for ( j = v14; *j; ++j )                      // 循环输出环境变量
35   {
36     v13 = *j;
37     sub_140011226("%s\n", v13);
38   }
39   std::basic_ostream<char,std::char_traits<char>>::operator<<(std::cout, sub_140011127);
40   dword_140021190 = SystemInfo.dwNumberOfProcessors;// CPU数量
41   sub_140011226("now system cpu num is %d\n", SystemInfo.dwNumberOfProcessors);
42   if ( dword_140021190 < 8 )
43   {
44     puts("Are you in VM?");
45     _exit(0);
46   }
47   if ( GetUserNameA(Str1, &pcbBuffer) )         // 获取用户名
48   {
49     v5 = sub_140011172(std::cout, (__int64)"this is useful");
50     std::basic_ostream<char,std::char_traits<char>>::operator<<(v5, sub_140011127);
51   }
52   v6 = std::basic_ostream<char,std::char_traits<char>>::operator<<(std::cout, sub_140011127);
53   v7 = sub_140011172(v6, (__int64)"ok,I am checking...");
54   std::basic_ostream<char,std::char_traits<char>>::operator<<(v7, sub_140011127);
55   if ( !j_strcmp(Str1, "cxx") )
56   {
57     v8 = sub_140011172(std::cout, (__int64)"flag{where_is_my_true_flag?}");
58     std::basic_ostream<char,std::char_traits<char>>::operator<<(v8, sub_140011127);
59     _exit(0);
60   }
61   system("pause");
62   sub_1400113E3((__int64)&v10, (__int64)&unk_14001DE50);
63   return 0i64;
64 }

在我查看第21~25行代码,输出字符串处时

中间插了一个byte_140021008变量,找到引用处

 1 __int64 sub_140013580()
 2 {
 3   __int64 *v0; // rdi
 4   signed __int64 i; // rcx
 5   __int64 result; // rax
 6   __int64 v3; // [rsp+0h] [rbp-20h]
 7   int v4; // [rsp+24h] [rbp+4h]
 8   int j; // [rsp+44h] [rbp+24h]
 9   __int64 v6; // [rsp+128h] [rbp+108h]
10
11   v0 = &v3;
12   for ( i = 82i64; i; --i )
13   {
14     *(_DWORD *)v0 = -858993460;
15     v0 = (__int64 *)((char *)v0 + 4);
16   }
17   v6 = -2i64;
18   sub_1400110AA((__int64)&unk_140027033);
19   result = sub_140011384((unsigned int)dword_140021190);
20   v4 = result;
21   if ( (_DWORD)result == 607052314 && dword_140021190 <= 14549743 )
22   {
23     for ( j = 0; j < 17; ++j )
24     {
25       putchar((unsigned __int8)(dword_140021190 ^ byte_140021008[j]));
26       result = (unsigned int)(j + 1);
27     }
28   }
29   return result;
30 }

我们首先需要看到第19行代码,进入sub_140011384函数(dword_140021190实际就是我们第一处代码的CPU数量,变量的值可以通过下面if条件,暴力解出值)。

 1 signed __int64 __fastcall sub_140013890(int a1)
 2 {
 3   __int64 *v1; // rdi
 4   signed __int64 i; // rcx
 5   signed __int64 result; // rax
 6   __int64 v4; // [rsp+0h] [rbp-20h]
 7   int v5; // [rsp+24h] [rbp+4h]
 8   int v6; // [rsp+44h] [rbp+24h]
 9   unsigned int v7; // [rsp+64h] [rbp+44h]
10   int v8; // [rsp+160h] [rbp+140h]
11
12   v8 = a1;
13   v1 = &v4;
14   for ( i = 82i64; i; --i )
15   {
16     *(_DWORD *)v1 = -858993460;
17     v1 = (__int64 *)((char *)v1 + 4);
18   }
19   sub_1400110AA((__int64)&unk_140027033);
20   v5 = v8 >> 12;
21   v6 = v8 << 8;
22   v7 = (v8 << 8) ^ (v8 >> 12);
23   v7 *= 291;
24   if ( v7 )
25     result = v7;
26   else
27     result = 987i64;
28   return result;
29 }

通过这段代码的第22,23行和上段代码的第25行,我们可以解出flag

脚本

# -*- coding:utf-8 -*-
import hashlib

result = 0
for v8 in range(14549743):
    v7 = (((v8 << 8) ^ (v8 >> 12))*291)&0xFFFFFFFF # 原文是unsigned int--0~0xFFFFFFFF,输出的值需要截断
    if (v7 == 607052314):
        result = v8
        break

enc = [0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 4, 0x75, 0x68, 0x34, 0x28,
       0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D]

flag = ""
for i in enc:
    flag += chr((result ^ i)&0xFF) # unsigned __int8--0~0xFF
print (flag)
md = hashlib.md5()
md.update(str(result).encode(‘utf-8‘))
print ("flag{"+md.hexdigest()+"}")

get flag!

flag{e10adc3949ba59abbe56e057f20f883e}

原文地址:https://www.cnblogs.com/Mayfly-nymph/p/12609782.html

时间: 2024-10-31 12:32:39

BUUCTF--[V&N2020 公开赛]strangeCpp的相关文章

[V&amp;N2020 公开赛]CHECKIN

[V&N2020 公开赛]CHECKIN --s1mple 那天,我见过的最强剑客,提起了天下最强的宝剑······却早已没了剑心. 知识点 反弹shell::文件描述符:: 这里先引入一个知识点:文件描述符,在linux里,当一个进程打开某个文件直到关闭前,该进程会获得文件描述符,而文件描述符里有文件的内容,即便已经将文件删除,只是删除了其相应的目录索引节点,若进程依然存在没被关闭的话,就依然可以通过文件提供给它的文件描述符进行操作./proc/[pid]/fd 这个目录里包含了进程打开文件的

刷题记录:[V&amp;N2020 公开赛]EasySpringMVC

题目复现链接:https://buuoj.cn/challenges 参考链接:2020 年 V&N 内部考核赛 WriteUp 从一道题入门JAVA反序列化漏洞 V&N公开赛2020 writeup Java反序列化 深入了解序列化writeObject.readObject.readResolve 总结一下,如果目标类中没有定义私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用默认的方法来根据目标类中的属性来进行序列化和反序列化,而如果目标类中定义

[V&amp;N2020 公开赛] Web misc部分题解

0x00 前言 写了一天题目,学到了好多东西, 简单记录一下 0x01 Web HappyCTFd 直接使用网上公开的cve打: 解题思路:先注册一个admin空格账号,注意这里的靶机无法访问外网,邮箱填上buu内网的邮箱以admin账户登陆.然后修改密码,给我们注册的邮箱发送邮件,去内网邮箱处登陆,点击链接修改密码.这样平台真正的admin账户就被修改了. 我们以用户名admin,密码为我们刚刚修改的登陆.找到flag. CHECKIN perl 脚本反弹shell: 链接: https://

3. System V IPC

System V IPC包含三种类型的IPC:System V消息队列.System V信号量.System V共享内存区 1. key_t键和ftok函数 三种类型的System V IPC使用key_t值作为名字.头文件<sys/types.h>定义key_t为一个至少32位的整数.函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键 #include <sys/ipc.h> key_t ftok(const char *pathname, in

Price Control V or S in Material Type (Price control in material master )

When is it useful to use the price control V or S in Material Master?  Do I have to follow the SAP standard setting in the material type for the following material types: - ROH (Raw materials) -> moving average price - HALB (Semifinished products) ->

11g v$wait_chains 与 hanganalyze

11g之后,通过v$wait_chains视图诊断数据库hang和Contention 11g之前,通常我们数据库hang住了之后,我们会对数据库做hang analyze来进行分析,在11g之后,我们可以通过一个新的视图v$wait_chains来诊断数据库hang和contention.在11gR1这个版本里面,Oracle通过diag进程实现了一个功能,每隔3秒做一次本地的hang analyze,每隔10秒做一次global的hang analyze.而这些信息会存放在内存里面,Orac

Hyper - V (四)

安装虚拟机 新建虚拟机 为新建的虚拟机起名,默认保存路径为前面设置的默认路径 指定虚拟机内存大小 指定虚拟机网卡连接到外部网络还是内部网络(或专用网络) 创建虚拟硬盘,指定硬盘存储路径及硬盘大小 选择安装文件的引导路径,支持光盘安装,ISO安装等方式. 这里我们选择通过光驱引导的方式来安装系统 完成虚拟机设置. 右键点击新建的虚拟机,设置可以更改虚拟机的配置选项. 将ISO文件加载到虚拟机中,即可以实现光盘引导功能. 启动虚拟机-- 安装系统 Hyper - V (四),布布扣,bubuko.c

大v用户数据统计分析

1,统计数据的基本情况,包括微博总数,用户总数,最活跃和最不活跃的用户id #!/bin/sh source_dir=/home/minelab/data/DATA source_file_name=userinfo_00_au_1_out source_file=$source_dir/$source_file_name #source_file=test.src out_dir=/home/minelab/liweibo/daV out_file_name=basic_satic.txt o

雪球平台——5家医疗器械公司v.1.0

雪球平台--5家医疗器械公司v.1.0   负责人:李悦 合伙人:乔天娇.王丹 签约员工:乌力吉.许俊平     摘要: 本小组针对雪球平台5家关于医疗器械的公司分析报告,并对产业进行分析研究,我们要判断医疗器械行业的前景和公司实力是否匹配,来决定我们投资就业的研究价值.   进度看板 ü 李悦    ---   收集整理5家以上关于医疗器械的上市公司 ü 乔天娇 ---   整理资料,列出医疗器械公司的清单 ü 王丹   ---   5家公司的行业前景 ü 乌力吉  ---   5家公司的实力