年轻人的第一篇writeup

年轻人的第一篇writeup

零:前言

第一次接触CTF比赛,真好玩!

进入正题:

一:WEB

实在是毫无基础 勉强做了前三个

1. 签到题

浏览器进入http://172.22.145.49:49500 , 打开Fiddler抓包,get flag!

001

2. 请知法懂法守法

浏览器进入http://172.22.145.49:49502/

002

发现是一条SQL语句:学了下最简单的SQL注入

003

get flag!

3. 冷漠的复读机

  • 浏览器进入http://172.22.145.49:49495/ 根据hint按了f12发现了
  • 复读机
  • 005
  • 输入刚才得到的东西
  • 006
  • 发现 script 标签被过滤了,重新构建

  • 007

get flag!

二:REVERSE

来到了我最喜欢的REVERSE环节

1. reverse 1

直接把exe放到ida里面 找到关键函数 按f5看c语言代码

008

大概逻辑是根据输入然后与Str2对比

双击Str2 009

发现对比前对Str2做了一波操作 用Java操作一下

010

011

get flag!

2. reverse 2

照旧用ida打开 发现逻辑跟第一题差不多 但flag是个char

012
双击flag 按照代码是把flag和后面的字符串连起来 013

0x7B ASCII码对应的字符就是’{‘ 连起来就是“{hacking_for_fun}”
然后放到java里操作一下
014
015

get flag!

3. Easy_CrackMe

  • 惯例:016

可以发现 对输入的内容做了系列对比 看了一下变量的内存布局 以及对应的字符串

017

018

综合代码 进行的对比: 第二位是97('a')  第三四位是'5y' 后面一堆是'R3versing'  第一位是69('E')
连起来'Ea5yR3versing' 验证一下

019

get flag!

4. reverse 3

发现是.class文件 又到了我第二喜欢的Java部分了 :)

放到idea里面 把代码复制出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import java.util.ArrayList;
import java.util.Scanner;

public class Reverse {
public Reverse() {
}

public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Please input the flag :");
String str = s.next();
System.out.println("Your input is :");
System.out.println(str);
char[] stringArr = str.toCharArray();
Encrypt(stringArr);
}

public static void Encrypt(char[] arr) {
ArrayList<Integer> Resultlist = new ArrayList();

for(int i = 0; i < arr.length; ++i) {
int result = arr[i] + 64 ^ 32;
Resultlist.add(result);
}

int[] KEY = new int[]{180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65};
ArrayList<Integer> KEYList = new ArrayList();

for(int j = 0; j < KEY.length; ++j) {
KEYList.add(KEY[j]);
}

System.out.println("Result:");
if (Resultlist.equals(KEYList)) {
System.out.println("Congratulations!");
} else {
System.err.println("Error!");
}

}
}

逻辑就是对输入的字符串进行加密操作 最终让每一位等于KEY里的每一位

逆操作一下 get flag!020

5. reverse 4

来到了我最爱的Android部分 :)

二话不说先安装上再说



操作一番 发现要在输入框输入正确的密码(只能是整型)
用dex2jar 反编译 然后放进idea

找到熟悉的MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package net.bluelotus.tomorrow.easyandroid;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("lhm");
}

public MainActivity() {
}

public native int chec(int var1, int var2);

public int check(int var1, int var2) {
return this.chec(var1, var2);
}

public int check1(int var1, int var2) {
byte var4 = 1;
int var3 = var1;

for(var1 = var4; var1 < 100; ++var1) {
var3 += var1;
}

return this.chec(var3, var2);
}

public int check2(int var1, int var2) {
int var3;
byte var4;
if (var2 % 2 == 0) {
var4 = 1;
var3 = var1;

for(var1 = var4; var1 < 1000; ++var1) {
var3 += var1;
}

return this.chec(var3, var2);
} else {
var4 = 1;
var3 = var1;

for(var1 = var4; var1 < 1000; ++var1) {
var3 -= var1;
}

return this.chec(var3, var2);
}
}

public int check3(int var1, int var2) {
byte var4 = 1;
int var3 = var1;

for(var1 = var4; var1 < 10000; ++var1) {
var3 += var1;
}

return this.chec(var3, var2);
}

public String messageMe(String var1) {
return "LoopOk" + var1;
}

