BUUCTFReservewp(3)

[HDCTF2019]Maze

终于找到了一道用花指令的题了
先脱壳,然后进入ida
在这里插入图片描述
参考我的这篇文章:花指令
所以先把jnz给nop掉:
edit >> Patch program >> Change byte >> 前两位改为90
在这里插入图片描述

将花指令nop掉后,选中红色代码段,然后键盘p一下得到main函数
在这里插入图片描述
可以看到,wasd四个键控制移动,并且带有–和++的效果,然后后面一个if else判断语句,要让dword_408078 = 5,dword_40807C = -4,才能得到flag
点进去看看dword_408078和dword_40807C
在这里插入图片描述
那么7c初始是0,最后要等于-4,而s控制7c的–,这说明是往下走呗
shift + f12看字符串,然后shift+e提取数据得到:

在这里插入图片描述
关于为什么是7x10,那是看大佬wp知道的,我看大佬们做过的题也是7x10,所以就7x10.。。。。。

相册

这是个apk文件,我们需要下载一个jadk
下载完jadx和jadx-gui之后,用windows命令:java -jar jadx-gui.exe
启动jadx
打开apk文件,我们进行文本搜索:mail
找到函数:sendmail
在这里插入图片描述
我们查看:查找声明
在这里插入图片描述
找的是邮件,我们看通讯录
在这里插入图片描述
发现MAILSERVER,进入跳到声明
在这里插入图片描述
这个就是邮件了,而要进入MAILSERVER函数,首先要对NativeMethod.m进行base64加密
在这里插入图片描述
选中那一行继续跳到声明,发现是空的
而Java中的NativeMethod函数一般用于调用外部文件,所以我们ida打开so文件
在这里插入图片描述
我们解压apk文件,在lib文件夹里的armeabi文件夹里面有个so文件,用ida打开
找到字符串进行base64解密即可
在这里插入图片描述
也可以在exports里面找到NativeMethod_m_
双击进入,发现被加密字符串
在这里插入图片描述

MRCTF{@_R3@1ly_E2_R3verse!}

进入ida,shift+f12找字符串
在这里插入图片描述
进入,查看伪代码,但好像看不了,也没有花指令,只能看汇编了
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
首先byte_4212C0是我们输入的字符串
edx在自增,之后跟1B(也就是27)进行比较,可以大胆猜测flag长度是27
然后byte_4212C0的第eax位跟al进行异或(al也就是eax的后八位,其实就是自增的位,也就是 i 了)
接着就和byte_41EA08的第eax位进比较(而byte_41EA08给出了字符串)
然后eax(可以看成 i 了)自增,继续循环
那么就能写出脚本:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char a[27] = {77,  83,  65,  87,  66, 126,  70,  88,  90,  58, 74,  58,  96, 116,  81,  74,  34,  78,  64,  32, 98, 112, 100, 100, 125,  56, 103};
    char flag[27];
    for(int i=0;i<27;i++){
        flag[i] = a[i] ^ i;
    }
    printf("%s",flag);
	return 0;
}

[GWCTF 2019]xxor

看ida,代码很清晰
首先输入六次,六个数;然后进入三次的循环:对输入数组的0,2,4位进行加密,加密过后的数组再换回来。
在这里插入图片描述
进入加密函数:
在这里插入图片描述
一个64次的循环加密(逆的时候+=变为-=,里面的顺序也要改变,然后v5开始等于64乘满),一次加密两个,然后外面是三次循环,总共六个数,那就是两两一组加密。
我的理解其中a1和a1[1],就是代表v6[0]和v6[1](因为a1本身就是v6[j],而当时j=0,也就有a1=v6[0],但是a1是什么呢,只能是第二个v6[1],也就有了两两一组了)
然后出来看if语句,可以用简单的三元一次方程解出不知道的数字
在这里插入图片描述
在这里插入图片描述
知道结果了,知道过程了,那就开始逆了

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    unsigned int a[6] = {3746099070,550153460,3774025685,1548802262,2652626477,2230518816};
    int a2[4] = {2,2,3,4};
    unsigned int v3,v4;
    int v5;
    for(int j=0;j<=4;j+=2){
    v3 = a[j];
    v4 = a[j+1];
    v5 = 1166789954 * 64;
    for ( int i = 0; i < 64; i++ )
  {
    v4 -= (v3 + v5 + 20) ^ ((v3 << 6) + a2[2]) ^ ((v3 >> 9) + a2[3]) ^ 0x10;
    v3 -= (v4 + v5 + 11) ^ ((v4 << 6) + a2[0]) ^ ((v4 >> 9) + a2[1]) ^ 0x20;

    v5 -= 1166789954;
  }
    a[j] = v3;
    a[j+1] = v4;
    }
    for(int i=0;i<6;i++){
        printf("%x",a[i]);
    }
	return 0;
}

