XCTF-Exercise-Jump-进阶区

XCTF-Exercise-Jump-进阶区,第1张

XCTF-Exercise-Jump-进阶区

目录

006-GUess-The-Number

042-76号-Obfuse-类型

43-APK-逆向


006-GUess-The-Number

java环境配置反正就一个安装罢了...其余的真的没什么了

    "这里的cmd *** 作"
  -->输入  java -jar 路径 参数

一个软件

jd-gui-1.6.6.jar

可以打开 .class文件

python解题脚本

a=0x04b64ca12ace755516c178f72d05d7061
b=0xecd44646cfe5994ebeb35bf922e25dba
print(hex(a^b))

源码

import java.math.BigInteger;
​
public class guess {
  static String XOR(String _str_one, String _str_two) {"这里是一个函数"
    BigInteger i1 = new BigInteger(_str_one, 16);"将字符串0x1234它转化为16机制0x1234"
    BigInteger i2 = new BigInteger(_str_two, 16);
    BigInteger res = i1.xor(i2);
    String result = res.toString(16);
    return result;
  }
  
  public static void main(String[] args) {
    int guess_number = 0;
    int my_num = 349763335;
    int my_number = 1545686892;
    int flag = 345736730;
    if (args.length > 0) {
      try {
        guess_number = Integer.parseInt(args[0]);
        if (my_number / 5 == guess_number) {"这里有一个判断(my_number / 5 == guess_number)我们主动去让他==.算出my_number / 5为多少"
          String str_one = "4b64ca12ace755516c178f72d05d7061";
          String str_two = "ecd44646cfe5994ebeb35bf922e25dba";
                                            "C语言我不会处理这么大的数,用python要简单些"
          my_num += flag;
          String answer = XOR(str_one, str_two);"将2者xor"
          System.out.println("your flag is: " + answer);
        } else {
          System.err.println("wrong guess!");
          System.exit(1);
        } 
      } catch (NumberFormatException e) {
        System.err.println("please enter an integer nexample: java -jar guess 12");
        System.exit(1);
      } 
    } else {
      System.err.println("wrong guess!");
      int num = 1000000;
      num++;
      System.exit(1);
    } 
  }
}
​

知识

 1.
 BigInteger i2 = new BigInteger(_str_two, 16);
 表示把一个1234 转化为 hex 0x1234
 2.
 打开class文件的 *** 作
    "这里的cmd *** 作"
  -->输入  java -jar 路径 参数
 3.
 pythob可以很好的处理非常大的数据
 4.
     python语法,把数据转16进制
     print(hex(a^b))
 


042-76号-Obfuse-类型

问题细节题 / 汇编代码

1.找不到函数入口点 [ 为什么输入函数在(start)的上面 ]

2.对那个flag_check函数不知道怎么逆向推flag_

就太多switch到底哪个是退出.....

首先找到Getline函数在哪里

为什么找它?

为什么会有Getline?

Linux调试喊你输入Password,,,你总得找一下哪里输入吧

好比scanf

于是就去找吧

这个你到处窜上传下就知道这个位置与这个函数....我反正没看见,

主要是不知道为什么他会出现在start的上面

.text:0804846A E8 51 FF FF FF                          call    _getline

这个嘛....

反正Ctrl + X 找不到位置

它在函数start的上面,woc

你发现它无法反汇编Tab

.text:08048467 89 04 24                                mov     [esp], eax
.text:0804846A E8 51 FF FF FF                          call    _getline
.text:0804846F 85 C0                                   test    eax, eax
.text:08048471 89 C3                                   mov     ebx, eax
.text:08048473 78 1A                                   js      short loc_804848F
.text:08048475 8B 44 24 1C                             mov     eax, [esp+1Ch]
.text:08048479 C7 44 24 04 00 00 00 00                 mov     dword ptr [esp+4], 0
.text:08048481 89 04 24                                mov     [esp], eax
.text:08048484 E8 F7 00 00 00                          call    sub_8048580
.text:08048489 85 C0                                   test    eax, eax
于是你就输入,然后进入那个函数

.text:08048484 E8 F7 00 00 00                          call    sub_8048580

