[BUUCTF]REVERSE——[V&N2020 公开赛]strangeCpp
[V&N2020 公开赛]strangeCpp
步骤
- 查壳,无壳,64位程序

- 64位ida载入,没有main函数,根据程序里的字符串,去查看函数
__int64 __fastcall sub_140013AA0(__int64 a1, __int64 a2, __int64 *a3)
{
char *v3; // rdi
signed __int64 i; // rcx
__int64 v5; // rax
__int64 v6; // rax
__int64 v7; // rax
__int64 v8; // rax
char v10; // [rsp+0h] [rbp-20h]
struct _SYSTEM_INFO SystemInfo; // [rsp+28h] [rbp+8h]
__int64 *j; // [rsp+78h] [rbp+58h]
__int64 v13; // [rsp+98h] [rbp+78h]
__int64 *v14; // [rsp+1A0h] [rbp+180h]
v14 = a3;
v3 = &v10;
for ( i = 94i64; i; --i )
{
*(_DWORD *)v3 = 3435973836;
v3 += 4;
}
sub_1400110AA((__int64)&unk_140027033);
GetSystemInfo(&SystemInfo);
putchar(byte_140021004); // w
putchar(byte_140021005); // e
putchar(byte_140021006); // l
putchar(byte_140021007); // c
putchar(byte_140021019); // o
putchar(byte_14002101A); // m
putchar(byte_140021005); // e
putchar(10);
puts("Let me have a look at your computer...");
for ( j = v14; *j; ++j )
{
v13 = *j;
sub_140011226((__int64)"%s\n", v13); // 循环输出变量
}
std::basic_ostream<char,std::char_traits<char>>::operator<<(std::cout, sub_140011127);
dword_140021190 = SystemInfo.dwNumberOfProcessors; // CPU数量
sub_140011226((__int64)"now system cpu num is %d\n", SystemInfo.dwNumberOfProcessors);
if ( dword_140021190 < 8 )
{
puts("Are you in VM?");
_exit(0);
}
if ( GetUserNameA(Str1, &pcbBuffer) ) // 获取用户名
{
v5 = sub_140011172(std::cout, "this is useful");
std::basic_ostream<char,std::char_traits<char>>::operator<<(v5, sub_140011127);
}
v6 = std::basic_ostream<char,std::char_traits<char>>::operator<<(std::cout, sub_140011127);
v7 = sub_140011172(v6, "ok,I am checking...");
std::basic_ostream<char,std::char_traits<char>>::operator<<(v7, sub_140011127);
if ( !j_strcmp(Str1, "cxx") )
{
v8 = sub_140011172(std::cout, "flag{where_is_my_true_flag?}");
std::basic_ostream<char,std::char_traits<char>>::operator<<(v8, sub_140011127);
_exit(0);
}
system("pause");
sub_1400113E3(&v10, &unk_14001DE50);
return 0i64;
}
以为flag{where_is_my_true_flag?}是答案,还是太天真了
- 找了半天没找到关键点,想要动调但是报错,不清楚这是为什么。都没搞清楚这个程序要干嘛

- 在查看了其他师傅的wp之后,发现了这题的关键点
我们之前那个welcome的字符那边定义了一个数组

- 找到交叉引用它的地方

当满足21行的if条件的情况时,25行会根据异或算法,输出一个字符串,猜测是flag - result的值由sub_140011384函数得到,看一下sub_140011384函数

根据20~23行的算法,加上上一张图里的dword_140021190 <= 14549743,可以穷举暴力破解出result里的值
result=0
for v8 in range(14549743):
v7 = (((v8 << 8) ^ (v8 >> 12))*291)&0xFFFFFFFF
if (v7 == 607052314):
result = v8
break
print(result)

v7的类型是unsigned int–0~0xFFFFFFFF,输出的值需要截断,python默认没把数据截断
算出了result的值,看一下这个putchar语句输出的值

result=0
for v8 in range(14549743):
v7 = (((v8 << 8) ^ (v8 >> 12))*291)&0xFFFFFFFF # 原文是unsigned int--0~0xFFFFFFFF,输出的值需要截断
if (v7 == 607052314):
result = v8
break
print(result)
a=[0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 0x04, 0x75, 0x68, 0x34,
0x28, 0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D, 0x6F, 0x6D, 0x00]
for j in range(17):
print(chr((v8^a[j])&0xff),end="")

终于看到了曙光,讲123456拿去md5加密一下

