测试文件:https://buuoj.cn/files/7458c5c0ce999ac491df13cf7a7ed9f1/SimpleRev?token=eyJ0ZWFtX2lkIjpudWxsLCJ1c2VyX2lkIjoxOTAzLCJmaWxlX2lkIjoyNDN9.XXnIgg.L-8ifBkOTka-7o-QXZDkKNm77x4

1.准备

获取信息

  1. 64位文件

2.IDA打开

将main函数反编译为C代码

 int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
int v3; // eax
char v4; // [rsp+Fh] [rbp-1h] while ( )
{
while ( )
{
printf("Welcome to CTF game!\nPlease input d/D to start or input q/Q to quit this program: ", argv, envp);
v4 = getchar();
if ( v4 != 'd' && v4 != 'D' )
break;
Decry();
}
if ( v4 == 'q' || v4 == 'Q' )
Exit();
puts("Input fault format!");
v3 = getchar();
putchar(v3);
}
}

3.代码分析

很明显,这道题的关键在于Decry()

 unsigned __int64 Decry()
{
char v1; // [rsp+Fh] [rbp-51h]
int v2; // [rsp+10h] [rbp-50h]
int v3; // [rsp+14h] [rbp-4Ch]
int i; // [rsp+18h] [rbp-48h]
int v5; // [rsp+1Ch] [rbp-44h]
char src[]; // [rsp+20h] [rbp-40h]
__int64 v7; // [rsp+28h] [rbp-38h]
int v8; // [rsp+30h] [rbp-30h]
__int64 v9; // [rsp+40h] [rbp-20h]
__int64 v10; // [rsp+48h] [rbp-18h]
int v11; // [rsp+50h] [rbp-10h]
unsigned __int64 v12; // [rsp+58h] [rbp-8h] v12 = __readfsqword(0x28u);
*(_QWORD *)src = 'SLCDN';
v7 = 0LL;
v8 = ;
v9 = 'wodah';
v10 = 0LL;
v11 = ;
text = join(key3, (const char *)&v9); // text = 'killshadow'
strcpy(key, key1);
strcat(key, src); // key = 'ADSFKNDCLS'
v2 = ;
v3 = ;
getchar();
v5 = strlen(key); // v5 = 10
for ( i = ; i < v5; ++i )
{
if ( key[v3 % v5] > && key[v3 % v5] <= )// key = 'adsfkndcls'
key[i] = key[v3 % v5] + ;
++v3;
}
printf("Please input your flag:", src);
while ( )
{
v1 = getchar();
if ( v1 == )
break;
if ( v1 == )
{
++v2;
}
else
{
if ( v1 <= || v1 > )
{
if ( v1 > && v1 <= ) // 大写字母
str2[v2] = (v1 - - key[v3++ % v5] + ) % + ;
}
else // 小写字母
{
str2[v2] = (v1 - - key[v3++ % v5] + ) % + ;
}
if ( !(v3 % v5) )
putchar(' ');
++v2;
}
}
if ( !strcmp(text, str2) )
puts("Congratulation!\n");
else
puts("Try again!\n");
return __readfsqword(0x28u) ^ v12;
}

转换成可以运行的C代码是

 #include <bits/stdc++.h>

 #pragma warning(disable:4996)

 int main(void)
{
int i, j, n = , v5 = , v3 = , v2 = ;
char v1;
char flag[] = { };
char str2[] = { };
char key[] = "ADSFKNDCLS";
char text[] = "killshadow"; for (i = ; i < v5; ++i)
{
if (key[v3 % v5] > && key[v3 % v5] <= )
key[i] = key[v3 % v5] + ;
++v3;
}
printf("Please input your flag:");
while ()
{
v1 = getchar();
printf("v1:%c\nv2:%d\n\n", v1, v2);
if (v1 == ) {
printf("进入1\n");
break;
}
if (v1 == )
{
printf("进入2\n");
++v2;
}
else
{
if (v1 <= || v1 > )
{
if (v1 > && v1 <= ) {
str2[v2] = (v1 - - key[v3++ % v5] + ) % + ;
printf("计算1\n");
}
}
else
{
str2[v2] = (v1 - - key[v3++ % v5] + ) % + ;
printf("计算1\n");
}
if (!(v3 % v5))
putchar(' ');
++v2;
}
}
if (!strcmp(text, str2))
puts("Congratulation!\n");
else {
printf("str2:%s\n", str2);
puts("Try again!\n");
} system("PAUSE");
return ;
}

第30~35行代码的实际作用是将大写字母转换为小写。

第37~61行代码实际上就是遍历输入的字符(flag),进行str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;运算,最后与text比较。

因此我们只要反向就能求出输入的v1

4.程序获取flag

#include <bits/stdc++.h>

#pragma warning(disable:4996)

int main(void)
{
int i, j, n = , v5 = , v3 = , v2 = ;
char v1;
char flag[] = { };
char str2[] = { };
char key[] = "ADSFKNDCLS";
char text[] = "killshadow"; for (i = ; i < v5; ++i)
{
if (key[v3 % v5] > && key[v3 % v5] <= )
key[i] = key[v3 % v5] + ;
++v3;
}
for (j = ; j < ; ++j) {
for (v2 = ; v2 < ; ++v2) {
v1 = text[v2] - + * j - + key[v3++ % v5] + ;
if ((v1 >= && v1 <= ) || (v1 >= && v1 <= )) {
flag[v2] = v1;
if (++n == ) {
printf("%s\n", flag);
system("PAUSE");
return ;
}
}
}
} system("PAUSE");
return ;
}

