Reverse

VaultDoor-training

  • 答案就寫在裡面ㄌ,他會透過public boolean checkPassword確認使用者輸入

VaultDoor1

  • 我用sublime處理,轉C-code輸出,工人智慧也可以

VaultDoor3

  • 把答案再重複做一次
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char a[] = "jU5t_a_sna_3lpm17ga45_u_4_mbrf4c"
    char password[32];
    for (int i = 0; i < 8; i++)
    password[i] = buffer[i];
    for (int i = 8; i < 16; i++)
    password[i] = buffer[23-i];
    for (int i = 16; i < 32; i+=2)
    password[i] = buffer[46-i];
    for (int i = 31; i > 16; i-=2)
    password[i] = buffer[i];

    for(int i = 0; i < 32; i++)
    printf("%c",password[i]);

VaultDoor4

  • hex,binary,octal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int myBytes[32] = {
    106 , 85 , 53 , 116 , 95 , 52 , 95 , 98 ,
    0x55, 0x6e, 0x43, 0x68, 0x5f, 0x30, 0x66, 0x5f,
    0142, 0131, 0164, 063 , 0163, 0137, 063 , 0141,
    '7' , '2' , '4' , 'c' , '8' , 'f' , '9' , '2' ,
    };

    for(int i = 0; i < 32; i++)
    printf("%c",myBytes[i]);

    return 0;

VaultDoor5

  • flag->url_encode->base64_encode
  • base64decode->url_encode->flag

  • source

    1
    JTYzJTMwJTZlJTc2JTMzJTcyJTc0JTMxJTZlJTY3JTVmJTY2JTcyJTMwJTZkJTVmJTYyJTYxJTM1JTY1JTVmJTM2JTM0JTVmJTMxJTMxJTM3JTM3JTY2JTM3JTM4JTMz
  • base64_decode

1
%63%30%6e%76%33%72%74%31%6e%67%5f%66%72%30%6d%5f%62%61%35%65%5f%36%34%5f%31%31%37%37%66%37%38%33
  • url_decode
1
c0nv3rt1ng_fr0m_ba5e_64_1177f783

VaultDoor6

  • 觀察此條件判斷,發現只要兩個相減=0就會return false

    1
    2
    3
    if (((passBytes[i] ^ 0x55) - myBytes[i]) != 0) {
    return false;
    }
  • 因此要想辦法讓此條件=0

  • 換句話說passBytes[i] ^ 0x55 = myBytes[i]
  • xor性質
    • A xor B = C
    • A xor C = B
  • 寫腳本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int myBytes[32]= {
    0x3b, 0x65, 0x21, 0xa , 0x38, 0x0 , 0x36, 0x1d,
    0xa , 0x3d, 0x61, 0x27, 0x11, 0x66, 0x27, 0xa ,
    0x21, 0x1d, 0x61, 0x3b, 0xa , 0x2d, 0x65, 0x27,
    0xa , 0x63, 0x65, 0x64, 0x67, 0x37, 0x6d, 0x62,
    };

    for(int i = 0; i < 32; i++)
    printf("%c",myBytes[i]^0x55);

VaultDoor7

  • 觀察for迴圈,會發現他把hex-byte分別左移24,16,8,0

    1
    2
    3
    4
    5
    6
    for (int i=0; i<8; i++) {
    x[i] = hexBytes[i*4] << 24
    | hexBytes[i*4+1] << 16
    | hexBytes[i*4+2] << 8
    | hexBytes[i*4+3];
    }
  • 將x值換成hex

    1
    2
    3
    4
    5
    6
    7
    8
    x[0] == 1096770097
    x[1] == 1952395366
    x[2] == 1600270708
    x[3] == 1601398833
    x[4] == 1716808014
    x[5] == 1734293815
    x[6] == 1667379558
    x[7] == 859191138
  • hexBytes[i*4]是左移24的結果

  • hexBytes[i*4+1]是左移16的結果
  • hexBytes[i*4+2]是左移8的結果
  • hexBytes[i*4+3]是左移24的結果

    1
    2
    3
    4
    5
    6
    7
    8
    x[0] = 415f6231
    x[1] = 745f3066
    x[2] = 5f623174
    x[3] = 5f736831
    x[4] = 6654694e
    x[5] = 675f3937
    x[6] = 63623166
    x[7] = 33363762
  • 整理出來

    1
    0x41,0x5f,0x62,0x31,0x74,0x5f,0x30,0x66,0x5f,0x62,0x31,0x74,0x5f,0x73,0x68,0x31,0x66,0x54,0x69,0x4e,0x67,0x5f,0x39,0x37,0x63,0x62,0x31,0x66,0x33,0x36,0x37,0x62
  • script

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    a = [
    1096770097,
    1952395366,
    1600270708,
    1601398833,
    1716808014,
    1734293815,
    1667379558,
    859191138
    ]

    b = []

    for t in a:
    b.append(str(hex(t)[2::]))

    flag = ""
    for j in b:
    for i in range(0,len(j),2):
    flag += chr(int('0x'+ j[i] + j[i+1],16))

    print(flag)

