2020网鼎杯第一场青龙组re部分wp
Posted basstorm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020网鼎杯第一场青龙组re部分wp相关的知识,希望对你有一定的参考价值。
一、Bang
拿到手是一个APK文件,打开看一下:
题目描述简单加壳,于是想到用frida脱壳脚本:
得到dex文件并用jeb打开:
可以看到直接得到了flag
二、Signal
vm题:
太长了,写个脚本模拟一下流程:(这里贴上最后的脚本,验证内容直接写了flag,为了验证正确性)
#include<iostream> #include<stdlib.h> using namespace std; unsigned char a[] = { 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xA7, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; int main() { int len; int v9=v8=v7=v6=v5=0,tmp; char *v3 = "757515121f3d478"; unsigned char v4[100]; len = sizeof(a); for(int v10=0;v10<len;) { switch(a[v10]) { case 1: cout<<"[*] v4[v7] = v5"<<endl; v4[v7] = v5; cout<<"v7="<<v7<<endl; cout<<"v4["<<v7<<"]="<<v5<<endl; v10+=4; ++v7; ++v9; break; case 2: cout<<"[*] v5 = a1[v10 + 1] + v3[v9]"<<endl; v5 = v3[v9] + a[v10 + 4]; printf("a1[v10+1]=%d ",a[v10+4]); tmp =v3[v9]; cout<<"v3[v9]="<<tmp<<endl; cout<<"v5="<<v5<<endl; v10+=8; break; case 3: cout<<"[*] v5 = v3[v9] - LOBYTE(a1[v10 + 1])"<<endl; v5 = v3[v9] - (a[v10 + 4]); printf("a1[v10+1]=%d ",a[v10+4]); tmp =v3[v9]; cout<<"v3[v9]="<<tmp<<endl; cout<<"v5="<<v5<<endl; v10+=8; break; case 4: cout<<"[*] v5 = a1[v10 + 1] ^ v3[v9]"<<endl; v5 = a[v10 + 4] ^ v3[v9]; printf("a1[v10+1]=%d ",a[v10+4]); tmp =v3[v9]; cout<<"v3[v9]="<<tmp<<endl; cout<<"v5="<<v5<<endl; v10+=8; break; case 5: cout<<"[*] v5 = a1[v10 + 1] * v3[v9]"<<endl; v5 = v3[v9] * a[v10 + 4]; printf("a1[v10+1]=%d ",a[v10+4]); tmp =v3[v9]; cout<<"v3[v9]="<<tmp<<endl; cout<<"v5="<<v5<<endl; v10+=8; break; case 6: cout<<"[*] ++v10"<<endl; cout<<"v10="<<v10<<endl; v10+=4; break; case 7: cout<<"[*] compare.."<<endl; cout<<"v8="<<v8<<endl; printf("v4[v8]=%d ",v4[v8]); printf("a1[v10+1]=%d ",a[v10+4]); ++v8; v10+=8; break; case 8: cout<<"[*] v3[v6] = v5"<<endl; v3[v6] = v5; cout<<"v3[v6]="<<v5<<endl; cout<<"v6="<<v6<<endl; v10+=4; ++v6; break; case 10: //read(v3); cout<<"[*] read"<<endl; v10+=4; break; case 11: cout<<"[*] v5 = v3[v9] - 1"<<endl; v5 = v3[v9] - 1; tmp =v3[v9]; cout<<"v3[v9]="<<tmp<<endl; cout<<"v5="<<v5<<endl; v10+=4; break; case 12: cout<<"[*] v5 = v3[v9] + 1"<<endl; v5 = v3[v9] + 1; tmp =v3[v9]; cout<<"v3[v9]="<<tmp<<endl; cout<<"v5="<<v5<<endl; v10+=4; break; default: continue; } } return 0; }
可以清楚的看到运算过程,之后再逆着推一遍就可以了。
三、Joker
这道题是个代码自修改的题目。
看到
修改了代码段的encrypt函数,又看到下面进行了异或操作:
简单修复后F5查看:
经过分析,wrong函数和omg函数没有用。
encrypt函数把输入和hahahaha_do_you_find_me?异或,与dword_403040比较
写py:
可以看到少了后面几位,看下一个函数:
这个函数逻辑明显有问题。。。
X32dbg看这里是time(0)
而且
这里对于v8的操作也没有正确反编译。
后来想到字符串中的提示:
隐藏了后面几位,并且不会成功,暗示着这个函数就是有问题的。
但是flag格式是固定的flag{}
所以根据最后一位是}来推断,与
逐位异或71
所以得到了后面几位:b37a}
完整拼接后得到flag{d07abccf8a410cb37a}
以上是关于2020网鼎杯第一场青龙组re部分wp的主要内容,如果未能解决你的问题,请参考以下文章
Java安全-Java In CTF([网鼎杯 2020 青龙组]filejava[网鼎杯 2020 朱雀组]Think Java)