得出的结果将16进制转为文本
在这里插入图片描述

[MRCTF2020]hello_world_go

无壳,进入ida看main_main函数
在这里插入图片描述
有点晦涩😓
再翻看函数的时候,意外看到了明文flag(按a转换字符串)
在这里插入图片描述

Go语言:
Go语言其实是Golanguage的简称,Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译并发型语言。Go 语言语法与 C 相近。
可以使用

[WUSTCTF2020]level3

无壳进ida看main函数
说是base64加密,然后又给了一串字符串,那就直接试试用字符串解密呗
试过之后发现没出来flag
在这里插入图片描述
那看看加密过程,也很正常

在这里插入图片描述
那就可能是变表了,看看base64表的引用
在这里插入图片描述
有一个look表看看,果然原先的表被改变了
在这里插入图片描述
写个脚本
在这里插入图片描述
再次解密得出flag
在这里插入图片描述

[FlareOn4]IgniteMe

进入ida看主函数:
明显WriteFile函数是输入函数
在这里插入图片描述
看sub_4010F0函数:
这个a数组是空的,应该就是我们输入的字符串,然后有个if语句,排除了hex =10和13的字符(也就是‘/n’和‘/r’)
在这里插入图片描述
继续下一个函数sub_401050:
v0一看就是输入字符串的长度,然后v4不知道是啥,一个for循环,最后跟一个数组进行比较,所以最后的结果知道了
for循环:
将前一个字符与当前字符进行异或
在这里插入图片描述
看v4的函数:
ROL4:作用是循环左移(我其实还是不知道是啥)
在这里插入图片描述

动调一下,看看v4是啥:
先下个断点
在这里插入图片描述
在这里插入图片描述
运行到这里能看到是4,而且不管输入什么都是4
脚本:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    unsigned char a[] =
{
   0x0D,0x26,0x49,0x45,0x2A,0x17,0x78,0x44,0x2B,0x6C,0x5D,0x5E,0x45,0x12,0x2F,0x17,
0x2B,0x44,0x6F,0x6E,0x56,0x09,0x5F,0x45,0x47,0x73,0x26,0x0A,0x0D,0x13,0x17,0x48,
0x42,0x01,0x40,0x4D,0x0C,0x02,0x69
};
    char flag[40];
    int v4 = 4;
    int v0 = strlen(a);
for (int i = v0 - 1; i >= 0; --i )
  {
    flag[i] = v4 ^ a[i];
    v4 = flag[i];
  }
  for(int i = 0;i<v0;i++){
    printf("%c",flag[i]);
  }
	return 0;
}


[WUSTCTF2020]Cr0ssfun

先看ida:
只有一个函数:check,点进去
在这里插入图片描述
全是这种==的,那我感觉flag不就是这个吗
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    unsigned char a[] =
{
  119,99,116,102,50,48,50,48,123,99,112,112,95,64,110,100,95,114,51,118,101,114,115,101,95,64,114,101,95,102,117,110,125
};
  for(int i = 0;i<33;i++){
    printf("%c",a[i]);
  }
	return 0;
}

得到flag:在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值