
作業1- C 語言開發
printf("%d\\n", a & b);這一行執行了AND運算。a和b的二進位表示分別是1001和1101,進行位元AND運算後,得到結果1001,對應的十進位數字為9。printf("%d\\n", a || b);這一行執行了OR運算。a和b都是非零值,因此表達式a || b的結果為真(1)。所以輸出將是1。printf("%d\\n", a ^ b);這一行執行了位元XOR運算。a和b的二進位表示分別是1001和1101,進行位元XOR運算後,得到結果0100,對應的十進位數字為4。printf("%d\\n", !a);這一行執行了邏輯NOT運算。a的值是非零,所以邏輯NOT運算後為0。所以輸出將是0。

作業2- Linux執行檔分析
C原程式 猜題目作者的生日
執行過程:
總不可能剛好通靈到別人的生日 到main function中尋找:
比較過程(1):
比較過程(2):
其實好像進到VV後就看到flag了
作業3- 組合語言
這題要找到能跳paradise的值 
- 過程:
- 初始的賦值: eax=0x03, ebx=???(不知道是多少), ecx=0x3eb3ac03, edx=0x3eb3ac03。
- 進入loop,瘋狂執行下去。
- 在循環中,首先檢查eax是否=0,如果則跳轉到check。
- 如果eax不為零,則將ecx+edx,然後將eax-1。
- 循環重複執行,直到eax變為零。
- 當eax為零時,跳到check,比較ebx和ecx的值。
- 如果ebx等於ecx,則跳轉到paradise,將eax設置為1。否則,將eax設置為0。
- 要跳轉到paradise,需要滿足ebx等於ecx的條件。由於ecx的初始值為0x3eb3ac03,我們可以追蹤循環的執行過程來計算出最終ecx的值。 在循環中,ecx的值會被不斷加上edx的值(0x3eb3ac03)。 由於eax的初始值為3,因此循環會執行3次。每次循環,ecx的值會增加0x3eb3ac03。
結果: 要計算出以下: ecx = 0x3eb3ac03 + 3 * 0x3eb3ac03 
作業4- pwntools解題
C原程式 猜題目作者的生日
pwn解題程式
結果: Flag就噴出來了 
- 加分題 main 2

- 加分題 main 3
進入到visual模式後 也可看到 0x4012f6 是main的地址 
- 加分題 main 6
進入到visual模式後還是 可以看到main的地址是0x40121c 
Thanks for reading!