# Week6 10/22 ## 作業繳交截止時間 11/06 晚上 9 點整 (依最後編輯時間為準) 1. 完成 Python Script 並附上程式碼 - ```python= print("Paste Your Code Here") ``` 2. 將下列組語翻回 C 語言 (Hint: `gcc source.c -no-pie -fno-stack-protector -o outputfile` or `https://godbolt.org/`) 1. 題目 Sample ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: b8 00 00 00 00 mov eax,0x0 4004a0: 5d pop rbp 4004a1: c3 ret ``` - 答案 ```c=https://hackmd.io/UsEPsSMMQTC75D53px9huQ# #include <stdio.h> int main () { return 0; } ``` 2. 題目 Variables ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 fc 0a 00 00 00 mov DWORD PTR [rbp-0x4],0xa 4004a2: b8 00 00 00 00 mov eax,0x0 4004a7: 5d pop rbp 4004a8: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ int a = 10; return 0; } ``` 3. 題目 Variables ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c6 45 ff 61 mov BYTE PTR [rbp-0x1],0x61 40049f: b8 00 00 00 00 mov eax,0x0 4004a4: 5d pop rbp 4004a5: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ char a = 'a'; return 0; } ``` 4. 題目 Variables ```asm= 400517 <main>: 400517: 55 push rbp 400518: 48 89 e5 mov rbp,rsp 40051b: 48 83 ec 20 sub rsp,0x20 40052e: c7 45 ec 0a 00 00 00 mov DWORD PTR [rbp-0x14],0xa 400535: 48 8d 45 ec lea rax,[rbp-0x14] 400539: 48 89 45 f0 mov QWORD PTR [rbp-0x10],rax 40053d: b8 00 00 00 00 mov eax,0x0 400556: c9 leave 400557: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ int a=10; long b=a+32; return 0; } ``` 5. 題目 Condition Flow ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 fc 0a 00 00 00 mov DWORD PTR [rbp-0x4],0xa 4004a2: 83 7d fc 14 cmp DWORD PTR [rbp-0x4],0x14 4004a6: 7e 07 jle 4004af <main+0x18> 4004a8: b8 00 00 00 00 mov eax,0x0 4004ad: eb 05 jmp 4004b4 <main+0x1d> 4004af: b8 01 00 00 00 mov eax,0x1 4004b4: 5d pop rbp 4004b5: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ``` 6. 題目 Condition Flow ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 4004a2: 8b 45 fc mov eax,DWORD PTR [rbp-0x4] 4004a5: 83 f8 02 cmp eax,0x2 4004a8: 74 10 je 4004ba <main+0x23> 4004aa: 83 f8 03 cmp eax,0x3 4004ad: 74 11 je 4004c0 <main+0x29> 4004af: 83 f8 01 cmp eax,0x1 4004b2: 75 12 jne 4004c6 <main+0x2f> 4004b4: c6 45 fb 41 mov BYTE PTR [rbp-0x5],0x41 4004b8: eb 10 jmp 4004ca <main+0x33> 4004ba: c6 45 fb 42 mov BYTE PTR [rbp-0x5],0x42 4004be: eb 0a jmp 4004ca <main+0x33> 4004c0: c6 45 fb 43 mov BYTE PTR [rbp-0x5],0x43 4004c4: eb 04 jmp 4004ca <main+0x33> 4004c6: c6 45 fb 44 mov BYTE PTR [rbp-0x5],0x44 4004ca: b8 00 00 00 00 mov eax,0x0 4004cf: 5d pop rbp 4004d0: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ``` 7. 題目 Condition Flow ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0 4004a2: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 4004a9: eb 0a jmp 4004b5 <main+0x1e> 4004ab: 8b 45 fc mov eax,DWORD PTR [rbp-0x4] 4004ae: 01 45 f8 add DWORD PTR [rbp-0x8],eax 4004b1: 83 45 fc 01 add DWORD PTR [rbp-0x4],0x1 4004b5: 83 7d fc 09 cmp DWORD PTR [rbp-0x4],0x9 4004b9: 7e f0 jle 4004ab <main+0x14> 4004bb: b8 00 00 00 00 mov eax,0x0 4004c0: 5d pop rbp 4004c1: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ``` 8. 題目 Arithmetic Operation ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 f4 05 00 00 00 mov DWORD PTR [rbp-0xc],0x5 4004a2: c7 45 f8 05 00 00 00 mov DWORD PTR [rbp-0x8],0x5 4004a9: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 4004b0: 8b 55 f4 mov edx,DWORD PTR [rbp-0xc] 4004b3: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8] 4004b6: 01 d0 add eax,edx 4004b8: 89 45 fc mov DWORD PTR [rbp-0x4],eax 4004bb: b8 00 00 00 00 mov eax,0x0 4004c0: 5d pop rbp 4004c1: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ``` 9. 題目 Arithmetic Operation ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 f4 05 00 00 00 mov DWORD PTR [rbp-0xc],0x5 4004a2: c7 45 f8 05 00 00 00 mov DWORD PTR [rbp-0x8],0x5 4004a9: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 4004b0: 8b 45 f4 mov eax,DWORD PTR [rbp-0xc] 4004b3: 2b 45 f8 sub eax,DWORD PTR [rbp-0x8] 4004b6: 89 45 fc mov DWORD PTR [rbp-0x4],eax 4004b9: b8 00 00 00 00 mov eax,0x0 4004be: 5d pop rbp 4004bf: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ``` 10. 題目 Arithmetic Operation ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 f4 05 00 00 00 mov DWORD PTR [rbp-0xc],0x5 4004a2: c7 45 f8 05 00 00 00 mov DWORD PTR [rbp-0x8],0x5 4004a9: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 4004b0: 8b 45 f4 mov eax,DWORD PTR [rbp-0xc] 4004b3: 0f af 45 f8 imul eax,DWORD PTR [rbp-0x8] 4004b7: 89 45 fc mov DWORD PTR [rbp-0x4],eax 4004ba: b8 00 00 00 00 mov eax,0x0 4004bf: 5d pop rbp 4004c0: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ``` 11. 題目 Bitwise Operation ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 f8 04 00 00 00 mov DWORD PTR [rbp-0x8],0x4 4004a2: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 4004a9: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8] 4004ac: 83 e0 01 and eax,0x1 4004af: 89 45 fc mov DWORD PTR [rbp-0x4],eax 4004b2: b8 00 00 00 00 mov eax,0x0 4004b7: 5d pop rbp 4004b8: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ``` 12. 題目 Bitwise Operation ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 f8 04 00 00 00 mov DWORD PTR [rbp-0x8],0x4 4004a2: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 4004a9: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8] 4004ac: f7 d0 not eax 4004ae: 89 45 fc mov DWORD PTR [rbp-0x4],eax 4004b1: b8 00 00 00 00 mov eax,0x0 4004b6: 5d pop rbp 4004b7: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ``` 13. 題目 Bitwise Operation ```asm= 400497 <main>: 400497: 55 push rbp 400498: 48 89 e5 mov rbp,rsp 40049b: c7 45 fc 0a 00 00 00 mov DWORD PTR [rbp-0x4],0xa 4004a2: d1 7d fc sar DWORD PTR [rbp-0x4],1 4004a5: b8 00 00 00 00 mov eax,0x0 4004aa: 5d pop rbp 4004ab: c3 ret ``` - 答案 ```c= #include <stdio.h> int main () { /* Put Your Code Here */ return 0; } ```