刮开有奖
这题写的比较抽象(刚刚开始学re)
感觉没有明显的字符串的提示,最后的flag都有种猜的感觉
首先在main函数种找到flag藏的关键位置
看到这里有可疑的字符串,基本上就可以确定flag在这里有,起码部分是有的
点开 sub_4010F0函数,发现是一个排序的函数
这里把伪代码转换成c语言
int __cdecl sub_4010F0(char *a1, int a2, int a3)
{
int result; // eax
int i; // esi
int v5; // ecx
int v6; // edx
result = a3;
for ( i = a2; i <= a3; a2 = i )
{
v5 = i;
v6 = i[a1];
if ( a2 < result && i < result )
{
do
{
if (v6 > (a1[result] ))
{
if ( i >= result )
break;
++i;
a1[v5] = a1[result];
if ( i >= result )
break;
while ( a1[i]<= v6 )
{
if ( ++i >= result )
goto LABEL_13;
}
if ( i >= result )
break;
v5 = i;
(a1[result]) = (a1[i]);
}
--result;
}
while ( i < result );
}
LABEL_13:
(a1[result]) = v6;
sub_4010F0(a1, a2, i - 1);
result = a3;
++i;
}
return result;
}
注意伪代码的反汇编有些地址和数组之间的转换还是要注意的
把上面的字符串填进去得到
接着进入sub_401000这个函数,仍入ai发现是base64编码
放到赛博厨子里面
此时,我们只要做最后的flag拼接就好了
注意这里的v8 v13 v7都是换完顺序后的编码
a=chr(ord('3') + ord('\x22'))
print(a)
a=chr((ord('\x8D')+3*ord('\x45'))//4)
print(a)
b=chr(int(ord('Z')/9)*8)
print(b)
最后因为WP这两个字符出现了所以我们可以去先拼接第二个base64出来的字符串得到flag{UJWP1jMp}
[ACTF新生赛2020]easyre
[【每日逆向】BUUCTF–ACTF新生赛2020] easyre (mfbz.cn)
首先这个需要脱壳,万能脱壳秒了
接着我们打开ida
把在前面的字符按y整理一下
这里是一个映射的关系
点进去可以找到对应的表,因为我们是逆向flag,所以问你只需+1找对应的表
key='~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
encrypt=[42,70,39,34,78,44,34,40,73,63,43,64]
x=[]
flag=''
for i in encrypt:
x.append(key.find(chr(i))+1)
for i in x:
flag+=chr(i)
print(flag)
简单注册器
chatgpt可以直接写出这题,卡在这题的可以去问问ai
这是个安卓逆向
用jadx打开软件
public void onClick(View v) {
int flag = 1;
String xx = editview.getText().toString();
if (!(xx.length() == 32 && xx.charAt(31) == 'a' && xx.charAt(1) == 'b' && (xx.charAt(0) + xx.charAt(2)) - 48 == 56)) {
flag = 0;
}
if (flag == 1) {
char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray();
x[2] = (char) ((x[2] + x[3]) - 50);
x[4] = (char) ((x[2] + x[5]) - 48);
x[30] = (char) ((x[31] + x[9]) - 48);
x[14] = (char) ((x[27] + x[28]) - 97);
for (int i = 0; i < 16; i++) {
char a = x[31 - i];
x[31 - i] = x[i];
x[i] = a;
}
textview.setText("flag{" + String.valueOf(x) + "}");
return;
}
可以看到。这里对flag进行了加密之类的
我们用python还原一下代码
def generate_flag():
x = list("dd2940c04462b4dd7c450528835cca15")
# 按照 Java 代码修改字符
x[2] = chr((ord(x[2]) + ord(x[3])) - 50)
x[4] = chr((ord(x[2]) + ord(x[5])) - 48)
x[30] = chr((ord(x[31]) + ord(x[9])) - 48)
x[14] = chr((ord(x[27]) + ord(x[28])) - 97)
# 反转前 16 位字符
for i in range(16):
x[i], x[31 - i] = x[31 - i], x[i]
return "flag{" + "".join(x) + "}"
print(generate_flag())
) + ord(x[9])) - 48)
x[14] = chr((ord(x[27]) + ord(x[28])) - 97)
# 反转前 16 位字符
for i in range(16):
x[i], x[31 - i] = x[31 - i], x[i]
return "flag{" + "".join(x) + "}"
print(generate_flag())