你可以发现你可以Tab了

于是就进去呗

多的不讲....谈一下我们要注意的地方,也是要点吧

1.

首先是这个switch到底讲的啥

A.

BUff_Input = input[i];
"你的Input是swith的那个case
BUtton[(BUff_Input + 64) % 128] = 1;
"你的input让特定位置的0变成了1

B.

注意一下返回值类型

_BOOL4 __cdecl sub_8048580(char *input, int i)

说明这个函数的返回值就是一个Button

C.

注意一下Switch说明时候return 到想要返回值

case 106:
        if ( i != 10 || !BUtton[42] )
          return 0;

里面的大多数返回值都是0

说明0不能返回

同时那个 [ IF ]也通常不会满足

否者大家都return 0 了

然后就是这个case,返回的是 1

说明这里就是终点

case 107:
        return i == 12 && BUtton[43] != 0;

说明有13位flag

另外说明一下

他的每一个

 case 119:
        if ( i != 6 || !BUtton[55] )
          return 0;
        i = 7;
        break;

 

BUtton[55] 与 i != 6 都是对应的

因为这个呀

BUff_Input = input[i]; BUtton[(BUff_Input + 64) % 128] = 1;

D.

然后就是它是怎么推动你的检验的

好比

I=0,检验第一位

i=2,检验第3位

 case 51:
        if ( i != 89 || !BUtton[115] )
          return 0;
        i = 90;

你会发现,不满足条件就直接通过赋值跳转到下一位

这也是一个推动

另外就是

case 102:
        if ( !BUtton[38] || i != 8 && i != 4 )
          return 0;
        goto LABEL_53;
...
LABEL_53:
        ++i;
        continue;
这里跳转到LABEL后就直接++i,就continue,运行下一次循环了,就光一个自加的 *** 作

如何解题?

Way-!

直接在IDA里面看

0,1,2,3,4,,5...12

ase 102:
        if ( !BUtton[38] || i != 8 && i != 4 )
          return 0;
        goto LABEL_53;

有那些,吧input给手抄下来,,可能比较快,因为就13位

里面有个

所以它到底是[4]还是[8]?

都是...4也是它,8也是它

于是就是手写

Way-2

代码暴力破解..还是比较麻烦的....太多case了

下面2个case的脚本看看

#include
#include

int main()
{
	char BUtton[1024];
	for(int i=0;i<13;i++)
		for(int in=0;in<128;in++)
		{
			BUtton[(in + 64) % 128] = 1;
			if(i==3)
				if(in=='d')
	        		if (( i != 3 || !BUtton[36] ) == 0){
		        		printf("flag[%d]='%c'n",i,in);
		        		break;
		        	}	
	        if(i==7)
				if(in=='e')
					if(( i != 7 || !BUtton[37] )==0){
						printf("flag[%d]='%c'n",i,in);
						break;
					}
						
		}
		system("pause");
}

结果

flag[3]='d'
flag[7]='e'
请按任意键继续. . .

我本来就只列了2个case

太麻烦了

Way-3

用Z3吧..个人人为还不如手抄......

但是以后还是要用的,因为不是all的都是13位

小结一下

函数入口点?只有汇编的情况下是要到处看汇编的,然不断F7与F8去看看,函数停在了哪里

后现在可疑点,在去Tab看看

多注意一下函数返回值的类型

还有参数的类型

char

int.

..unsigned int

Dword

一些函数真的靠眼力,去发现他的差异再去突破

43-APK-逆向

用Die打开,说是C#.net

于是用dnSpy打开exe,而不是IDA

打开后

 

cmp="Super Secret Key"
data=open('1.exe','r',encoding = 'unicode-escape').read()			#新 *** 作之文件字节码编码,exe文件中是unicode编码
length=len(data)

flag="CTF{"

def search(x,data,length):
	for i in range(length):
		if x==data[i]:
			rusult=i * 1337 % 256;
			return '%02x' %rusult										#新 *** 作之return直接返回print语句

for q in cmp:
	flag+=search(q,data,length)


flag+="}"
print(flag)
#CTF{7eb67b0bb4427e0b43b40b6042670b55}

					
										


					

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5671313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存