flag{e10adc3949ba59abbe56e057f20f883e}
[BUUCTF]REVERSE——[V&N2020 公开赛]strangeCpp的更多相关文章
- [BUUCTF]REVERSE——[V&N2020 公开赛]CSRe
[V&N2020 公开赛]CSRe 附件 步骤: 例行检查,无壳儿,但是有NET混淆,使用de4dot工具进行处理 之后用dnSpy打开,从入口点开始看程序 找到有关flag的信息 flag由 ...
- [BUUCTF]PWN——[V&N2020 公开赛]easyTHeap
[V&N2020 公开赛]easyTHeap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,常见的堆的菜单 64位ida载入,main函数 最多只能申请7个ch ...
- [BUUCTF]PWN——[V&N2020 公开赛]simpleHeap
[V&N2020 公开赛]simpleHeap 附件 步骤: 例行检查,64位,保护全开 根据题目可知是一道堆,直接用64位ida打开 我修改了这些函数的名称,这样方便看程序 add,我们可以 ...
- [BUUCTF]PWN——[V&N2020 公开赛]babybabypwn
[V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函 ...
- [BUUCTF]PWN——[V&N2020 公开赛]warmup
[V&N2020 公开赛]warmup 附件 步骤: 例行检查,64位程序,除了canary,其他保护都开 本地运行一下,看看大概的情况 64位ida载入,从main函数开始看程序 看到程序将 ...
- buu [V&N2020 公开赛]strangeCpp
拖入ida,静态调试一下,本来想动调的,发现一直缺dll.没办法,只能头铁,静态 找到主函数,然后并没有发现什么,找了半天,没结果,后面也是看了大佬wp,才找到解决方式,感觉这种只能通过动调来找到关键 ...
- 【pwn】V&N2020 公开赛 simpleHeap
[pwn]V&N2020 公开赛 simpleHeap 1.静态分析 首先libc版本是ubuntu16的2.23版本,可以去buu的资源处下载 然后checksec一下,保护全开 拖入IDA ...
- 刷题记录:[V&N2020 公开赛]TimeTravel
题目复现链接:https://buuoj.cn/challenges 参考链接:2020 年 V&N 内部考核赛 WriteUp V&N公开赛2020 writeup httpoxy ...
- [V&N2020 公开赛] Web misc部分题解
0x00 前言 写了一天题目,学到了好多东西, 简单记录一下 0x01 Web HappyCTFd 直接使用网上公开的cve打: 解题思路:先注册一个admin空格账号,注意这里的靶机无法访问外网,邮 ...
随机推荐
- [hdu7082]Pty loves lcm
先将问题差分,即仅考虑上限$R$(和$L-1$) 注意到$f(x,y)$增长是较快的,对其分类讨论: 1.若$y\ge x+2$,此时满足$f(x,y)\le 10^{18}$的$(x,y)$只有约$ ...
- IDEA修改XML注释风格
作为一个强迫症患者,每次想在xml文件用快捷键注释的时候,它自动生成的注释一直都是这样的:这令我非常难受,于是每次我都要把光标移到前面,然后再Tab以下,让它变成这样可是每次都这样,好麻烦啊,如果自己 ...
- Codeforces 1304F1/F2 Animal Observation(单调队列优化 dp)
easy 题目链接 & hard 题目链接 给出一张 \(n \times m\) 的矩阵,每个格子上面有一个数,你要在每行选出一个点 \((i,t)\),并覆盖左上角为 \((i,t)\), ...
- LOJ #6044 -「雅礼集训 2017 Day8」共(矩阵树定理+手推行列式)
题面传送门 一道代码让你觉得它是道给初学者做的题,然鹅我竟没想到? 首先考虑做一步转化,我们考虑将整棵树按深度奇偶性转化为一张二分图,即将深度为奇数的点视作二分图的左部,深度为偶数的点视作二分图的右部 ...
- admixture 群体结构分析
tructure是与PCA.进化树相似的方法,就是利用分子标记的基因型信息对一组样本进行分类,分子标记可以是SNP.indel.SSR.相比于PCA,进化树,群体结构分析可明确各个群之间是否存在交流及 ...
- tabix 操作VCF文件
tabix 可以对NGS分析中常见格式的文件建立索引,从而加快访问速度,不仅支持VCF文件,还支持BED, GFF,SAM等格式. 下载地址: 1 https://sourceforge.net/pr ...
- idea 启动debug的时候throw new ClassNotFoundException(name)
idea 启动debug的时候throw new ClassNotFoundException(name) 启动debug就跳转到此界面 解决办法 这个方法只是忽略了抛异常的点,并没有真正解决问题.后 ...
- applogs流量数据项目学习
一. 项目介绍 项目的功能主要是面向App开发商提供App使用情况的统计服务 主要是基于用户启动app的统计分析,app只要启动就会上报一条日志记录 (启动日志),当然也会有其他的日志比如说页面访问日 ...
- Linux磁盘分区(四)之分区大小调整
Linux磁盘分区(四)之分区大小调整在学习调整分区大小之前,先了解linx分区的概念.参考如下博客:[1]linux 分区 物理卷 逻辑卷 https://www.cnblogs.com/liuch ...
- Oracle中dbms_random包详解
Oracle之DBMS_RANDOM包详解参考自:https://www.cnblogs.com/ivictor/p/4476031.html https://www.cnblogs.com/shen ...