5.get flag!

flag{KLDQCUDFZO}

BUUCTF--SimpleRev的更多相关文章

  1. [BUUCTF]REVERSE——SimpleRev

    SimpleRev 附件 步骤: 例行查壳儿,,无壳,64位程序 64位ida载入,看main函数 关键代码段在Decry函数里 unsigned __int64 Decry() { char v1; ...

  2. 刷题记录:[BUUCTF 2018]Online Tool

    目录 刷题记录:[BUUCTF 2018]Online Tool 一.知识点 1.escapeshellarg和escapeshellcmd使用不当导致rce 刷题记录:[BUUCTF 2018]On ...

  3. BUUOJ reverse SimpleRev (爆破)

    SimpleRev SimpleRev(flag需加上flag{}再提交) 注意:得到的 flag 请包上 flag{} 提交 拖到ida 找到关键函数: unsigned __int64 Decry ...

  4. BUUCTF RE部分题目wp

    RE 1,easyre拖进ida,得到flag 2,helloworld 将文件拖入apk改之理,得到flag 3,xor拖进ida,就是简单异或,写脚本 glo=[0x66,0x0a,0x6b,0x ...

  5. BUUCTF 部分wp

    目录 Buuctf crypto 0x01传感器 提示是曼联,猜测为曼彻斯特密码 wp:https://www.xmsec.cc/manchester-encode/ cipher: 55555555 ...

  6. buuctf misc 刷题记录

    1.金三胖 将gif分离出来. 2.N种方法解决 一个exe文件,果然打不开,在kali里分析一下:file KEY.exe,ascii text,先txt再说,base64 图片. 3.大白 crc ...

  7. BUUCTF知识记录

    [强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...

  8. buuctf misc wp 01

    buuctf misc wp 01 1.金三胖 2.二维码 3.N种方法解决 4.大白 5.基础破解 6.你竟然赶我走 1.金三胖 root@kali:~/下载/CTF题目# unzip 77edf3 ...

  9. buuctf misc wp 02

    buuctf misc wp 02 7.LSB 8.乌镇峰会种图 9.rar 10.qr 11.ningen 12.文件中的秘密 13.wireshark 14.镜子里面的世界 15.小明的保险箱 1 ...

  10. BUUCTF WEB-WP(3)

    BUUCTF WEB 几道web做题的记录 [ACTF2020 新生赛]Exec 知识点:exec命令执行 这题最早是在一个叫中学生CTF平台上看到的类似,比这题稍微要复杂一些,多了一些限制(看看大佬 ...

随机推荐

  1. flask入门,Hello World!

    flask这个框架简单易用,去年2018的使用份额已经快接近django了.入门首选,没有太多的要求. 接下来,写个Hello World吧 1.新手入门,如果你是在windows下使用的,需要先安装 ...

  2. 【JavaScript】包装类

    包装类 String().Number().Boolean() String() 可以将基本数据类型的字符串转换为String对象 var string = new String("hell ...

  3. 原生js控制控制--弹窗的显示和隐藏

    以防浪费大家的时间,还是先上效果图吧,满足您的需求就往下look吧. 重要知识点:点击其他地方,也就是除了小叉子之外的地方也能够关闭弹窗哦.代码已标红    html代码: <button id ...

  4. 奇偶选择器:使用odd和even属性实现表格单双行颜色相间和不同

    一.奇偶选择器 表格在呈现数据的时候我们为了方便观看,而隔行显示不同的颜色,虽然可以用用类选择器 class实现这种效果,但是未免太过麻烦,为了更加简便地表现这种特殊的效果我们需要用到一种特殊的选择器 ...

  5. div的文字倾斜

    最近要写一个页面,需要一排文字是倾斜的,我就写了一下 <div class="qingx">倾斜导航</div> div.qingx{ -moz-trans ...

  6. Oracle--利用监听器日志监控访问该数据库的客户端IP

    服务器10.10.10.168  数据库seineebs 客户端 10.10.10.14  用户guipeng.zhang 查看监听器状态: 在本机利用PL/SQL工具连接该数据库 查看监听器日志:一 ...

  7. 13-1 jquery操作cookie

    jQuery之cookie操作 Cookies 定义:让网站服务器把少量数据存储到客户端的硬盘或内存,从客户端的硬盘里读取数据的一种技术; 下载与引入:jquery.cookie.js基于jquery ...

  8. EF6中一个关于时间类型 datetime2 的坑

    在一个访问下位机的程序中,返回的时间戳有时候因断线产生0001年01月01日的时间,而原先使用拼接SQL进行数据存储的操作时,这个问题是可以跳过的. 这次把拼接SQL的部分重新改为EF进行管理,这个坑 ...

  9. VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机

    目录 目录 软件环境 前言 Openstack 接口驱动 使用 KVM 在 Compute Node 上创建虚拟机的流程 使用 VCDirver 在 vCenter 上创建虚拟机的流程 配置 vCen ...

  10. requests模块(请求接口)

    下面分别是get,post,入参json,添加cookie,添加header,上传/下载文件 的接口请求举例: import requests   #导入模块 #1.发get请求 url = 'htt ...