VaultDoor8

  • 怎麼移動過來,就怎麼移動回去
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
##include <bits/stdc++.h>

int a[] = {0xF4,0xC0,0x97,0xF0,0x77,0x97,0xC0,0xE4,0xF0,0x77,0xA4,0xD0,0xC5,0x77,0xF4,0x86,0xD0,0xA5,0x45,0x96,0x27,0xB5,0x77,0xE1,0xC0,0xA4,0x95,0x94,0xD1,0x95,0x94,0xD0};

int switchBits(int c, int p1, int p2)
{
/* Move the bit in position p1 to position p2, and move the bit
that was in position p2 to position p1. Precondition: p1 < p2 */
//int mask1 = (int)(1 << p1);
//int mask2 = (int)(1 << p2); /* int mask3 = (int)(1<<p1<<p2); mask1++; mask1--; */
int bit1 = (int)(c & (int)(1 << p1));
int bit2 = (int)(c & (int)(1 << p2));
/* System.out.println("bit1 " + Integer.toBinaryString(bit1));
System.out.println("bit2 " + Integer.toBinaryString(bit2)); */
int rest = (int)(c & ~((int)(1 << p1) | (int)(1 << p2)));
int shift = (int)(p2 - p1);
int result = (int)((bit1 << shift) | (bit2 >> shift) | rest);
return result;
}


int main()
{

/* Scramble a password by transposing pairs of bits. */

for (int b = 0; b < 32; b++) {
int c = a[b];
c = switchBits(c, 6, 7);
c = switchBits(c, 2, 5);
c = switchBits(c, 3, 4);
c = switchBits(c, 0, 1); /* d = switchBits(d, 4, 5); e = switchBits(e, 5, 6); */
c = switchBits(c, 4, 7);
c = switchBits(c, 5, 6);
c = switchBits(c, 0, 3); /* c = switchBits(c,14,3); c = switchBits(c, 2, 0); */
c = switchBits(c, 1, 2);
a[b] = c;
printf("%c",a[b]);
}

return 0;
}

