qwbctf re

二次自闭

强网先锋

base64后直接比较
可以直接下断点后看栈中的值,base在线解一下出flag

just_re

ida打开可以发现逻辑并不复杂
1
验证分为俩个
第二个进去什么都没
查看汇编可以猜出有smc的操作

先进入第一个看下
2
调试可以发现主要是验证输入的前10个字符
把前八个转化为一个unsigned int
还有俩也是
进行一段验证操作
上面有一段xmmword_的看不懂但是没有关系
下面验证的32为足够解出答案了
用z3解一下

1
2
3
4
5
6
7
8
9
10
from z3 import *
a = [659593944,663789525,51647302,207884977,4277163693,52128309,2387884190,22803995]
b = [608471104,612666700,508,256901226,472138769,1005800,2369808896,38282372]
s = Solver()
x = BitVec('x',32)
y = BitVec('y',32)
for i in range(len(a)):
s.add(b[i] == (x + i + 16)^(0x1010101*y + a[i]))
print s.check()
print s.model()

前10个输入为
1324229810

过了第一个验证就可以看下第二个了
第二个是一个原装的3des
密钥可以在内存中看到
3
最后验证比较的值找个网站在线解一下就出来答案了
4
输入应为
0dcc509a6f75849b

5

web_assembly

wasm的逆向
第一次遇到还是在hgame里面
这次还是没有写出来
但起码大概知道方法了
首先拿到题目肯定是反编译成c么
用wasm2c
然后再次编译后用ida打开可以进行初步的静态分析
一般搜索字符串是发现不了的
用16进制编辑器打开wasm可以看到字符串都在文件的末尾
再结合ida静态分析后可以大概初步猜出
比如这题
6
放进ida后可以大概看到逻辑
主函数call了俩
然后就是动态调试了
可以用chorme
7
左边是函数窗口
这边我不知道怎么搜索main
//firefox可以
所以写的话可以先放进firefox里搜索一下main
定位是func几
比如这题是func16
然后放进chorme里找到func16就能下断点调试了
一般的话,这题目,主函数只有俩次call
就可以把断点下在俩个call上
调试可以发现第一个call就是录入
可以忽略
主要看第二个
可以看见明显的比较函数
还有最后的验证
8
最后的验证通过看他们的偏移可以知道第一个是成功
第二个是失败
前面的话是一堆xor其实就是验证是否相等
加密部分是xtea
解一下就行了
需要注意的是这边都是dword
9
解出来答案是flag{1c15908d00762edf4a0dd7ebbabe68bb}

设备固件逆向

u~u
这题还没弄完。。。。大致可以知道怎么弄了
主要是qemu
装不上啊
qemu-mips用不了。。。。
题目给了一个ext4的文件,直接挂载后把hello提取出来
放进ida静态分析是可以了
因为不怎么了解mips
必须要结合调试才能写‘猜’出这题
没办法只好先放着了
~’'
动态调试硬是没有弄成
先来一波静态分析吧
顺便熟悉一波retdec

文章目录
  1. 1. 强网先锋
  2. 2. just_re
  3. 3. web_assembly
  4. 4. 设备固件逆向
|