MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘

文章目录

  • 前言
  • 0x1 base_64
  • 0x2 UPX!
  • 0x3Xor
  • 0x4 ANDROID
  • 0x5 RRRRRc4
  • 0x6 SMC
  • 0x7 EQUTION
  • 0x8 junk_code
  • 0x9 RUST
  • 后言

前言

MoeCTF是我学习Re以来接触的第一个比赛! 举办的很nice!
虽然我最后也没能完成ak,差三题aaa,不过moe对我的帮助真的很大,谢谢西电的各位师傅提供的机会;
(づ ̄3 ̄)づ╭❤~
明年看看有没有时间,akakak要ak一次才完整a!
附上:Github仓库题目下载

还差几题,有空补上,还需努力。

0x1 base_64

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第1张图片
打开来 是一个pyc文件,py是我反编译出来的;

pyc文件,可以用uncompyle6反编译,也可以找一些在线网站反编译;感觉俩个的缺点都很大,我迄今为止都没有一个可以稳定反编译的方法/(ㄒoㄒ)/~~;可能还是太菜了,刚刚复现这题时,用uncompyle6都反编译错误了,每次都要更换py版本(有没有佬教教’‘

uncompyle6的安装很简单:

pip install uncompyle6

使用也很简单:

uncompyle6 base_64.pyc>base_64.py

但是uncompyle6对py版本有要求,我的电脑环境上是3.9的可以运行,3.8和3.11都不行,可能也跟题目有关系;不太懂。
在线网站的话随便搜索就有很多,比较容易的题目就可以反编译,难点的一般不行;

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第2张图片
文件打开,就很简单了;一个标准的base64换表;

import base64

str1 = "yD9oB3Inv3YAB19YynIuJnUaAGB0um0="
string1 = "ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/"    #替换的表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))

# b'moectf{pYc_And_Base64~}'

0x2 UPX!

先查壳看看
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第3张图片
一个UPX壳,可以用UPX工具脱壳;
下面提示窗口try : upx.exe -d 表示的蛮清楚了
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第4张图片

拖入IDA中分析,Shift+F12搜索字符串,定位到flag
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第5张图片

发现这里做了异或运算。

就是用byte_140196数组和0x67异或就可以得到flag,

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第6张图片

0x3Xor

先用exeinfope查壳,无壳64bit;拖入ida中分析
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第7张图片

enc中的数据和0x39异或;
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第8张图片

0x4 ANDROID

apk文件,一开始也是折腾了蛮久的;安卓到现在也还学的比较少,用的JEB;
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第9张图片
这里就是用我们输入的flag和themoectf里面的依次循环异或,最后和enc相比
exp:

# 原始数据
arr = ['\u0019', '\u0007', '\u0000', '\u000E', '\u001B', '\u0003', '\u0010', '/', '\u0018', '\u0002', '\t', ':',
       '\u0004', '\u0001', ':', '*', '\u000B', '\u001D', '\u0006', '\u0007', '\f', '\t', '0', 'T', '\u0018', ':',
       '\u001C', '\u0015', '\u001B', '\u001C', '\u0010']
# 将 Unicode 字符串转换为字节数组
arrBytes = bytearray(ord(c) for c in arr)
# 加密密钥
key = "themoekey"
l = len(key)
flag = []
for i in range(len(arrBytes)):
    flag.append(chr((arrBytes[i] ^ ord(key[i % l]))))
print("".join(flag))

# moectf{Java_in_Android_1s_easy}

0x5 RRRRRc4

惯例先查壳,看一下文件信息,64bit无壳,用ida64分析
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第10张图片

Shift+F12查找关键字符串,交叉引用。分析一下伪代码,要求我们输入一个长度为37的字符串。

然后sub_140075052大概是对flag进行某种加密,接着for循环检查加密后的字符串是否与byte_140196000数组的值相同。相同即成功。
逆向一下,双击点开byte_140196000

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第11张图片
再看一下刚刚的加密函数。sub_140075052

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第12张图片

RC4加密的特征,俩个s盒。以及题目名称也可以确定是RC4加密。回开头找到rc4的密钥。v7
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第13张图片
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第14张图片

0x6 SMC

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第15张图片

代码量比较小,大概可以猜出函数各自的作用,一个printf和scanf;
sub_4011E0不知道是什么,点进去,

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第16张图片
这里就是对地址进行异或操作,也就是SMC代码自修改技术。
返回继续看if判断里的sub_401050,
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第17张图片
红色的JUMPOUT,出现错误了,0x4014D0也正是上一个smc函数进行修改的地址。
写一个idapython脚本patch一下。
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第18张图片

这个是解密之前,0x4014D0的样子
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第19张图片

解密之后:
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第20张图片
直接对黄色的部分 按c恢复成代码就好。之后再用p生成函数
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第21张图片

接着F5反编译,
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第22张图片

这里就是flag了。用我们输入的str做加法异或后跟byte比较。点进byte查看数据。exp如下
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第23张图片
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第24张图片

0x7 EQUTION

一道z3约束求解器的题目;折磨死我了当初;

查壳是无壳 64bit文件;
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第25张图片

下面总共九百多行都是这种格式的。全部在if判断里面,只要都成立,就是flag
用python的z3求解约束器。
把所有数据复制下来。然后修改整理。

exp:

from z3 import *
s = Solver()
v4 = [BitVec('u%d' % i,8) for i in range(0, 31)]
s.add(v4[0] == ord('m'))
s.add(v4[1] == ord('o'))
s.add(v4[2] == ord('e'))
s.add(v4[3] == ord('c'))
s.add(v4[4] == ord('t'))
s.add(v4[5] == ord('f'))
s.add( 334 * v4[28]+ 100 * v4[27]+ 369 * v4[26]+ 124 * v4[25]+ 278 * v4[24]+ 158 * v4[23]+ 162 * v4[22]+ 145 * v4[19]+ 27 * v4[17]+ 91 * v4[15]+ 195 * v4[14]+ 342 * v4[13]+ 391 * v4[10]+ 204 * v4[9]+ 302 * v4[8]+ 153 * v4[7]+ 292 * v4[6]+ 382 * v4[5]+ 221 * v4[4]+ 316 * v4[3]+ 118 * v4[2]+ 295 * v4[1]+ 247 * v4[0]+ 236 * v4[11]+ 27 * v4[12]+ 361 * v4[16]+ 81 * v4[18]+ 105 * v4[20]+ 65 * v4[21]+ 67 * v4[29]+ 41 * v4[30] == 596119)
s.add( 371 * v4[29]+ 338 * v4[28]+ 269 * v4[27]+ 312 * v4[26]+ 67 * v4[25]+ 299 * v4[24]+ 235 * v4[23]+ 294 * v4[22]+ 303 * v4[21]+ 211 * v4[20]+ 122 * v4[19]+ 333 * v4[18]+ 341 * v4[15]+ 111 * v4[14]+ 253 * v4[13]+ 68 * v4[12]+ 347 * v4[11]+ 44 * v4[10]+ 262 * v4[9]+ 357 * v4[8]+ 323 * v4[5]+ 141 * v4[4]+ 329 * v4[3]+ 378 * v4[2]+ 316 * v4[1]+ 235 * v4[0]+ 59 * v4[6]+ 37 * v4[7]+ 264 * v4[16]+ 73 * v4[17]+ 126 * v4[30] == 634009)
s.add( 337 * v4[29]+ 338 * v4[28]+ 118 * v4[27]+ 82 * v4[26]+ 239 * v4[21]+ 58 * v4[20]+ 304 * v4[19]+ 330 * v4[18]+ 377 * v4[17]+ 306 * v4[16]+ 221 * v4[13]+ 345 * v4[12]+ 124 * v4[11]+ 272 * v4[10]+ 270 * v4[9]+ 229 * v4[8]+ 377 * v4[7]+ 373 * v4[6]+ 297 * v4[5]+ 112 * v4[4]+ 386 * v4[3]+ 90 * v4[2]+ 361 * v4[1]+ 236 * v4[0]+ 386 * v4[14]+ 73 * v4[15]+ 315 * v4[22]+ 33 * v4[23]+ 141 * v4[24]+ 129 * v4[25]+ 123 * v4[30] == 685705)
s.add( 367 * v4[29]+ 55 * v4[28]+ 374 * v4[27]+ 150 * v4[24]+ 350 * v4[23]+ 141 * v4[22]+ 124 * v4[21]+ 366 * v4[20]+ 230 * v4[19]+ 307 * v4[18]+ 191 * v4[17]+ 153 * v4[12]+ 383 * v4[11]+ 145 * v4[10]+ 109 * v4[9]+ 209 * v4[8]+ 158 * v4[7]+ 221 * v4[6]+ 188 * v4[5]+ 22 * v4[4]+ 146 * v4[3]+ 306 * v4[2]+ 230 * v4[1]+ 13 * v4[0]+ 287 * v4[13]+ 257 * v4[14]+ 137 * v4[15]+ 7 * v4[16]+ 52 * v4[25]+ 31 * v4[26]+ 355 * v4[30] == 557696)
s.add( 100 * v4[29]+ 191 * v4[28]+ 362 * v4[27]+ 55 * v4[26]+ 210 * v4[25]+ 359 * v4[24]+ 348 * v4[21]+ 83 * v4[20]+ 395 * v4[19]+ 350 * v4[16]+ 291 * v4[15]+ 220 * v4[12]+ 196 * v4[11]+ 399 * v4[8]+ 68 * v4[7]+ 84 * v4[6]+ 281 * v4[5]+ 334 * v4[4]+ 53 * v4[3]+ 399 * v4[2]+ 338 * v4[0]+ 18 * v4[1]+ 148 * v4[9]+ 21 * v4[10]+ 174 * v4[13]+ 36 * v4[14]+ 2 * v4[17]+ 41 * v4[18]+ 137 * v4[22]+ 24 * v4[23]+ 368 * v4[30] == 538535)
s.add( 188 * v4[29]+ (v4[26] << 7)+ 93 * v4[25]+ 248 * v4[24]+ 83 * v4[23]+ 207 * v4[22]+ 217 * v4[19]+ 309 * v4[16]+ 16 * v4[15]+ 135 * v4[14]+ 251 * v4[13]+ 200 * v4[12]+ 49 * v4[11]+ 119 * v4[10]+ 356 * v4[9]+ 398 * v4[8]+ 303 * v4[7]+ 224 * v4[6]+ 208 * v4[5]+ 244 * v4[4]+ 209 * v4[3]+ 189 * v4[2]+ 302 * v4[1]+ 395 * v4[0]+ 314 * v4[17]+ 13 * v4[18]+ 310 * v4[20]+ 21 * v4[21]+ 67 * v4[27]+ 127 * v4[28]+ 100 * v4[30] == 580384)
s.add( 293 * v4[29]+ 343 * v4[28]+ 123 * v4[27]+ 387 * v4[26]+ 114 * v4[25]+ 303 * v4[24]+ 248 * v4[23]+ 258 * v4[21]+ 218 * v4[20]+ 180 * v4[19]+ 196 * v4[18]+ 398 * v4[17]+ 398 * v4[14]+ 138 * v4[9]+ 292 * v4[8]+ 38 * v4[7]+ 179 * v4[6]+ 190 * v4[5]+ 57 * v4[4]+ 358 * v4[3]+ 191 * v4[2]+ 215 * v4[1]+ 88 * v4[0]+ 22 * v4[10]+ 72 * v4[11]+ 357 * v4[12]+ 9 * v4[13]+ 389 * v4[15]+ 81 * v4[16]+ 85 * v4[30] == 529847)
s.add( 311 * v4[29]+ 202 * v4[28]+ 234 * v4[27]+ 272 * v4[26]+ 55 * v4[25]+ 328 * v4[24]+ 246 * v4[23]+ 362 * v4[22]+ 86 * v4[21]+ 75 * v4[20]+ 142 * v4[17]+ 244 * v4[16]+ 216 * v4[15]+ 281 * v4[14]+ 398 * v4[13]+ 322 * v4[12]+ 251 * v4[11]+ 357 * v4[8]+ 76 * v4[7]+ 292 * v4[6]+ 389 * v4[5]+ 275 * v4[4]+ 312 * v4[3]+ 200 * v4[2]+ 110 * v4[1]+ 203 * v4[0]+ 99 * v4[9]+ 21 * v4[10]+ 269 * v4[18]+ 33 * v4[19]+ 356 * v4[30] == 631652)
s.add( 261 * v4[29]+ 189 * v4[26]+ 55 * v4[25]+ 23 * v4[24]+ 202 * v4[23]+ 185 * v4[22]+ 182 * v4[21]+ 285 * v4[20]+ 217 * v4[17]+ 157 * v4[16]+ 232 * v4[15]+ 132 * v4[14]+ 169 * v4[13]+ 154 * v4[12]+ 121 * v4[11]+ 389 * v4[10]+ 376 * v4[9]+ 292 * v4[6]+ 225 * v4[5]+ 155 * v4[4]+ 234 * v4[3]+ 149 * v4[2]+ 241 * v4[1]+ 312 * v4[0]+ 368 * v4[7]+ 129 * v4[8]+ 226 * v4[18]+ 288 * v4[19]+ 201 * v4[27]+ 288 * v4[28]+ 69 * v4[30] == 614840)
s.add( 60 * v4[29]+ 118 * v4[28]+ 153 * v4[27]+ 139 * v4[26]+ 23 * v4[25]+ 279 * v4[24]+ 396 * v4[23]+ 287 * v4[22]+ 237 * v4[19]+ 266 * v4[18]+ 149 * v4[17]+ 193 * v4[16]+ 395 * v4[15]+ 97 * v4[14]+ 16 * v4[13]+ 286 * v4[12]+ 105 * v4[11]+ 88 * v4[10]+ 282 * v4[9]+ 55 * v4[8]+ 134 * v4[7]+ 114 * v4[6]+ 101 * v4[5]+ 116 * v4[4]+ 271 * v4[3]+ 186 * v4[2]+ 263 * v4[1]+ 313 * v4[0]+ 149 * v4[20]+ 129 * v4[21]+ 145 * v4[30] == 510398)
s.add( 385 * v4[29]+ 53 * v4[28]+ 112 * v4[27]+ 8 * v4[26]+ 232 * v4[25]+ 145 * v4[24]+ 313 * v4[23]+ 156 * v4[22]+ 321 * v4[21]+ 358 * v4[20]+ 46 * v4[19]+ 382 * v4[18]+ 144 * v4[16]+ 222 * v4[14]+ 329 * v4[13]+ 161 * v4[12]+ 335 * v4[11]+ 50 * v4[10]+ 373 * v4[9]+ 66 * v4[8]+ 44 * v4[7]+ 59 * v4[6]+ 292 * v4[5]+ 39 * v4[4]+ 53 * v4[3]+ 310 * v4[0]+ 154 * v4[1]+ 24 * v4[2]+ 396 * v4[15]+ 81 * v4[17]+ 355 * v4[30] == 558740)
s.add( 249 * v4[29]+ 386 * v4[28]+ 313 * v4[27]+ 74 * v4[26]+ 22 * v4[25]+ 168 * v4[24]+ 305 * v4[21]+ 358 * v4[20]+ 191 * v4[19]+ 202 * v4[18]+ 14 * v4[15]+ 114 * v4[14]+ 224 * v4[13]+ 134 * v4[12]+ 274 * v4[11]+ 372 * v4[10]+ 159 * v4[9]+ 233 * v4[8]+ 70 * v4[7]+ 287 * v4[6]+ 297 * v4[5]+ 318 * v4[4]+ 177 * v4[3]+ 173 * v4[2]+ 270 * v4[1]+ 163 * v4[0]+ 77 * v4[16]+ 25 * v4[17]+ 387 * v4[22]+ 18 * v4[23]+ 345 * v4[30] == 592365)
s.add( 392 * v4[29]+ 385 * v4[28]+ 302 * v4[27]+ 13 * v4[25]+ 27 * v4[24]+ 99 * v4[22]+ 343 * v4[19]+ 324 * v4[18]+ 223 * v4[17]+ 372 * v4[16]+ 261 * v4[15]+ 181 * v4[14]+ 203 * v4[13]+ 232 * v4[12]+ 305 * v4[11]+ 393 * v4[10]+ 325 * v4[9]+ 231 * v4[8]+ 92 * v4[7]+ 142 * v4[6]+ 22 * v4[5]+ 86 * v4[4]+ 264 * v4[3]+ 300 * v4[2]+ 387 * v4[1]+ 360 * v4[0]+ 225 * v4[20]+ 127 * v4[21]+ 2 * v4[23]+ 80 * v4[26]+ 268 * v4[30] == 619574)
s.add( 270 * v4[28]+ 370 * v4[27]+ 235 * v4[26]+ 96 * v4[22]+ 85 * v4[20]+ 150 * v4[19]+ 140 * v4[18]+ 94 * v4[17]+ 295 * v4[16]+ 19 * v4[14]+ 176 * v4[12]+ 94 * v4[11]+ 258 * v4[10]+ 302 * v4[9]+ 171 * v4[8]+ 66 * v4[7]+ 278 * v4[6]+ 193 * v4[5]+ 251 * v4[4]+ 284 * v4[3]+ 218 * v4[2]+ (v4[1] << 6)+ 319 * v4[0]+ 125 * v4[13]+ 24 * v4[15]+ 267 * v4[21]+ 160 * v4[23]+ 111 * v4[24]+ 33 * v4[25]+ 174 * v4[29]+ 13 * v4[30] == 480557)
s.add( 87 * v4[28]+ 260 * v4[27]+ 326 * v4[26]+ 210 * v4[25]+ 357 * v4[24]+ 170 * v4[23]+ 315 * v4[22]+ 376 * v4[21]+ 227 * v4[20]+ 43 * v4[19]+ 358 * v4[18]+ 364 * v4[17]+ 309 * v4[16]+ 282 * v4[15]+ 286 * v4[14]+ 365 * v4[13]+ 287 * v4[12]+ 377 * v4[11]+ 74 * v4[10]+ 225 * v4[9]+ 328 * v4[6]+ 223 * v4[5]+ 120 * v4[4]+ 102 * v4[3]+ 162 * v4[2]+ 123 * v4[1]+ 196 * v4[0]+ 29 * v4[7]+ 27 * v4[8]+ 352 * v4[30] == 666967)
s.add( 61 * v4[29]+ 195 * v4[28]+ 125 * v4[27]+ (v4[26] << 6)+ 260 * v4[25]+ 202 * v4[24]+ 116 * v4[23]+ 230 * v4[22]+ 326 * v4[21]+ 211 * v4[20]+ 371 * v4[19]+ 353 * v4[16]+ 124 * v4[13]+ 188 * v4[12]+ 163 * v4[11]+ 140 * v4[10]+ 51 * v4[9]+ 262 * v4[8]+ 229 * v4[7]+ 100 * v4[6]+ 113 * v4[5]+ 158 * v4[4]+ 378 * v4[3]+ 365 * v4[2]+ 207 * v4[1]+ 277 * v4[0]+ 190 * v4[14]+ 320 * v4[15]+ 347 * v4[17]+ 11 * v4[18]+ 137 * v4[30] == 590534)
s.add( 39 * v4[28]+ 303 * v4[27]+ 360 * v4[26]+ 157 * v4[25]+ 324 * v4[24]+ 77 * v4[23]+ 308 * v4[22]+ 313 * v4[21]+ 87 * v4[20]+ 201 * v4[19]+ 50 * v4[18]+ 60 * v4[17]+ 28 * v4[16]+ 193 * v4[15]+ 184 * v4[14]+ 205 * v4[13]+ 140 * v4[12]+ 311 * v4[11]+ 304 * v4[10]+ 35 * v4[9]+ 356 * v4[8]+ 23 * v4[5]+ 85 * v4[4]+ 156 * v4[3]+ 16 * v4[2]+ 26 * v4[1]+ 157 * v4[0]+ 150 * v4[6]+ 72 * v4[7]+ 58 * v4[29] == 429108)
s.add( 157 * v4[29]+ 137 * v4[28]+ 71 * v4[27]+ 269 * v4[26]+ 161 * v4[25]+ 317 * v4[20]+ 296 * v4[19]+ 385 * v4[18]+ 165 * v4[13]+ 159 * v4[12]+ 132 * v4[11]+ 296 * v4[10]+ 162 * v4[7]+ 254 * v4[4]+ 172 * v4[3]+ 132 * v4[0]+ 369 * v4[1]+ 257 * v4[2]+ 134 * v4[5]+ 384 * v4[6]+ 53 * v4[8]+ 255 * v4[9]+ 229 * v4[14]+ 129 * v4[15]+ 23 * v4[16]+ 41 * v4[17]+ 112 * v4[21]+ 17 * v4[22]+ 222 * v4[23]+ 96 * v4[24]+ 126 * v4[30] == 563521)
s.add( 207 * v4[29]+ 83 * v4[28]+ 111 * v4[27]+ 35 * v4[26]+ 67 * v4[25]+ 138 * v4[22]+ 223 * v4[21]+ 142 * v4[20]+ 154 * v4[19]+ 111 * v4[18]+ 341 * v4[17]+ 175 * v4[16]+ 259 * v4[15]+ 225 * v4[14]+ 26 * v4[11]+ 334 * v4[10]+ 250 * v4[7]+ 198 * v4[6]+ 279 * v4[5]+ 301 * v4[4]+ 193 * v4[3]+ 334 * v4[2]+ 134 * v4[0]+ 37 * v4[1]+ 183 * v4[8]+ 5 * v4[9]+ 270 * v4[12]+ 21 * v4[13]+ 275 * v4[23]+ 48 * v4[24]+ 163 * v4[30] == 493999)
s.add( 393 * v4[29]+ 176 * v4[28]+ 105 * v4[27]+ 162 * v4[26]+ 148 * v4[25]+ 281 * v4[24]+ 300 * v4[23]+ 342 * v4[18]+ 262 * v4[17]+ 152 * v4[12]+ 43 * v4[11]+ 296 * v4[10]+ 273 * v4[9]+ 75 * v4[6]+ 18 * v4[4]+ 217 * v4[2]+ 132 * v4[1]+ 112 * v4[0]+ 210 * v4[3]+ 72 * v4[5]+ 113 * v4[7]+ 40 * v4[8]+ 278 * v4[13]+ 24 * v4[14]+ 77 * v4[15]+ 11 * v4[16]+ 55 * v4[19]+ 255 * v4[20]+ 241 * v4[21]+ 13 * v4[22]+ 356 * v4[30] == 470065)
s.add( 369 * v4[29]+ 231 * v4[28]+ 285 * v4[25]+ 290 * v4[24]+ 297 * v4[23]+ 189 * v4[22]+ 390 * v4[21]+ 345 * v4[20]+ 153 * v4[19]+ 114 * v4[18]+ 251 * v4[17]+ 340 * v4[16]+ 44 * v4[15]+ 58 * v4[14]+ 335 * v4[13]+ 359 * v4[12]+ 392 * v4[11]+ 181 * v4[8]+ 103 * v4[7]+ 229 * v4[6]+ 175 * v4[5]+ 208 * v4[4]+ 92 * v4[3]+ 397 * v4[2]+ 349 * v4[1]+ 356 * v4[0]+ (v4[9] << 6)+ 5 * v4[10]+ 88 * v4[26]+ 40 * v4[27]+ 295 * v4[30] == 661276)
s.add( 341 * v4[27]+ 40 * v4[25]+ 374 * v4[23]+ 201 * v4[22]+ 77 * v4[21]+ 215 * v4[20]+ 283 * v4[19]+ 213 * v4[18]+ 392 * v4[17]+ 224 * v4[16]+ v4[15]+ 270 * v4[12]+ 28 * v4[11]+ 75 * v4[8]+ 386 * v4[7]+ 298 * v4[6]+ 170 * v4[5]+ 287 * v4[4]+ 247 * v4[3]+ 204 * v4[2]+ 103 * v4[1]+ 21 * v4[0]+ 84 * v4[9]+ 27 * v4[10]+ 159 * v4[13]+ 192 * v4[14]+ 213 * v4[24]+ 129 * v4[26]+ 67 * v4[28]+ 27 * v4[29]+ 361 * v4[30] == 555288)
s.add( 106 * v4[29]+ 363 * v4[28]+ 210 * v4[27]+ 171 * v4[26]+ 289 * v4[25]+ 240 * v4[24]+ 164 * v4[23]+ 342 * v4[22]+ 391 * v4[19]+ 304 * v4[18]+ 218 * v4[17]+ 32 * v4[16]+ 350 * v4[15]+ 339 * v4[12]+ 303 * v4[11]+ 222 * v4[10]+ 298 * v4[9]+ 47 * v4[8]+ 48 * v4[6]+ 264 * v4[4]+ 113 * v4[3]+ 275 * v4[2]+ 345 * v4[1]+ 312 * v4[0]+ 171 * v4[5]+ 384 * v4[7]+ 175 * v4[13]+ 5 * v4[14]+ 113 * v4[20]+ 19 * v4[21]+ 263 * v4[30] == 637650)
s.add( 278 * v4[29]+ 169 * v4[28]+ 62 * v4[27]+ 119 * v4[26]+ 385 * v4[25]+ 289 * v4[24]+ 344 * v4[23]+ 45 * v4[20]+ 308 * v4[19]+ 318 * v4[18]+ 270 * v4[17]+ v4[16]+ 323 * v4[15]+ 332 * v4[14]+ 287 * v4[11]+ 170 * v4[10]+ 163 * v4[9]+ 301 * v4[8]+ 303 * v4[7]+ 23 * v4[6]+ 327 * v4[5]+ 169 * v4[3]+ 28 * v4[0]+ 365 * v4[1]+ 15 * v4[2]+ 352 * v4[12]+ 72 * v4[13]+ 140 * v4[21]+ 65 * v4[22]+ 346 * v4[30] == 572609)
s.add( 147 * v4[29]+ 88 * v4[28]+ 143 * v4[27]+ 237 * v4[26]+ 63 * v4[24]+ 281 * v4[22]+ 388 * v4[21]+ 142 * v4[20]+ 208 * v4[19]+ 60 * v4[18]+ 354 * v4[15]+ 88 * v4[14]+ 146 * v4[13]+ 290 * v4[12]+ 349 * v4[11]+ 43 * v4[10]+ 230 * v4[9]+ 267 * v4[6]+ 136 * v4[5]+ 383 * v4[4]+ 35 * v4[3]+ 226 * v4[2]+ 385 * v4[1]+ 238 * v4[0]+ 348 * v4[7]+ 20 * v4[8]+ 158 * v4[16]+ 21 * v4[17]+ 249 * v4[23]+ 9 * v4[25]+ 343 * v4[30] == 603481)
s.add( 29 * v4[29]+ 323 * v4[26]+ 159 * v4[25]+ 118 * v4[20]+ 326 * v4[19]+ 211 * v4[18]+ 225 * v4[17]+ 355 * v4[16]+ 201 * v4[15]+ 149 * v4[14]+ 296 * v4[13]+ 184 * v4[12]+ 315 * v4[11]+ 364 * v4[10]+ 142 * v4[9]+ 75 * v4[8]+ 313 * v4[7]+ 142 * v4[6]+ 396 * v4[5]+ 348 * v4[4]+ 272 * v4[3]+ 26 * v4[2]+ 206 * v4[1]+ 173 * v4[0]+ 155 * v4[21]+ 144 * v4[22]+ 366 * v4[23]+ 257 * v4[24]+ 148 * v4[27]+ 24 * v4[28]+ 253 * v4[30] == 664504)
s.add( 4 * v4[29]+ 305 * v4[28]+ 226 * v4[27]+ 212 * v4[26]+ 175 * v4[25]+ 93 * v4[24]+ 165 * v4[23]+ 341 * v4[20]+ 14 * v4[19]+ 394 * v4[18]+ (v4[17] << 8)+ 252 * v4[16]+ 336 * v4[15]+ 38 * v4[14]+ 82 * v4[13]+ 155 * v4[12]+ 215 * v4[11]+ 331 * v4[10]+ 230 * v4[9]+ 241 * v4[8]+ 225 * v4[7]+ 186 * v4[4]+ 90 * v4[3]+ 50 * v4[2]+ 62 * v4[1]+ 34 * v4[0]+ 237 * v4[5]+ 11 * v4[6]+ 336 * v4[21]+ 36 * v4[22]+ 29 * v4[30] == 473092)
s.add( 353 * v4[29]+ 216 * v4[28]+ 252 * v4[27]+ 8 * v4[26]+ 62 * v4[25]+ 233 * v4[24]+ 254 * v4[23]+ 303 * v4[22]+ 234 * v4[21]+ 303 * v4[20]+ (v4[19] << 8)+ 148 * v4[18]+ 324 * v4[17]+ 317 * v4[16]+ 213 * v4[15]+ 309 * v4[14]+ 28 * v4[13]+ 280 * v4[11]+ 118 * v4[10]+ 58 * v4[9]+ 50 * v4[8]+ 155 * v4[7]+ 161 * v4[6]+ (v4[5] << 6)+ 303 * v4[4]+ 76 * v4[3]+ 43 * v4[2]+ 109 * v4[1]+ 102 * v4[0]+ 93 * v4[30] == 497492)
s.add( 89 * v4[29]+ 148 * v4[28]+ 82 * v4[27]+ 53 * v4[26]+ 274 * v4[25]+ 220 * v4[24]+ 202 * v4[23]+ 123 * v4[22]+ 231 * v4[21]+ 169 * v4[20]+ 278 * v4[19]+ 259 * v4[18]+ 208 * v4[17]+ 219 * v4[16]+ 371 * v4[15]+ 181 * v4[12]+ 104 * v4[11]+ 392 * v4[10]+ 285 * v4[9]+ 113 * v4[8]+ 298 * v4[7]+ 389 * v4[6]+ 322 * v4[5]+ 338 * v4[4]+ 237 * v4[3]+ 234 * v4[0]+ 261 * v4[1]+ 10 * v4[2]+ 345 * v4[13]+ 3 * v4[14]+ 361 * v4[30] == 659149)
s.add( 361 * v4[29]+ 359 * v4[28]+ 93 * v4[27]+ 315 * v4[26]+ 69 * v4[25]+ 137 * v4[24]+ 69 * v4[23]+ 58 * v4[22]+ 300 * v4[21]+ 371 * v4[20]+ 264 * v4[19]+ 317 * v4[18]+ 215 * v4[17]+ 155 * v4[16]+ 215 * v4[15]+ 330 * v4[14]+ 239 * v4[13]+ 212 * v4[12]+ 88 * v4[11]+ 82 * v4[10]+ 354 * v4[9]+ 85 * v4[8]+ 310 * v4[7]+ 84 * v4[6]+ 374 * v4[5]+ 380 * v4[4]+ 215 * v4[3]+ 351 * v4[2]+ 141 * v4[1]+ 115 * v4[0]+ 108 * v4[30] == 629123)

if s.check() == sat:
	ans = s.model()
	print(ans)
# 这里我不太会写py了,处理不来,就是报BitVecs类型错误;所以就手动了一下
flag = []
enc = [109, 111, 101, 99, 116, 102, 123, 121, 48, 117, 95, 115, 48, 108, 118, 51, 100, 95, 69, 117, 97, 116, 105, 48, 110, 115, 33, 33, 33, 125 ]
for i in range(len(enc)):
	flag.append(chr(enc[i]))
print("".join(flag))

# moectf{y0u_s0lv3d_Euati0ns!!!}

0x8 junk_code

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第26张图片
无壳,32bit文件;拖入ida32
junk_code 花指令,在代码中插入一些跳转or垃圾数据,作用是混淆反编译器。
博主总结过一点点花指令

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第27张图片

点开主函数,逻辑是sub_4591AE获得用户输入的长度为36的flag。if判断长度是否满足36,再一个if判断是否满足俩个条件,满足就输出congratulation。
点进去俩个判断函数;

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第28张图片
都是红色的JUMPOUT,说明反编译出问题了。
按tab到汇编界面,再按空格。

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第29张图片
这里有一个jz跳转到call,还有一大堆垃圾数据,是花指令。
修改call处的汇编为nop
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第30张图片
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第31张图片
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第32张图片
再对原来4605D0,p定义一下函数,发编译一下

MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第33张图片
就是前18位flag,意思是,将flag-5等于aHj数组。
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第34张图片

再看第二个函数,应该是后18位flag
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第35张图片

也是一样的操作,找到了俩个jz和jne互补跳转,和一堆垃圾数据,典型的花指令。
同样将call的汇编改为nop,再定义函数反编译
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第36张图片

Str1的内容和0x66异或就好
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第37张图片

0x9 RUST

这一题我应该是非预期解吧?我在github仓库上看到佬的wp,有点没看懂/(ㄒoㄒ)/~~

我的exp:

v25 = [
    0xE5, 0xE7, 0xED, 0xEB, 0xFC, 0xEE, 0xF3, 0xDA,
    0xFD, 0xFB, 0xFC, 0xD7, 0xFA, 0xED, 0xFE, 0xD7,
    0xFF, 0xE1, 0xE4, 0xE4, 0xD7, 0xEA, 0xED, 0xD7,
    0xE9, 0xFF, 0xEE, 0xFD, 0xB9, 0xF5
]
flag = []
for i in range(len(v25)):
    flag.append(chr(v25[i] ^ 0x88))
print("".join(flag))

# moectf{Rust_rev_will_be_awfu1}

怎么的得到的呢?Rust代码真的看的特别恶心,密密麻麻的还乱七八糟的,特别是对当初刚入门的我造成了极大的震撼。我其实也不知道怎么找的的。。。
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第38张图片
单纯就是什么也看不懂,所以就东点点西点点,每个函数都进去看一看,一直到这里有个xor和0x88引起了我的注意;这里一直点进去:
MoeCTF_2023新生赛 Reverse题解WP【详解】-(学习记录)‘‘_第39张图片
当时脑子里就蹦出来一个想法;然后就解出来了.感觉嗯挺好玩的hhhh。

大佬的wp我没看懂:感兴趣的可以上仓库去看看da大佬

后言

感觉时间过的好快,还记得坐在桌前刚接触moe的时候,每一题都可以折磨我好久,现在再复现码字的时候都时不时会用上“这是一个简单的”“简单的”。hhhh当初可不这么想,不过也都过来了,虽然现在还是菜的一批,只能写写入门题的程度吧,希望过多段时间也能对现在认为的难题说出”简单的“hh 加油 共勉;Moe赛高;

你可能感兴趣的:(CTF比赛WP,学习,网络安全,密码学,python,c语言)