protected void onCreate(Bundle var1) {
super.onCreate(var1);
this.setContentView(2130968600);
Button var4 = (Button)this.findViewById(2131492946);
final TextView var2 = (TextView)this.findViewById(2131492945);
final TextView var3 = (TextView)this.findViewById(2131492947);
var4.setOnClickListener(new OnClickListener((EditText)this.findViewById(2131492944)) {
{
this.val$ed = var2x;
}

public void onClick(View var1) {
String var4 = this.val$ed.getText().toString();

int var2x;
try {
var2x = Integer.parseInt(var4);
} catch (NumberFormatException var3x) {
var2.setText("Not a Valid Integer number");
return;
}

if (MainActivity.this.check(var2x, 99) == 1835996258) {
var2.setText("The flag is:");
var3.setText("alictf{" + MainActivity.this.stringFromJNI2(var2x) + "}");
} else {
var2.setText("Not Right!");
}
}
});
}

public boolean onCreateOptionsMenu(Menu var1) {
this.getMenuInflater().inflate(2131558400, var1);
return true;
}

public boolean onOptionsItemSelected(MenuItem var1) {
return var1.getItemId() == 2131492961 ? true : super.onOptionsItemSelected(var1);
}

public native String stringFromJNI2(int var1);
}

核心代码在这里22

对输入的值进行check()方法 只有返回值是1835996258时 输出flag(

发现check()实际上调用的时native层的方法 而且flag的中间部分也来自native层 于是反编译.so库 放进ida

先看了一下stringFromJni 想直接破解感觉难度有点大。。。

023

看看check方法

024

分析一下 : v10,v11,v12分别是Java层的三个方法 而具体调用拿一个取决于 (2 * v8 % 3), v8就是这个函数的第二个参数

025

再看java层的三个check方法: 都是对参数进行一系列运算后再作为参数掉用native层的check方法(疯狂递归)
懒得逆推了 直接把native的check搬运到Java层 模拟一下整个流程

026

然后 祭出大杀器(疯狂穷举)233 幸好发现了规律(不然怕是要穷举几天)(有空了试着逆推一下) 然后 get flag!

027

三:PWN

又是完全不会的东西 现学了一点点

1. so easy overflow

和标题一样,真的so easy(flag直接放在可执行文件里了233)

还是试着栈溢出攻击一下
分析代码 要让buf把v5覆盖了,并且让其值不为0

计算一下 0x20-0x04 = 28

操作一下

get flag!

2. do you know hc?

先反编译文件

031

分析代码 让buf覆盖掉 v6 并且让其等于30509735931504751 就可以弹出bash

032

计算一下 0x3A-0x08 = 50

然后打包一下那个long

得到ohctqdl

现在可以用pwntools操作了

34

get flag!

四:MISC

最好玩的MISC :_)

1. 真正的签到题

  • 下载打开 得到 ZmxhZ3tub3dfVV9zMWduXzFufQ==
  • 很明显的base64 百度base64解码 flag{now_U_s1gn_1n}
  • get flag!

2. Android

  • 下载apk 安装 咦 怎么安不上 ?看了眼题目提示(Is this an apk?) 懂了
  • 改后缀zip,解压 res目录下发现 flag : flag{o_Android_apk_is_zip}
  • get flag!

3. K同学与编码

  • 试了半天 原来还是base64。。。
  • 35

  • html转义得到

    %66%6c%61%6 7%7b%49%5f%61%6c%77%61%79%73%5f%68%61%74%65%5f%63%72%79%70%74%6f%67%72%61%70%68%79%7d

  • urldecode一波 flag{I_always_hate_cryptography}

  • get flag!

4. 超级加倍

  • 4次base64解密。。。。
  • 0xfa{5UpEr_b0Om_bA5e64}
  • 完事!

5. 贪玩苍月

  • 关键在all.js里面
  • 经过一番调试后找到第252行
  • 036
  • 把alert(s2333)移到两层if外面 再砍个西瓜
  • 037
  • get flag!

6. 你会搜索吗?

最好玩的一道题 (先是一通乱搜,最后找到了方法)

我的思路:

  1. 教务在线搜索该老师的课程 为空 证明不是任课老师

  2. Google搜索 搜到一篇重邮小帮手的推文,发现其名字出现在指导老师一栏

  3. 小帮手历史文章搜索 发现是团委老师

  4. 进入学校团委官网寻找 最终在一个科技会堂使用申请表里找到了其电话

  5. md5就不说了

    38

# CTF
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×