一、easyre

1.010打开,直接搜flag,得到flag

二、reverse1

1.先查壳,得知是64位无壳,直接用IDA打开

2.shiftF12查找字符串,发现关键语句

3.查看相应代码,F5反编译

4.发现关键的比较函数,看一下分别比较的字符串

5.发现是输入的str1和程序中的str2({hello_world})相比较,那么flag就是{hello_world}

三.reverse2

1.查壳,64位,非exe

2.IDA打开,shift12发现关键语段

3.找到对应的函数,发现是一个将flag和输入的字符串进行对比

4.代码表现出了flag的加密过程,但是根据代码的判断应该会存在一个原flag字符串,回去查找字符串,发现了一个特殊意义的str

5.之前提到的flag加密代码的含义就是逐个遍历flag的字符,如果字符为i或者r,那就把它改为1。直接写个脚本跑一下(或者可直接手动)。

点击查看代码
#include <iostream>
#include <stdlib.h>
#include <stdio.h> int main() {
int i = 0;
char flag[] = "hacking_for_fun}";
for (i = 0; i <= 15; ++i)
{
if (flag[i] == 'i' || flag[i] == 'r')
flag[i] = '1';
}
printf("%s", flag);
return 0;
}

6.得到flag

flag{hack1ng_fo1_fun}

四.内涵的软件

1.查壳,无壳,IDA(非64位)打开,进入main函数,进入main_0函数

2.找到一串字符串,就是flag(改一下前面的头)

flag{49d3c93df25caad81232130f3d2ebfad}

五、新年快乐

1.查壳,发现是UPX

2.使用UPXshell解压缩去壳

3.IDA(非32位)打开,找到main函数,发现关键语句

4.根据比较函数发现,str2就是flag的正确形式,再看str2的来源,是使用了strcpy函数,那么flag就是HappyNewYear!

flag{HappyNewYear!}

六、xor

1.查壳,发现是64位无壳,使用IDA打开,找到main函数

2.代码的意思就是将首先判断长度是否为33,不是就failed,然后如果长度正确,就使用for循环由后一个异或前一个。找到原来的字符串

3.写个脚本,利用异或的特点,得到flag(需要注意到的是有一些字符本身就是ASCII码,不能再将其转为ASCII码,否则会异或出错)

点击查看代码
s = ['f','10','k','12','w','&','O','.','@','17','x','13','Z',';','U','17','p','25','F','31','v','"','M','#','D','14','g','6','h','15','G','2','O','0']
ls = []
for i in range(0,len(s)):
if len(s[i]) > 1 or s[i] == '6' or s[i] == '0':
ls.append(int(s[i]))
else:
ls.append(ord(s[i]))
for i in range(1,33):
print(chr(ls[i] ^ ls[i - 1]),end = '')

4.得到flag(直接异或得到的字符串前面少一个f)

flag{QianQiuWanDai_YiTongJiangHu}

七、helloword

1.得到一个apk文件,使用IDA打开,注意选择APK

2.shiftF12搜索字符串,发现flag

flag{7631a988259a00816deda84afb29430a}

八、reverse3

1.查壳,无壳,使用IDA(非64)打开

2.shift12搜索字符串,看到了base64和加密表以及关键词flag

3.追踪找到关键函数

4.关键函数代码审计一下,简单来说就是先将输入的str经过base64加密然后逐位与0123...相加,然后与str2进行比较,str2可以直接找到。直接写脚本逆回去

点击查看代码
str = "e3nifIH9b_C@n@dH"
s = list(str)
ls = ''
for i in range(len(s)):
ls += chr(ord(s[i]) - i) print(base64.b64decode(ls))

5.运行后得到flag

flag{i_l0ve_you}

九、不一样的flag

1.查壳,无壳,使用IDA(非64)打开,shiftF12查找字符串

2.发现一串01串,觉得像迷宫题,进入到函数

3.果然是迷宫题,根据最后的输出语句可以得知flag就是走出迷宫的1234选择,根据exit()函数可以得知遇到1就退出,那就是从头走到尾同时只走0

4.01串一共是25个字符,那就是5x5的矩阵

5.直接目测,得到flag

222441144222

十、SimpleRev

1.查壳,无壳,使用IDA(64位)打开

2.shiftF12发现关键语句

