buuctf reverse 学习报告

buuctf reverse 学习报告(1-10)

1.easyre

DIE查壳,64位无壳,IDA打开,shift+f12

2.reverse1

DIE查壳,64位无壳,IDA打开,shift+f12

继续跟进

strcmp,对比str1,str2,若相等则结果为0,!0则表示成立,执行中间的语句,所以跟进这2个str

发现str2中有东西,但观察之前的代码

快捷键R将数字转换为ASCII码表,循环把字母o—>数字0,所以flag{hell0_w0rld}

3.reverse2

DIE查壳,64位无壳,IDA打开,shift+f12

发现关键,很像flag后半部分,再跟进上面的,

在循环中把 i 和 r 换成了 1 

这就是完整flag———>flag{hack1ng_fo1_fun}

4.内涵的软件

DIE查壳,32位无壳,IDA打开,shift+f12

Ctrl+F搜索flag

先进去看一眼,看不懂,放一边,感觉没用,接着看

发现提示和可疑字符串,跟进后发现没什么用,只得到了像flag的东西,试着提交,对了

flag{49d3c93df25caad81232130f3d2ebfad}

5.新年快乐

DIE查壳,32位有壳,先脱壳,IDA打开,shift+f12

跟进,

分析,对比str1和str2,简单判断,flag为flag{HappyNewYear!}

6.xor

1.看名字可能与异或运算有关系

DIE查壳,64位无壳,IDA打开,shift+f12

发现关键,跟进

分析伪代码,首先memset函数应该是清空了 __b 的内容,然后输入一个长为33的字符串,同时判断 __b 中的第二项到最后一项(因为i从1开始)是否和global一样,是的话就success

提取内容

fkw&O.@xZ;UpFv"M#DghG2O

写脚本转换

a=[102,10,107,12,119,38,79,46,64,17,120,13,90,59,85,17,112,25,70,31,118,34,77,35,68,14,103,6,104,15,71,50,79,0]
q="f"
for i in range(1,33):
    q+=chr(a[i]^a[i - 1])
print(q)

得到结果

flag{QianQiuWanDai_YiTongJiangHu}

7.reverse 3

DIE查壳,32位无壳,IDA打开,shift+f12

明显的base64提示和flag,猜测加密过,跟进flag字符串

发现主要的代码,分析,首先看 if 判断,比较了destination和str2字符串,双击查看一下,发现了str2中有加密过的flag

分析上面的代码,知道flag在输入后第一位的ASCII加0,第二位加1,以此类推,写脚本解密

因为原来是 + ,所以逆过来是 - 

代码如下

str="e3nifIH9b_C@n@dH"
flag=""
for i in range(len(str)):
    flag+=chr(ord(str[i])-i)
print(flag)

得出e2lfbDB2ZV95b3V9,在base64解密得出flag{i_l0ve_you}

8.helloword

是个APK文件,记得选择APK打开

ift+f12,CTRL+F,搜索flag

发现flag{7631a988259a00816deda84afb29430a}

9.不一样的flag

DIE查壳,32位无壳,IDA打开,shift+f12

发现端倪

跟进看看,

发现main函数,把一串01数字序列复制给v3,进入永真循环,显示你可以选择一个行为开始执行

1234代表上下左右,scanf 读取键盘录入的数据, v5 ,如果是2(下)就继续执行,其他的则退出

再分析,发现最后一个是#才会正常结束,如果碰到 1 ,就异常退出,没思路了,看了下别的师傅的文章,才知道是迷宫(其实这最后一句,也是提示,说明输入的顺序决定了走向,不能碰到 1 ,那就是按着 0 走,排了一下位置,应该是这样的)

所以键盘应该输入222441114422 即flag{222441114422}

10.SimpleRev

老样子,64位无壳,shift+f12

跟进

分析主体部分,看最后判断的是text和str2,双击查看一下,发现啥都没有,往上看

text中加入了 key3 ,看一下key3里面

又把 key1 复制给了key

strcat() 函数作用是把前后两个字符串连接起来,

接下来的 for 循环对 key 中的满足条件的字符进行了变换,写脚本实现变换

#include<stdio.h>
int main()
{
    char key[6] = { 'A','D','S','F','K' };
    int v5 = strlen(key);
    int v3 = 0;

    for (int i = 0; i < v5; ++i)
    {
        if (key[v3 % v5] > 64 && key[v3 % v5] <= 90)
            key[i] = key[v3 % v5] + 32;
        ++v3;
        printf("%c", key[i]);
    }
    
}

发现就是变了个小写,变成 adsfk

对上面的毫无头绪,查了一下快捷键

将src 和 v9 的数据转为十六进制,快捷键H。快捷键R 将其转为字符

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值