测试文件:https://buuoj.cn/files/aa4f6c7e8d5171d520b95420ee570e79/a9d22a0e-928d-4bb4-8525-e38c9481469e.rar?token=eyJ0ZWFtX2lkIjpudWxsLCJ1c2VyX2lkIjoxOTAzLCJmaWxlX2lkIjoxNTl9.XXCjMA.QBNzEL8Ujfk_QRbQYa6XZ3dYjQ4

1.准备

获得信息

  1. 32位文件

2.IDA打开

将main函数反编译为C语言代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // ebx
int v4; // edi
int v5; // esi return main_0(v3, v4, v5);
}

打开main_0函数

 __int64 __usercall main_0@<edx:eax>(int a1@<ebx>, int a2@<edi>, int a3@<esi>)
{
int v3; // eax
const char *v4; // eax
size_t v5; // eax
int v6; // edx
__int64 v7; // ST08_8
signed int j; // [esp+DCh] [ebp-ACh]
signed int i; // [esp+E8h] [ebp-A0h]
signed int v11; // [esp+E8h] [ebp-A0h]
char Dest[]; // [esp+F4h] [ebp-94h]
char Str; // [esp+160h] [ebp-28h]
char v14; // [esp+17Ch] [ebp-Ch] for ( i = ; i < ; ++i )
{
if ( (unsigned int)i >= 0x64 )
j____report_rangecheckfailure(a1, a2, a3);
Dest[i] = ;
}
sub_41132F("please enter the flag:");
sub_411375("%20s", &Str);
v3 = j_strlen(&Str);
v4 = (const char *)sub_4110BE((int)&Str, v3, (int)&v14);
strncpy(Dest, v4, 0x28u);
v11 = j_strlen(Dest);
for ( j = ; j < v11; ++j )
Dest[j] += j;
v5 = j_strlen(Dest);
if ( !strncmp(Dest, Str2, v5) )
sub_41132F("rigth flag!\n");
else
sub_41132F("wrong flag!\n");
HIDWORD(v7) = v6;
LODWORD(v7) = ;
return v7;
}

2.1代码分析

第24行代码,第27~28行代码在对Dest进行一些列变换

从第30行代码分析得到,Str2中存储的就是flag变换过后的字符串,打开Str2

.data:0041A034 ; char Str2[]
.data:0041A034 Str2 db 'e3nifIH9b_C@n@dH', ; DATA XREF: _main_0+142↑o

因此,我们只需要将Str2反向变换即可得到flag。