3.找到关键的程序函数main函数中的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[8]; // [rsp+20h] [rbp-40h] BYREF
__int64 v7; // [rsp+28h] [rbp-38h]
int v8; // [rsp+30h] [rbp-30h]
__int64 v9[2]; // [rsp+40h] [rbp-20h] BYREF
int v10; // [rsp+50h] [rbp-10h]
unsigned __int64 v11; // [rsp+58h] [rbp-8h] v11 = __readfsqword(0x28u);
*(_QWORD *)src = 0x534C43444ELL;
v7 = 0LL;
v8 = 0;
v9[0] = 0x776F646168LL;
v9[1] = 0LL;
v10 = 0;
text = (char *)join(key3, v9);
strcpy(key, key1);
strcat(key, src);
v2 = 0;
v3 = 0;
getchar();
v5 = strlen(key);
for ( i = 0; i < v5; ++i )
{
if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
key[i] = key[v3 % v5] + 32;
++v3;
}
printf("Please input your flag:");
while ( 1 )
{
v1 = getchar();
if ( v1 == 10 )
break;
if ( v1 == 32 )
{
++v2;
}
else
{
if ( v1 <= 96 || v1 > 122 )
{
if ( v1 > 64 && v1 <= 90 )
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
++v3;
}
}
else
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
++v3;
}
if ( !(v3 % v5) )
putchar(32);
++v2;
}
}
if ( !strcmp(text, str2) )
puts("Congratulation!\n");
else
puts("Try again!\n");
return __readfsqword(0x28u) ^ v11;
}

4.代码审计,首先看比较函数,得知是将text和str2相比较,str2目前找不到相应的字符串,text是由 join(key3, (const char *)v9);组成,key3追踪可得是kills,v9在代码的前面部分,查看十六进制可以看出是大端序存储的,但是在CPU和x86中一般为小端序存储,那么原本的字串就是IDA中转为char后倒转一下

5.所以src = NDCLS , v9 = hadow,再查看join函数的源码,可以看出作用就是将key3和v9连接在一起

6.所以text=killshadow,接着向下,strcpy(key, key1),key1=ADSFK,将key1复制为key,key=key1=ADSFK;strcat(key, src),将key和src连接,key = ADSFKNDCLS;v5就是key的长度,为10,接下来for循环函数的作用就是判断字符是否为大写,如果为大写就将其变为小写

7.接下来就是主要的输入字串处理,而最后与text对比的str2仅由一句话决定str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97,text已经知道了,直接写脚本跑一下

点击查看代码
v3 = 0
key = 'adsfkndcls'
text = 'killshadow'
key = list(key)
text = list(text)
for i in range(10):
for j in range(128):
if (j < ord('A') or j > ord('Z')) or (j < ord('z') and j > ord('a')):
continue
if ((j - 39 - ord(key[v3 % 10]) + 97) % 26 + 97 == ord(text[i])):
print(chr(j),end='');
v3 += 1
break

8.需要注意,因为源码中的key在与str2比较前,经过一个函数转变全部为小写字母,所以写脚本时使用的key也应是小写字母

9.得到flag

KLDQCUDFZO

BUU_RE学习记录的更多相关文章

  1. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  2. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  3. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  4. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  5. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  6. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  7. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  8. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  9. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

  10. UWP学习记录6-设计和UI之控件和模式3

    UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...

随机推荐

  1. Python中dataclass库

    目录 dataclass语法 一. 简介 二. 装饰器参数 三. 数据属性 1. 参数 2. 使用示例 3. 注意事项 四. 其他 1. 常用函数 2. 继承 3. 总结 dataclass语法 一. ...

  2. 程序员便于开发的一些工具、网站、App。

    http://www.kancloud.cn 关于文档,各种技术,框架的学习指南,API文档搜索方便. https://leetcode.com/ 程序员刷题面试网站,无聊的时候可以做一做.

  3. PHP微信支付功能

    百度网盘:http://pan.baidu.com/s/1sl5GeVr  l5ud 先下载一份sdk ,引入到自己的项目中,我用的是TP5,配置好namespace 然后在项目中引入: 之后,在去配 ...

  4. 数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储

    哈希表 解释 哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方 内存结构分析图 1.定义一个类为结点,存储的信息 2.定义链表的相关操作 3.定义一个数组存 ...

  5. SQL---ltrim()和rtrim()函数的使用

    背景 去除字符串首尾空格大家肯定第一个想到trim()函数,不过在sqlserver中是没有这个函数的,却而代之的是ltrim()和rtrim()两个函数. 看到名字所有人都 知道做什么用的了,ltr ...

  6. ThreadLocal的介绍与运用

    ThreadLocal全面解析 学习目标 了解ThreadLocal的介绍 掌握ThreadLocal的运用场景 了解ThreadLocal的内部结构 了解ThreadLocal的核心方法源码 了解T ...

  7. redis位图(bitmap)常用命令的解析

    描述   bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计用户签到.登录等场景 常用命令及解析 常用命令 setbit key offset va ...

  8. java学习之EL和JSTL

    0x00前言 EL和JSTL都是JSP的内容的拓展,都是开发的一些东西,稍微学习记录一下,避免以后忘记 0x01EL 0x1基本用法 概念:Expression language 表达式语言 作用:替 ...

  9. mindxdl--common--logger.go

    // Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common the contr ...

  10. Linux 基础-查看 cpu、内存和环境等信息

    Linux 基础-查看 cpu.内存和环境等信息 在使用 Linux 系统的过程中,我们经常需要查看系统.资源.网络.进程.用户等方面的信息,查看这些信息的常用命令值得了解和熟悉. 1,系统信息查看常 ...