reverse_cipher

  • rev_this
    1
    picoCTF{w1{1wq817/gbf/g}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for ( i = 0; i <= 7; ++i )
{
v11 = ptr[i];
fputc(v11, v7);
}
for ( j = 8; j <= 22; ++j )
{
v11 = ptr[j];
if ( j & 1 )
v11 -= 2;
else
v11 += 5;
fputc(v11, v7);
}
  • script,原本-2,+5,變+2,-5
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <bits/stdc++.h>

    int main()
    {
    int j;
    char ptr[] = "picoCTF{w1{1wq817/gbf/g}";

    for (int j = 8; j <= 22; ++j )
    {
    char v11 = ptr[j];
    if ( j & 1 )
    v11 += 2;
    else
    v11 -= 5;
    ptr[j] = v11;
    }


    for(int j = 0; j <= 23; j++)
    printf("%c",ptr[j]);

    return 0;
    }

asm1

  • asm1(0x610)

asm1(0x610)

1.

1
2
<+3>:   cmp    DWORD PTR [ebp+0x8],0x3b9
<+10>: jg 0x50f <asm1+34>

2.

1
2
<+34>:  cmp    DWORD PTR [ebp+0x8],0x477
<+41>: jne 0x520 <asm1+51>

3.

1
2
<+51>:  mov    eax,DWORD PTR [ebp+0x8]
<+54>: add eax,0x11

asm2

asm2(0xc, 0x15)

1
2
3
4
5
6
7
8
9
10
high_address


| 0x15 | <- ebp + c
| 0xc | <- ebp + 8
| ret | <- ebp + 4
| ebp |


low_address

1.

1
2
<+6>:   mov    eax,DWORD PTR [ebp+0xc]
<+9>: mov DWORD PTR [ebp-0x4],eax
1
2
3
4
5
| 0x15 | <- ebp + c
| 0xc | <- ebp + 8
| ret | <- ebp + 4
| ebp |
| 0x15 | <- ebp -4

2.

1
2
3
<+12>:  mov    eax,DWORD PTR [ebp+0x8]
<+15>: mov DWORD PTR [ebp-0x8],eax
<+18>: jmp 0x50c <asm2+31>
1
2
3
4
5
6
| 0x15 | <- ebp + c
| 0xc | <- ebp + 8
| ret | <- ebp + 4
| ebp |
| 0x15 | <- ebp - 4
| 0xc | <- ebp - 8
  1. 檢測[ebp-0x8]
    1
    2
    <+31>:  cmp    DWORD PTR [ebp-0x8],0xa3d3
    <+38>: jle 0x501 <asm2+20>
  • 即可換成以下的script
    1
    2
    3
    4
    5
    6
    7
    8
    ebp_4 = 0x15
    ebp_8 = 0xc

    while ebp_8 <= 0xa3d3:
    ebp_4 += 0x1
    ebp_8 += 0xaf

    print(hex(ebp_4))

asm3

intel-x86 is little endian

  • e.g: 0xDEADBEEF
    1
    2
    3
    4
    5
    6
    7
    8
    high_address

    | DE | <- 3
    | AD | <- 2
    | BE | <- 1
    | EF | <- 0

    low_address

asm3(0xc4bd37e3,0xf516e15e,0xeea4f333)

1
2
3
4
5
6
7
8
9
high_address

| eea4f333 | <- ebp + 16
| f516e15e | <- ebp + 12
| c4bd37e3 | <- ebp + 8
| ret | <- ebp + 4
| ebp | <- ebp + 0

low_address
  1. <+5>: mov ah,BYTE PTR [ebp+0x9]

eax: 00003700

  1. <+8>: shl,0x10 左移16格

eax: 37000000

  1. <+12>: sub al,BYTE PTR [ebp+0xd]
  • 00-e1 = 1F
    eax: 3700001F
  1. <+15>: add ah,BYTE PTR [ebp+0xe]
  • eax: 3700161F
  1. <+18>: xor ax,WORD PTR [ebp+0x10]
  • 161F xor f333

  • eax: 3700e52c

asm4(賽後解出)

  • 無腦法:
    寫一個c把asm4(“picoCTF_75806”)把值印出
    另一組語那包也用gcc編
    兩邊都生成obj檔之後,再將其兩個檔案連結
    如果你是x64假夠的話,在linux需要裝
    1
    apt-get install gcc-multilib
1
gcc -m32 -c asm4.S -o asm4_asm.o gcc -m32 -c asm4.c -o asm4_print.o gcc -m32 -o a.out asm4_asm.o asm4_print.o ./a.out

Time’s Up(賽後解出)

1
2
3
4
5
6
from pwn import *

p = process("/problems/time-s-up_3_37ba6326d772bf884eab8f28e480e580/times-up", cwd='/problems/time-s-up_3_37ba6326d772bf884eab8f28e480e580')
question = p.readuntil("\n").split(":")[1]
p.sendline(str(eval(question)))
p.interactive()

Time’s Up, Again!

  • ???????

Need For Speed(賽後解出)

  • alarm()執行後,進程將繼續執行,在後期(alarm以後)的執行過程中將會在seconds秒後收到信號SIGALRM並執行其處理
  • ida或ghidra先逆
1
2
3
4
5
6
7
8
int __cdecl main(int argc, const char **argv, const char **envp)
{
header();
set_timer();
get_key();
print_flag();
return 0;
}
  • 利用GDB跳過timer設定
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    -
    ─────────────────────────────────────────────── Code ───────────────────────────────────────────────
    0x55555555497f <main+11>: mov QWORD PTR [rbp-0x10],rsi
    0x555555554983 <main+15>: mov eax,0x0
    0x555555554988 <main+20>: call 0x555555554932 <header>
    => 0x55555555498d <main+25>: mov eax,0x0
    0x555555554992 <main+30>: call 0x55555555487f <set_timer>
    0x555555554997 <main+35>: mov eax,0x0
    0x55555555499c <main+40>: call 0x5555555548d7 <get_key>
    0x5555555549a1 <main+45>: mov eax,0x0
1
jump *0x555555554997
1
2
3
4
5
6
7
8
9
10
11

-
─────────────────────────────────────────────── Code ───────────────────────────────────────────────
0x55555555497f <main+11>: mov QWORD PTR [rbp-0x10],rsi
0x555555554983 <main+15>: mov eax,0x0
0x555555554988 <main+20>: call 0x555555554932 <header>
0x55555555498d <main+25>: mov eax,0x0
0x555555554992 <main+30>: call 0x55555555487f <set_timer>
=> 0x555555554997 <main+35>: mov eax,0x0
0x55555555499c <main+40>: call 0x5555555548d7 <get_key>
0x5555555549a1 <main+45>: mov eax,0x0
1
2
3
4
5
6
7
Continuing at 0x555555554997.
Creating key...

Finished
Printing flag:
PICOCTF{Good job keeping bus #3b89d39c speeding along!}
[Inferior 1 (process 5971) exited normally]
  • 失敗則會進到這個function
    1
    2
    3
    4
    5
    void __noreturn alarm_handler()
    {
    puts("Not fast enough. BOOM!");
    exit(0);
    }

droids:0(賽後解出)

  • android studio裝起來(先吃掉10G)
  • logcat看個就有答案

droids:1(賽後解出)

  • apktool配android studio
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## direct methods
.method static constructor <clinit>()V
.locals 1

.line 7
const-string v0, "true"

invoke-static {v0}, Ljava/lang/Boolean;->parseBoolean(Ljava/lang/String;)Z

move-result v0

sput-boolean v0, Lcom/hellocmu/picoctf/BuildConfig;->DEBUG:Z

return-void
.end method
  • string的值會導向這邊C:\pinhan\ctf\apktool\one\res\values

droids:2(賽後解出)

  • reverse 出來的code

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static String getFlag(String input, Context ctx) {
    String[] witches = {"weatherwax", "ogg", "garlick", "nitt", "aching", "dismass"};
    int second = 3 - 3;
    int third = (3 / 3) + second;
    int fourth = (third + third) - second;
    int fifth = 3 + fourth;
    int sixth = (fifth + second) - third;
    String str = ".";
    if (input.equals("".concat(witches[fifth]).concat(str).concat(witches[third]).concat(str).concat(witches[second]).concat(str).concat(witches[sixth]).concat(str).concat(witches[3]).concat(str).concat(witches[fourth]))) {
    return sesame(input);
    }
    return "NOPE";
    }
  • 整理之後的順序

    1
    dismass.ogg.weatherwax.aching.nitt.garlick
  • 在拿去模擬器把字串拿進去跑,就有flag了

droids3(賽後解出)

  • reverse的code

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class FlagstaffHill {
    public static native String cilantro(String str);

    public static String nope(String input) {
    return "don't wanna";
    }

    public static String yep(String input) {
    return cilantro(input);
    }

    public static String getFlag(String input, Context ctx) {
    return nope(input);
    }
    }
  • 目標: 把nope換成yep,就能印出flag

  • 參考以下code文章,改code再回包apk
  • https://blog.csdn.net/dreamer2020/article/details/52761606

  • 把nope_function -> 改成yep_function

  • 此題不用改太多,只須改function_name
  • 流程
    1
    code改掉-> 重新輸出apk -> apk簽名的keystore -> 在apk上簽名 -> android_studio安裝
1
2
3
apktool b .\three -o three_2.apk
keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
jarsigner -verbose -keystore demo.keystore three_2.apk demo.keystore
  • keytool

    1
    2
    3
    4
    5
    -genkey 產生key
    -alias 別名
    -keystore 指定keystroe名字
    -keyalg 密鑰算法
    -validity 有效天數
  • jarsigner

    1
    2
    -verbose 詳細齣齣
    -keystore 證書儲存路徑

droids4(賽後解出)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String getFlag(String input, Context ctx) {
String str = "aaa";
StringBuilder ace = new StringBuilder(str);
StringBuilder jack = new StringBuilder(str);
StringBuilder queen = new StringBuilder(str);
StringBuilder king = new StringBuilder(str);
ace.setCharAt(0, (char) (ace.charAt(0) + 4));
ace.setCharAt(1, (char) (ace.charAt(1) + 19));
ace.setCharAt(2, (char) (ace.charAt(2) + 18));
jack.setCharAt(0, (char) (jack.charAt(0) + 7));
jack.setCharAt(1, (char) (jack.charAt(1) + 0));
jack.setCharAt(2, (char) (jack.charAt(2) + 1));
queen.setCharAt(0, (char) (queen.charAt(0) + 0));
queen.setCharAt(1, (char) (queen.charAt(1) + 11));
queen.setCharAt(2, (char) (queen.charAt(2) + 15));
king.setCharAt(0, (char) (king.charAt(0) + 14));
king.setCharAt(1, (char) (king.charAt(1) + 20));
king.setCharAt(2, (char) (king.charAt(2) + 15));
if (input.equals("".concat(queen.toString()).concat(jack.toString()).concat(ace.toString()).concat(king.toString()))) {
return "call it";
}
return "NOPE";
}
  • 轉換一下好閱讀
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String getFlag(String input, Context ctx) {
String str = "aaa";
StringBuilder ace = new StringBuilder(str);
StringBuilder jack = new StringBuilder(str);
StringBuilder queen = new StringBuilder(str);
StringBuilder king = new StringBuilder(str);
ace.setCharAt(0, (char) (a + 4));
ace.setCharAt(1, (char) (a + 19));
ace.setCharAt(2, (char) (a + 18));
jack.setCharAt(0, (char) (a + 7));
jack.setCharAt(1, (char) (a + 0));
jack.setCharAt(2, (char) (a + 1));
queen.setCharAt(0, (char) (a + 0));
queen.setCharAt(1, (char) (a + 11));
queen.setCharAt(2, (char) (a + 15));
king.setCharAt(0, (char) (a + 14));
king.setCharAt(1, (char) (a + 20));
king.setCharAt(2, (char) (a + 15));
if (input.equals("".concat(queen.toString()).concat(jack.toString()).concat(ace.toString()).concat(king.toString()))) {
return "call it";
}
return "NOPE";
}
  • 逆完結果alphabetsoup
1
2
3
4
5
6
7
8
9
10
11
12
printf("%c",(char)('a' + 0));
printf("%c",(char)('a' + 11));
printf("%c",(char)('a' + 15));
printf("%c",(char)('a' + 7));
printf("%c",(char)('a' + 0));
printf("%c",(char)('a' + 1));
printf("%c",(char)('a' + 4));
printf("%c",(char)('a' + 19));
printf("%c",(char)('a' + 18));
printf("%c",(char)('a' + 14));
printf("%c",(char)('a' + 20));
printf("%c",(char)('a' + 15));
  • 觀察function
1
2
3
if (input.equals("".concat(queen.toString()).concat(jack.toString()).concat(ace.toString()).concat(king.toString()))) {
return "call it";
}
  • 如果成功= input,卻只能return call i,
    • 因此要想辦法執行public static native String cardamom(String str);,步驟則跟前題一樣
  • 改的部分
    1
    2
    3
    4
    5
    6
    7
    8
    9

    if-eqz v5, :cond_0

    const-string v5, "call it"

    invoke-static {p0}, Lcom/hellocmu/picoctf/FlagstaffHill;->cardamom(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v5
    return-object v5

留言與分享

  • 題目
  1. 要找到連續賭局最大可能贏到的錢,正代表獲勝,負責代表輸錢
  2. 如果都是輸錢就印出Losing streak.
  • 題目思路

    • 用dp記錄目前到此局能贏取最多錢的數目,與當格比,如果當格較大就從他開始取
    • ex: -1,2,3,紀錄到2的時候,如果取-1,2只能贏一塊錢,所以我們選擇只取2,該格的dp就紀錄2
  • code

這題自己沒有想出來,我的dp還是有障礙

留言與分享

寫題解讓自己可以review一次自己寫了甚麼…
幾百年沒刷題,程式能力依然爛QQ

  • 題目
  1. 有一段字串需要照他的規定做轉換,例如例題的G就要換成GNU’s
  2. 給了原字串要問經過幾次轉換,他詢問的該個字母有幾個,最多轉換10000次
  3. 每個答案要間隔一個換行
  • 解題思路

    • 因為題目只是將一個字母轉換成字串,因此我們只需要計算每個字母在每次轉換的總數有幾個,不需照著做轉換。
    • 而題目有提到會出現的字元Ascii是從33~126之間,因此只要維護一個dp表格(我是直接開200)
    • 用tmp紀錄字母在轉換時會增加多少個不同的字母數量,接著看上一層狀態該個字母有多少就乘以他的幾倍,紀錄到下一格狀態
    • 如果紀錄每次狀態,陣列空間會太大,因此每次轉換過後,需要將結果狀態回灌給上一層,這樣只需要兩層的空間。
  • code

留言與分享

Ais3-Day7

AIS3系列文(最後一天)

報告

  • 今天是Crypto&IOT&Forensics的報告,我只能說真的是破緊張的,身為一個菜逼八要在台上報告感覺就像個小丑一樣。本組報告的主題是meltdown&spectre,報告做到最後,感覺有點偏離密碼學的主軸,主要的部分都是破密分析,變得有點像Pwn了-_-“。前面幾組的報告真的都是密碼學的東西,對於我這個沒在摸crypto的人,真的是傻爆眼。不過有人有拿魔方來跟加密做結合我覺得還蠻有趣的,因為自己也是個魔方玩家,其實本來淺意識有想過這個主題,不過因為密碼學的東西我真的不熟,所以就沒有把想法提出來。基本報告上我們講了原理,跟帶一個小Lab,以及我們的看法,而我是負責Lab的部分。報告一結束,後面報告真的沒在注意了,也沒有讓我印象比較深刻的部分,有點可惜呢。

報告烙賽分享

  • 其實我覺得還能把Lab弄得更好,讓他能過更像實際攻擊的環境,但礙於時間的關係,就沒有更深入的研究。在台上就是很烙賽,大概排練表現大概打個對折左右,而且我覺得我有講錯的部分,說真的對我自己表現沒有很滿意,但至少讓自己跨了第一步。很感謝跟我一起報告的同學,我也學習到一些報告的技巧及重點的講述,投影片的連結我就附在下面,歡迎有興趣同胞的可以點進來看。

回家漫漫長路

  • 當時應該叫兩台計程車的,很抱歉在火車站等我的Roy,結果我自己跑去搭公車等了超久,最後決定在新竹逗留,結果回程搭火車還沒有自強號,只好搭區間快車慢慢扣到樹林,還好有一大堆youtube影片陪我,結果到火車站公車還要40~50分鐘,我就搭了701回家了,雖然他停在離我們家比較遠的公車站,過程真的很像在抗戰。

心得檢討

  • 七天下來,大概前三天是我最認真聽課的時候了,後面四天都在看關於報告的東西吧,睡覺也睡得沒有很好,每一天都想要回家休息,不過還是堅持到最後了,算是自己的一點小成就吧,也認識頗多朋友,算是逃離舒適圈吧。說實在,比起當時進資工系完全不知道要幹嘛,到現在至少能參加Ais3,算是有一點進步吧,但離大大真的太遙遠了,還有很大的進步空間。這次的技術部分我自己都沒做到甚麼筆記,都是看會場共筆,因為真的到很多課程都茫了,不期望下一次能夠全跟上課程,但至少要比這次還要進步。

食物

  • 早餐沒吃
    • 緊張到靠杯
  • 中午漢堡王149+25
    • 應該是這幾天吃的最奢侈的,畢竟報告結束一個大解放
  • 晚餐60+15+30+30
    • 好久沒來城隍廟附近,google map還有留著我當時打星號的店家,於是就選了幾家吃
    • 很想買城隍包但排隊排爆
    • 廟口鴨肉飯
    • 青草茶
    • 梅花雞蛋糕

圖片

  • 離開交大拍的交大湖,每天去會場都會經過,當時正在趕公車

  • 走向城隍廟口隨手拍的,當時大包小包

  • 到樹林看到一台普悠瑪正開進站,結束這回合

最後一篇ais32019
過了六日才發,頹廢了一整個禮拜

留言與分享

Ais3-Day6

AIS3系列文

報告第一天

  • 早上是web組的報告,整個印象最深刻的就是開挖0-day的那個部分,讓評審只有說「做得很好」,從流程到實作都講解得相當清楚,也有成功回報,真的讓我嘆為觀止。還有組別是製作更好用的hackbar,真的感覺比原本的hackbar好用,而且還不用license。另外區塊鍊的部分,我是完全沒有聽懂,因為基礎知識趨近於零,不過這也促使我去了解我不擅長之領域,另外是活動結束後有創粉專的breach.tw,台灣抓漏小天使,這是國外ihavebeenpwn的理念,參考之後做了一個台灣版本的,目前持續有在維護中。

  • 下午的部分是軟體安全組的同學,我就只把我比較有印象的組別列出,記得一組是報告關於SDN的技術,然後有做自己的延伸,有大概理解他們整個架構,不過實作上面有點茫。有一組則是做生物學識別,透過使用者輸入密碼的習慣,來驗證你的輸入的帳號密碼是否有效,密碼長度越長則效果越好,覺得這個專題發想還不錯。下午下半場則是國家安全的組別報告,看到蠻多都有跟時事結合的技術,像是把某個政治人物打馬,做出自己的過濾系統這樣,覺得學以致用這個詞用在他們身上真的不為過。

  • 晚上是逆向工程的組別報告,我只看到一大堆人做一大堆boot loader,聽到最後有點疲乏,因為他們的題目有先規定好要做甚麼。基本上又是我補投影片的時機了。回去宿舍後,我的team約在一樓交誼廳,接著就是開始彩排,順過整個流程以及計時,第一次直接超過時間,於是做出了很多調整,最後很像沒有順第二次我們就各自回房。

住宿

  • 看到有一半的人已經報告結束了,然後我們在做投影片
  • 這天真的是整個禮拜最累的一天,不斷的順整個報告流程,調整報告節奏,不過應該是我最有收穫的一個晚上
  • 睡覺前chill一點,不然真的睡不著。
  • 感謝我的室友carry

食物

  • 早餐49
    • 似乎是便利商店
  • 午餐99
    • 我到底吃了甚麼???
  • 飲料10
    • 飲料機
  • 晚餐85+20
    • 吃麻辣臭豆腐,辣到我流汗,配知名乳酸飲料

圖片

  • 凌晨12點被關燈,於是拿著手機手電筒度過,聽著spotify讓我逃離高壓情緒

詳情可以看我IG精選動態
隔天報告覺得烙烙的

留言與分享

Ais3-Day5

AIS3系列文

課程

  • 算是整個課程的最後一天了,剩兩天都是報告。早上是一位大大的經驗分享,不過為了兩天後的報告,我大部分都是邊做投影片邊聽他的分享,畢竟技術上面的部分沒有題太多,但後來因為精神不濟,我又睡著了,我的同學還拍到我打呼QQ,但其實我很像只睡了十幾分鐘吧。基本上課程面相比較是實務上的經驗,不過我實在沒有任何部屬或是大專案的經驗,我是認為這堂課可能對要進業界的人比較有用。

  • 下午是日本籍大大來上課,主題基本上就是web,但我的英文實在沒有很好,沒有很懂他想要表達的意思,有點鴨子聽雷的感覺,不過他的Lab感覺蠻值得打的,但我很像打了一兩題我就沒有跟上他的進度了。因此我又在趕工投影片,繼續研究meltdown根specture。這次因為灌了綠茶,所以比較沒那麼想睡覺。

  • 晚上就不斷地Re我的報告,大致上整個報告模型已經做到6~7成左右。

住宿

  • 這天好累,直接睡一波
  • 跟輔大同學一起團購uber-eat,雞排直接給他買下去,甘願呷後系,馬賣死謀呷
  • 感謝我的室友幫我解了很多惑≦(._.)≧

食物

  • 午餐75+25
    • 這天很像又吃滷味,配豆漿
  • 晚餐70+20
    • 忘記吃甚麼,只記得錢
  • 宵夜雞排場75
    • 好久沒吃一整塊大雞排,覺得人生突然變的美好

圖片

  • 最後一天的課,我的狀態就如同這張圖

詳情可以看我IG精選動態
很堅持的每天po,颱風漂過(-_-). z Z

留言與分享

Ais3-Day4

AIS3系列文

課程

  • 自從這天開始,我就跟不太上課堂進度了,又加上我每天幾乎都沒睡好,又覺得課程很無趣,就開始在睡了OAO。

  • 早上是在講軟體開發,對於只寫過一次網站的我,很多專有名詞我都沒有聽過。主要都是在介紹整個流程之多,不過他有提到一些寫軟體的經驗,有一些部分有說中到我當時寫專案遇到問題的點(上學期的期末專題),不過真的睡了太多,又加上都在做投影片,所以幾乎都沒有在聽課,事後覺得沒有聽到有點虧。

  • 下午開始,我精神很不錯,又加上是reverse的課程,開始有想要聽課都慾望。講師也是提供一份code讓我們逆向,然後用之前NSA釋出的工具(ghidra),來做授課。之前nisra-training的時候又逆向過的經驗,但是這次的講師提供的這份code,前置作業真的太多,還有一大堆要設定,最後直接茫了,而且講師速度真的過快,完全跟不上,只能看ppt弄。結果最後就是失敗收場,不過有時間我會再回去看看那份code。

  • 晚上我們組有留下來,想說聽聽mentor的意見,看我們做這個主題有沒有甚麼大問題。中間一度遇到會場與mentor之間的順序表不一致,導致我們一直被忘記,等了好久才等到Mentor。結果我們跟mentor報告我們要做的主題後,他只給我們ok這樣,沒有甚麼意見,於是我們就按照這個題目繼續做下去,當天晚上我們也一直在找資料,根lab的部分,跟前一天一樣也是閱讀一些文件,然後不懂的就問我室友這樣。

住宿

  • 不免俗的還是講床很硬,然後又睡的腰很痛
  • 買了一瓶綠茶然後睡不著
  • 看了眼球央視讓我不會那麼厭世
  • 一樣糾團刷牙、洗澡,然後發現一樓根二樓的浴室真的很棒,但是懶的走下去。

食物

  • 早餐吃了前一天屯貨的食物

  • 午餐魯味 95

    • 活動中心滷味,又吃了一天滷味,好魯好魯
  • 晚餐麥當當 105
    • 搭配麥當勞報報有折扣還不錯,不用點套餐也有套餐級享受

圖片

  • 上課畫面示意圖,椅子比交大宿舍舒服XD,椅子好睡好睡

詳情可以看我IG精選動態
感冒從喉嚨移置到鼻水

留言與分享

Ais3-Day3

AIS3系列文

課程

  • 早上是數位鑑識Forensics的課程,基本上類型就像是柯南一樣,在電腦蒐集資訊、分析,接著推測出前因後果。在講課的部分我認為都還可以吸收,但一到實作的課程,大家都被VM的設定搞死,有的人用Oracle、有人用VMware。我的虛擬機本身是開得起來的,但是弄個三分鐘整個畫面就沒有動作,讓我在第一步就先卡關,結果漸漸地大家就開始進入gartic.io的世界了。後來的我就是看講師秀他的各個工具,以及一些分析的SOP,真的是跟柯南很像呢。加上近幾年來的攻擊手法越來越多,防禦與調查這塊也是相當重要呢。

  • 下午是關於Crypto的課,我還蠻認真聽得,畢竟要做這個項目的報告。一開始是提到一點硬體的安全問題,慢慢切入到密碼學,RSA跳過沒有提,然後講到AES的運作流程,講師也提供一個填空的code要我們完成AES加密,當下是沒有做出來,但後來在寢室內有嘗試出來,然後不要亂從網路上(github)直接載其他人的加密演算法,會讓東西暴露在風險當中的。

  • 晚上跟我的組員開始討論要做些甚麼,於是跑到交大的漢堡王與組員討論出主題,當時講師提供了三個題目,本組的幾乎都是大大,對密碼學都有鑽研一些,大概只有我完全沒有密碼學的經驗,當時pre-exam也只解一題而已。後來投票出來,選了Meltdown&Spectre,說真的,我覺得這與密碼學沒什麼關係,應該只能算破密分析,不過當時很像也沒想那麼多,就繼續做下去了。回去寢室的路上,我一直向本寢的同胞聊我們做的主題,畢竟我也沒接觸過太多,一回到寢室之後,就開始狂翻文件,當天就理解了一些機制根運作。

住宿

  • 床硬,還是想回家
  • 宿舍隔壁的7-11準備要整修,屯了三天的早餐,不過最後還是沒吃完
  • 翻了一堆文件,英文又很破的我還是得面對
  • 很有默契的根這次一起來的同學糾團刷牙,洗澡這樣

食物

  • 早餐兩顆茶葉蛋18

交大的便利商店都有打折

  • 午餐滷味100

    • 當天發現他們的活動中心有食物區,以往都跑到女宿樓下,不過我還是覺得輔大小夜市滷味比較合胃口
  • 晚餐漢堡王99

    • 基本上就是根組員交流,邊吃邊討論要做出甚麼主題
  • 順路捕貨

    • 當天其實只是陪同學來逛一下7-11,殊不知店員提醒了要整修,就趁機囤貨一波

圖片

  • 報到排隊的畫面,那幾天我很像都沒拍甚麼照片

詳情可以看我IG精選動態
一回來兩天就感冒QAQ

留言與分享

Ais3-Day2

AIS3系列文

課程

  • 週二早上是偏硬體的課程,主要是在講硬體的逆向工程,感謝聯發科技提供板子。一開始在燒錄firmware,manual裡面有詳細的提供做法,結果windows遇到了一大堆問題,馬上開虛擬機換系統,中途也狂舉手,好不容易才有預設的貪吃蛇畫面。接著在介紹ARM的架構,剛經過MIPS洗禮的我,覺得兩個還蠻相似的,而且功能很像比MIPS還豐富,但也導致他的手冊紙內容多到很複雜。最後用ida來逆向他提供的程式,觀察main跟找出他的flag,不過最後那段code真的複雜到不太想看,又加上肚子開始餓了,就沒有仔細地往下做了。

  • 下午都在講AI的課程,說實在我重來沒有聽過裡面的實作,只看到一大堆數學式子,還有一大堆圖表,對這堂課的基礎知識完全沒有,所以都在做自己的事情,不然就是在睡QQ

  • 晚上是AIS3校友回娘家,這計畫也進行了五年了,不過我今年才來參加。很意外的看到本系的主任來開場,不過大學兩年都沒有上到他的課。晚餐就是活動提供的buffet,人龍真的是頗長的,不過我算是排比較前面的,至少有吃到一些東西,不過沒有吃得太多。後來官方群傳說一大堆都有拉肚子的情況(本人並沒有),店家最後有做出賠償,本人是覺得奶茶可能比較是罪魁禍首。活動的最後基本上就是各大企業的工商時間,感覺是來拉攏人才的,也有一部分是來經驗分享的(有看到之前來NISRA講課的講師),真的全部都是大大呢。

住宿

  • 開跟同寢室交流,基本上就是在自我介紹這樣。
  • 床還是很硬,真的還是想要回家睡
  • 這天的晚上我很像一直在看youtube,完全不想要想專題要做甚麼
  • 有玩一下板子
  • 室友的桌子被螞蟻攻擊幫QQ

食物

  • 交大校門口早餐店40
    • 蛋餅+紅茶
    • 新竹紅茶???
  • 午餐滷味95
    • 覺得很像在輔大夾同樣的份量比較便宜
  • 晚餐
    • 一盤buffet
  • 宵夜39
    • 忘記吃甚麼了,只有記得價錢

圖片

  • 每堂課都要簽到哦~~

詳情可以看我IG精選動態

留言與分享

作者的圖片

halloworld

Welcome halloworld’s website


fju-csie: grade 3


NewTaipei