D0g3比赛平台 re wp
最近几天都在看题吧,xctf和极客巅峰都看了看,xctf做了一道re签到题,学了点x64汇编,后面的两道题大概尽量分析了下,对win32窗口和动调更熟悉了。极客巅峰的话做了一道re签到题,rc4+xxtea的apk,给了x86的so文件就是香。maze逻辑倒是不难,就是不会写脚本,用pexpect模块写交互或者用pwn交互,准备后面注重写代码能力,学习数据结构。
XCTF-CyBRICS 2021 Listing
asm,64位汇编,AVX2指令,直接看是可以看懂逻辑的,但是由于对64位汇编了解太少,不知道具体过程(什么顺序放入的256bit寄存器),后来一想,可以直接放到x64dbg里面调呀,直接就把指令随便弄到一个exe里面了(64位内敛汇编还不知道怎么弄)。
直接上图
有个指令需要说一下,vpshufb,相当于就是换位置,类似下面的过程,只不过是256bit。
写脚本
1 |
|
极客巅峰 medical_app
3血,apk,so层的chr是检测函数,rc4+改dealt的xxtea,题很简单主要是说说怎么调so文件,由于设备有限,只能用模拟器调调x86的so文件。参考文章https://www.cnblogs.com/ddms/p/8820044.html,https://blog.csdn.net/freeking101/article/details/106701908
1.打开雷电模拟器,这道题比较特别,屏幕大小设置成1600*900才打得开这个apk。
2.用https://www.cnblogs.com/ddms/p/8820044.html文章中的方法,向模拟器中传入android_x86_server。
android_server,和android_server64是真机用的,android_x86_server,和android_x64_server是模拟器用的。
3.用adb链接模拟器。
adb kill-server 这句的意思是终止adb服务
adb devices 意思是查看现在所连接的设备 如果adb服务没开会帮你打开
adb shell 就是拿到设备的shell了
adb forward tcp:23946 tcp:23946 端口转发
4.打开ida,Debugger->Attach->Remote Linux debugger,写本地ip,127.0.0.1,然后ok。选择好要链接的名称,找到so文件名称,找到函数,打断点,f9,然后在模拟器中输入字符串,就发现断了下来。
之前失败的原因是设备对应不上或者是debugger选择错了,真机和模拟器是有区别的,题可能会给4个so文件,就是对应了不同的架构,但是一般都只给一个arm64-v8a,要用root真机。。。。
x86 32位 android_x86_server Remote Linux debugger 32位模拟器
x86_64 64位 android_x32_server Remote Linux debugger 64位模拟器
armeabi-v7a 32位 android_server Remote ARM Linux/Android debuggber 32位真机
arm64-v8a 64位 android_server64 Remote ARM Linux/Android debuggber 64位真机
直接上解题脚本
1 |
|
1 |
|
极客巅峰 easymaze
学了数据结构dfs,现在照着学长的思路回来做做,我用的是pwn库交互,学长用的pexpect
将成功判断都改为”1”
exp,python的二维数组真的坑,看了几个小时,发现是二维数组定义错了。
1 |
|
极客巅峰 so get
一道web&re,当时队友getshell后的文件没给对,哈哈,后面看师傅的wp才知道是哪几个文件,看来得学点web了。。。大概就是用aes加密了php文件,这种加密php,记得一个老师傅还做过讲解。
easy re
ida看看逻辑,就是基础的操作
z3来解
1 |
|
c语言
1 |
|
basebase
签到题,变表base
1 |
|
junkcode
这道题,出题人插入了一些汇编,影响了程序逻辑,f5的逻辑是错的,直接撸汇编,看加密过程。
写脚本
1 |
|
funny
apk,jeb打不开,不知道是不是设置了什么,但是可以通过分析解压后的class.dex来看加密逻辑,发现是flag先异或后bit位操作,然后加上md5加密flag组成的字符串。
解包指令java -jar .\apktool_2.3.0.jar d .\app-debug.apk -o QKSword
,查看id发现,对应名称为v,然后找到字符串v=”vNIfOQtJIkznEF7117D32B97D82C0607A3A06E7C78C6”
再来看加密函数
了解了加密函数后,通过密文可知道flag有12位,格式又是D0g3{},如果采用爆破来解的话就只用爆破6个字符。但是由于之前做的时候没意识到那个表有多义性,用z3试了试,没解出来,后来发现有多义性后,懒得写md5爆破,就将就了z3,一个一个字符爆嘛,没爆出来就换下表里面的值。
1 |
|
当然,这肯定不是出题人想要的,而且如果字符多一点也没法这样做,所以还是得正常md5爆破。
1 |
|
random
考点,Debug Blocker,双进程保护,win32知识,类似于mrctf的一道题。查windows api的网站http://www.yfvb.com/help/win32sdk/,https://docs.microsoft.com/en-us/search/
去花后,分析主函数
对于双进程保护,两种处理方法,https://blog.csdn.net/qq_39249347/article/details/108579376
- 静态方法,父进程对子进程处理解密后(有些子进程的代码可能是被加密的),直接将ip跳到子进程,调试子进程。
- 动态方法,比较麻烦,要改汇编这些什么的,让父进程和子进程断开,将我们的调试器和子进程连起来。
这里就采用第一种方法直接在3E1736地址set ip,动调出逻辑。
然后true_main主要分为4步
1.通过rand(),生成16个数。
1 |
|
2.将flag前16个和rand()的16个数异或
1 |
|
3.flag后16位和原flag前16位异或
1 |
|
4.和key[32]相减
1 |
|
要解这道题呢,由于我们知道flag格式D0g3{},我们就可以通过爆破seed,也就是我们guess的数。
1 |
|