目录
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}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)