BUUCTF--reverse3
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的更多相关文章
- [BUUCTF]REVERSE——reverse3
reverse3 附件 步骤: 例行查壳儿,32位程序,无壳儿 32位ida载入,shift+f12检索程序里的字符串,得到了有关flag的提示,而且看到了ABCDE--78这种字符串,猜测存在bas ...
- 刷题记录:[BUUCTF 2018]Online Tool
目录 刷题记录:[BUUCTF 2018]Online Tool 一.知识点 1.escapeshellarg和escapeshellcmd使用不当导致rce 刷题记录:[BUUCTF 2018]On ...
- BUUCTF RE部分题目wp
RE 1,easyre拖进ida,得到flag 2,helloworld 将文件拖入apk改之理,得到flag 3,xor拖进ida,就是简单异或,写脚本 glo=[0x66,0x0a,0x6b,0x ...
- BUUCTF 部分wp
目录 Buuctf crypto 0x01传感器 提示是曼联,猜测为曼彻斯特密码 wp:https://www.xmsec.cc/manchester-encode/ cipher: 55555555 ...
- buuctf misc 刷题记录
1.金三胖 将gif分离出来. 2.N种方法解决 一个exe文件,果然打不开,在kali里分析一下:file KEY.exe,ascii text,先txt再说,base64 图片. 3.大白 crc ...
- BUUCTF知识记录
[强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...
- buuctf misc wp 01
buuctf misc wp 01 1.金三胖 2.二维码 3.N种方法解决 4.大白 5.基础破解 6.你竟然赶我走 1.金三胖 root@kali:~/下载/CTF题目# unzip 77edf3 ...
- buuctf misc wp 02
buuctf misc wp 02 7.LSB 8.乌镇峰会种图 9.rar 10.qr 11.ningen 12.文件中的秘密 13.wireshark 14.镜子里面的世界 15.小明的保险箱 1 ...
- BUUCTF WEB-WP(3)
BUUCTF WEB 几道web做题的记录 [ACTF2020 新生赛]Exec 知识点:exec命令执行 这题最早是在一个叫中学生CTF平台上看到的类似,比这题稍微要复杂一些,多了一些限制(看看大佬 ...
- BUUCTF Crypto_WP(2)
BUUCTF Crypto WP 几道密码学wp [GXYCTF2019]CheckIn 知识点:Base64,rot47 下载文件后,发现一个txt文件,打开发现一串base64,界面之后出现一串乱 ...
随机推荐
- tail 显示文件内容尾部
1.命令功能 tail默认显示文件内容尾部10行. 2.语法格式 tail option file 参数说明 参数 参数说明 -n 显示指定行数 -f 实时输出文件变化后追加的数据 -s 监视文件 ...
- MATLAB 和 armadillo 数据转换
#include<iostream> #include<armadillo> int D=5; int M=4; int main() { arma::fmat x; x.ra ...
- LeetCode--058--最后一个单词(java)
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...
- pypi 清华镜像使用帮助
清华镜像 地址 https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ 临时使用 pip install -i https://pypi.tuna.tsingh ...
- @ResponseBody和@RestController
Spring 关于ResponseBody注解的作用 responseBody一般是作用在方法上的,加上该注解表示该方法的返回结果直接写到Http response Body中,常用在ajax异步请求 ...
- linux之yum源的RPM软件包管理
1.yum源的配置文件 路径:vim /etc/yum.repos.d/CnetOS-Base.repo 文件格式: 2.yum查询 yum list 查询所有可用软件包 yum search 包名 ...
- django搭建一个小型的服务器运维网站-用户登陆与session
目录 项目介绍和源码: 拿来即用的bootstrap模板: 服务器SSH服务配置与python中paramiko的使用: 用户登陆与session; 最简单的实践之修改服务器时间: 查看和修改服务器配 ...
- Visual Studio Code - 快捷键
默认快捷键 Visual Studio Code 默认快捷键 代码提示(自动补全,自动完成) 默认是快捷键是Ctrl+Space,与搜狗输入法切换中英文的快捷键冲突了..可以改搜狗输入法的快捷键(Sh ...
- React Hooks简单业务场景实战(非源码解读)
前言 React Hooks 是React 16.7.0-alpha 版本推出的新特性.从 16.8.0 开始,React更稳定的支持了这一新特性. 它可以让你在不编写 class 的情况下使用 st ...
- Mybatis 批量插入和更新小例
SpringBoot配置Mybatis前文有博文,数据库mysql: package com.example.demo.biz.dto; public class User { private int ...