第27~28行代码的变换没有难度,再来看看第24行代码的函数。

 void *__cdecl sub_411AB0(char *a1, unsigned int a2, int *a3)
{
int v4; // STE0_4
int v5; // STE0_4
int v6; // STE0_4
int v7; // [esp+D4h] [ebp-38h]
signed int i; // [esp+E0h] [ebp-2Ch]
unsigned int v9; // [esp+ECh] [ebp-20h]
int v10; // [esp+ECh] [ebp-20h]
signed int v11; // [esp+ECh] [ebp-20h]
void *Dst; // [esp+F8h] [ebp-14h]
char *v13; // [esp+104h] [ebp-8h] if ( !a1 || !a2 )
return ;
v9 = a2 / ;
if ( (signed int)(a2 / ) % )
++v9;
v10 = * v9;
*a3 = v10;
Dst = malloc(v10 + );
if ( !Dst )
return ;
j_memset(Dst, , v10 + );
v13 = a1;
v11 = a2;
v7 = ;
while ( v11 > )
{
byte_41A144[] = ;
byte_41A144[] = ;
byte_41A144[] = ;
for ( i = ; i < && v11 >= ; ++i )
{
byte_41A144[i] = *v13;
--v11;
++v13;
}
if ( !i )
break;
switch ( i )
{
case :
*((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[] >> ];
v4 = v7 + ;
*((_BYTE *)Dst + v4++) = aAbcdefghijklmn[((byte_41A144[] & 0xF0) >> ) | * (byte_41A144[] & )];
*((_BYTE *)Dst + v4++) = aAbcdefghijklmn[];
*((_BYTE *)Dst + v4) = aAbcdefghijklmn[];
v7 = v4 + ;
break;
case :
*((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[] >> ];
v5 = v7 + ;
*((_BYTE *)Dst + v5++) = aAbcdefghijklmn[((byte_41A144[] & 0xF0) >> ) | * (byte_41A144[] & )];
*((_BYTE *)Dst + v5++) = aAbcdefghijklmn[((byte_41A144[] & 0xC0) >> ) | * (byte_41A144[] & 0xF)];
*((_BYTE *)Dst + v5) = aAbcdefghijklmn[];
v7 = v5 + ;
break;
case :
*((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[] >> ];
v6 = v7 + ;
*((_BYTE *)Dst + v6++) = aAbcdefghijklmn[((byte_41A144[] & 0xF0) >> ) | * (byte_41A144[] & )];
*((_BYTE *)Dst + v6++) = aAbcdefghijklmn[((byte_41A144[] & 0xC0) >> ) | * (byte_41A144[] & 0xF)];
*((_BYTE *)Dst + v6) = aAbcdefghijklmn[byte_41A144[] & 0x3F];
v7 = v6 + ;
break;
}
}
*((_BYTE *)Dst + v7) = ;
return Dst;
}

在代码的下部分,可以看到Dst会经过aAbcdefghijklmn[]数组的变换,打开此处

.rdata:00417B30 aAbcdefghijklmn db 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
.rdata:00417B30 ; DATA XREF: .text:004117E8↑o
.rdata:00417B30 ; .text:↑o ...
.rdata:00417B30 db
.rdata:00417B72 align

从'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='可以看出,这个函数应该是base64的加密函数,因此只需要解密即可。

3.脚本获取flag

import base64

str1 = 'e3nifIH9b_C@n@dH'
x = ''
flag = '' for j in range(0, len(str1)):
x += chr(ord(str1[j]) - j) flag = base64.b64decode(x)
flag = flag.decode('ASCII')
print(flag)

4.get flag!

flag{i_l0ve_you}

BUUCTF--reverse3的更多相关文章

  1. [BUUCTF]REVERSE——reverse3

    reverse3 附件 步骤: 例行查壳儿,32位程序,无壳儿 32位ida载入,shift+f12检索程序里的字符串,得到了有关flag的提示,而且看到了ABCDE--78这种字符串,猜测存在bas ...

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

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

  3. BUUCTF RE部分题目wp

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

  4. BUUCTF 部分wp

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

  5. buuctf misc 刷题记录

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

  6. BUUCTF知识记录

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

  7. buuctf misc wp 01

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

  8. buuctf misc wp 02

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

  9. BUUCTF WEB-WP(3)

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

  10. BUUCTF Crypto_WP(2)

    BUUCTF Crypto WP 几道密码学wp [GXYCTF2019]CheckIn 知识点:Base64,rot47 下载文件后,发现一个txt文件,打开发现一串base64,界面之后出现一串乱 ...

随机推荐

  1. MYSQL学习笔记——数据库范式及MYSQL优化整体思路

    一.数据库范式                                                                               为了建立冗余较小.结构合理的 ...

  2. Matlab的2D作图

    1 plot()函数 画一条线 plot(X,Y) 最基本的例子 x = 0: pi / 100:2 * pi; y = sin(x); figure plot(x,y) 在一张图上画多条线 clc; ...

  3. AOP技术介绍--(引言)

    软件设计因为引入面向对象思想而逐渐变得丰富起来.“一切皆为对象”的精义,使得程序世界所要处理的逻辑简化,开发者可以用一组对象以及这些对象之间的关系将软件系统形象地表示出来.而从对象的定义,进而到模块, ...

  4. 免插件,简单实现上拉加载loading

    上拉加载是前端经常遇到的问题,采用插件往往能够轻松解决,这里介绍一种免插件简单实现上拉加载的方法,参考一下,下面分享一下代码. html <body> <ul> <li& ...

  5. django之csrf_exempt解决跨域请求的问题

    一: from django.views.decorators.csrf import csrf_exempt # 获取微信返回的code信息 @csrf_exempt def wechat_auth ...

  6. Python---基础---水仙花数和三色球

    一.编写一个程序,求100~999之间的所有水仙花数 如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数.例如:153 = 1^3 + 5^3 + 3^3,因此153就是一个水仙花数 for ...

  7. TFRecords文件的生成和读取(1)

    参考:https://blog.csdn.net/u012222949/article/details/72875281 参考:https://blog.csdn.net/chengshuhao199 ...

  8. Oracle RAC运维所遇问题记录二

    oracle12c RAC源端与Dataguard目标端实时同步,因业务需求需要在源端增加PDB 1. 源端添加PDB CREATE PLUGGABLE DATABASE kdlxpdb admin ...

  9. CSS基础知识总结二

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/html"> ...

  10. Dubbo学习-1-基础知识

    分布式基础理论 1.什么是分布式系统: 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统.分布式系统是建立在网络之上的软件系统 随着互联网发展,网站应用规模的不断扩大,常规的 ...