# Assembly analysis for override pt 2
# level08
```
objdump -M intel -d level08
objdump -s -j .rodata level08
```
## main
```
4009f0: 55 push rbp
4009f1: 48 89 e5 mov rbp,rsp
4009f4: 48 81 ec b0 00 00 00 sub rsp,0xb0
4009fb: 89 bd 6c ff ff ff mov DWORD PTR [rbp-0x94],edi
400a01: 48 89 b5 60 ff ff ff mov QWORD PTR [rbp-0xa0],rsi
400a08: 64 48 8b 04 25 28 00 mov rax,QWORD PTR fs:0x28
400a11: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax
400a15: 31 c0 xor eax,eax
```
Sets up stack frame and allocates 176 bytes for the stack. Store the initial value of edi argc? in `[rbp-0x94]` aka **argc_stack** and rsi argv? in `[rbp-0xa0]` aka **argv_stack**
store 40 in `[rbp-0x8]` aka **count** and clears eax
```
400a17: c6 45 8f ff mov BYTE PTR [rbp-0x71],0xff
400a1b: c7 45 88 ff ff ff ff mov DWORD PTR [rbp-0x78],0xffffffff
400a22: 83 bd 6c ff ff ff 02 cmp DWORD PTR [rbp-0x94],0x2
400a29: 74 1f je 400a4a <main+0x5a>
400a2b: 48 8b 85 60 ff ff ff mov rax,QWORD PTR [rbp-0xa0]
400a32: 48 8b 10 mov rdx,QWORD PTR [rax]
400a35: b8 57 0d 40 00 mov eax,0x400d57
400a3a: 48 89 d6 mov rsi,rdx
400a3d: 48 89 c7 mov rdi,rax
400a40: b8 00 00 00 00 mov eax,0x0
400a45: e8 e6 fc ff ff call 400730 <printf@plt>
400a4a: ba 6b 0d 40 00 mov edx,0x400d6b
400a4f: b8 6d 0d 40 00 mov eax,0x400d6d
400a54: 48 89 d6 mov rsi,rdx
400a57: 48 89 c7 mov rdi,rax
400a5a: e8 61 fd ff ff call 4007c0 <fopen@plt>
400a5f: 48 89 85 78 ff ff ff mov QWORD PTR [rbp-0x88],rax
400a66: 48 83 bd 78 ff ff ff cmp QWORD PTR [rbp-0x88],0x0
400a6d: 00
400a6e: 75 21 jne 400a91 <main+0xa1>
400a70: b8 7c 0d 40 00 mov eax,0x400d7c
400a75: be 6d 0d 40 00 mov esi,0x400d6d
400a7a: 48 89 c7 mov rdi,rax
400a7d: b8 00 00 00 00 mov eax,0x0
400a82: e8 a9 fc ff ff call 400730 <printf@plt>
400a87: bf 01 00 00 00 mov edi,0x1
400a8c: e8 3f fd ff ff call 4007d0 <exit@plt>
```
Store 0xff in `[rbp-0x71]` aka **currchar**, compare **argc** with 0x2. If it is equal, dont log usage. If not, load **argv_stack[0]** and call `printf("Usage: %s filename", argv[0])`. call `fopen("/backups/.log", "w")`. Move the return value to `[rbp-0x88]` aka **logfile** and compare it with 0. If its not equal, jump to `400a91`. else, `printf("ERROR: Failed to open %s", "/backups/.log");` and `exit(1)`
```
400a91: 48 8b 85 60 ff ff ff mov rax,QWORD PTR [rbp-0xa0]
400a98: 48 83 c0 08 add rax,0x8
400a9c: 48 8b 10 mov rdx,QWORD PTR [rax]
400a9f: 48 8b 85 78 ff ff ff mov rax,QWORD PTR [rbp-0x88]
400aa6: be 96 0d 40 00 mov esi,0x400d96
400aab: 48 89 c7 mov rdi,rax
400aae: e8 11 fe ff ff call 4008c4 <log_wrapper>
400ab3: ba a9 0d 40 00 mov edx,0x400da9
400ab8: 48 8b 85 60 ff ff ff mov rax,QWORD PTR [rbp-0xa0]
400abf: 48 83 c0 08 add rax,0x8
400ac3: 48 8b 00 mov rax,QWORD PTR [rax]
400ac6: 48 89 d6 mov rsi,rdx
400ac9: 48 89 c7 mov rdi,rax
400acc: e8 ef fc ff ff call 4007c0 <fopen@plt>
400ad1: 48 89 45 80 mov QWORD PTR [rbp-0x80],rax
400ad5: 48 83 7d 80 00 cmp QWORD PTR [rbp-0x80],0x0
400ada: 75 2d jne 400b09 <main+0x119>
400adc: 48 8b 85 60 ff ff ff mov rax,QWORD PTR [rbp-0xa0]
400ae3: 48 83 c0 08 add rax,0x8
400ae7: 48 8b 10 mov rdx,QWORD PTR [rax]
400aea: b8 7c 0d 40 00 mov eax,0x400d7c
400aef: 48 89 d6 mov rsi,rdx
400af2: 48 89 c7 mov rdi,rax
400af5: b8 00 00 00 00 mov eax,0x0
400afa: e8 31 fc ff ff call 400730 <printf@plt>
400aff: bf 01 00 00 00 mov edi,0x1
400b04: e8 c7 fc ff ff call 4007d0 <exit@plt>
```
Load **argv_stack[1]** into rdx, call `log_wrapper(logfile, "Starting back up:", argv_stack[1])` and call `fopen(argv_stack[1], "r")`and save the result at `[rbp-0x80]` aka **inputfilestream** . If its not null, jump to `400b09` , if it is, `printf("ERROR: Failed to open %s", argv_stack[1])` and `exit(1)
```
400b09: ba ab 0d 40 00 mov edx,0x400dab
400b0e: 48 8d 45 90 lea rax,[rbp-0x70]
400b12: 48 8b 0a mov rcx,QWORD PTR [rdx]
400b15: 48 89 08 mov QWORD PTR [rax],rcx
400b18: 0f b7 4a 08 movzx ecx,WORD PTR [rdx+0x8]
400b1c: 66 89 48 08 mov WORD PTR [rax+0x8],cx
400b20: 0f b6 52 0a movzx edx,BYTE PTR [rdx+0xa]
400b24: 88 50 0a mov BYTE PTR [rax+0xa],dl
400b27: 48 8d 45 90 lea rax,[rbp-0x70]
400b2b: 48 c7 85 58 ff ff ff mov QWORD PTR [rbp-0xa8],0xffffffffffffffff
400b32: ff ff ff ff
400b36: 48 89 c2 mov rdx,rax
400b39: b8 00 00 00 00 mov eax,0x0
400b3e: 48 8b 8d 58 ff ff ff mov rcx,QWORD PTR [rbp-0xa8]
400b45: 48 89 d7 mov rdi,rdx
400b48: f2 ae repnz scas al,BYTE PTR es:[rdi]
400b4a: 48 89 c8 mov rax,rcx
400b4d: 48 f7 d0 not rax
400b50: 48 8d 50 ff lea rdx,[rax-0x1]
400b54: b8 63 00 00 00 mov eax,0x63
400b59: 48 89 c1 mov rcx,rax
400b5c: 48 29 d1 sub rcx,rdx
400b5f: 48 89 ca mov rdx,rcx
400b62: 48 8b 85 60 ff ff ff mov rax,QWORD PTR [rbp-0xa0]
400b69: 48 83 c0 08 add rax,0x8
400b6d: 48 8b 00 mov rax,QWORD PTR [rax]
400b70: 48 89 c1 mov rcx,rax
400b73: 48 8d 45 90 lea rax,[rbp-0x70]
400b77: 48 89 ce mov rsi,rcx
400b7a: 48 89 c7 mov rdi,rax
400b7d: e8 ce fb ff ff call 400750 <strncat@plt>
```
Load "./backups/" into `[rbp-0x70]` aka **prefix**, load a buffer at `[rbp-0xa8]` aka **dest** set up args and call `strcpy(dest, prefix)` and `strncat(prefix, argv[1], 99 - strlen(prefix) - 1)`.
```
400b82: 48 8d 45 90 lea rax,[rbp-0x70]
400b86: ba b0 01 00 00 mov edx,0x1b0
400b8b: be c1 00 00 00 mov esi,0xc1
400b90: 48 89 c7 mov rdi,rax
400b93: b8 00 00 00 00 mov eax,0x0
400b98: e8 13 fc ff ff call 4007b0 <open@plt>
400b9d: 89 45 88 mov DWORD PTR [rbp-0x78],eax
400ba0: 83 7d 88 00 cmp DWORD PTR [rbp-0x78],0x0
400ba4: 79 47 jns 400bed <main+0x1fd>
400ba6: 48 8b 85 60 ff ff ff mov rax,QWORD PTR [rbp-0xa0]
400bad: 48 83 c0 08 add rax,0x8
400bb1: 48 8b 10 mov rdx,QWORD PTR [rax]
400bb4: b8 b6 0d 40 00 mov eax,0x400db6
400bb9: be ab 0d 40 00 mov esi,0x400dab
400bbe: 48 89 c7 mov rdi,rax
400bc1: b8 00 00 00 00 mov eax,0x0
400bc6: e8 65 fb ff ff call 400730 <printf@plt>
400bcb: bf 01 00 00 00 mov edi,0x1
400bd0: e8 fb fb ff ff call 4007d0 <exit@plt>
```
call `open(prefix, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)`. Saves the fd at `[rbp-0x78]` aka **backupfile** and check if greater than 0. If not, ` printf("ERROR: Failed to open %s%s\n", "./backups/", argv_stack[1])` and `exit(1)`. If it is, jump to `400bed` (loop check)
```
400bd5: 48 8d 4d 8f lea rcx,[rbp-0x71]
400bd9: 8b 45 88 mov eax,DWORD PTR [rbp-0x78]
400bdc: ba 01 00 00 00 mov edx,0x1
400be1: 48 89 ce mov rsi,rcx
400be4: 89 c7 mov edi,eax
400be6: e8 15 fb ff ff call 400700 <write@plt>
400beb: eb 01 jmp 400bee <main+0x1fe>
400bed: 90 nop
400bee: 48 8b 45 80 mov rax,QWORD PTR [rbp-0x80]
400bf2: 48 89 c7 mov rdi,rax
400bf5: e8 66 fb ff ff call 400760 <fgetc@plt>
400bfa: 88 45 8f mov BYTE PTR [rbp-0x71],al
400bfd: 0f b6 45 8f movzx eax,BYTE PTR [rbp-0x71]
400c01: 3c ff cmp al,0xff
400c03: 75 d0 jne 400bd5 <main+0x1e5>
```
Call `write(backupfile, currchar, 1)` and jump to `400bee`. at `400bee`, load **inputfielstream** and call `fgets(inputfilestream)` and save result to **currchar**. Compares it with 0xff (EOF). If they are equal, exit the loop.
```
400c05: 48 8b 85 60 ff ff ff mov rax,QWORD PTR [rbp-0xa0]
400c0c: 48 83 c0 08 add rax,0x8
400c10: 48 8b 10 mov rdx,QWORD PTR [rax]
400c13: 48 8b 85 78 ff ff ff mov rax,QWORD PTR [rbp-0x88]
400c1a: be d2 0d 40 00 mov esi,0x400dd2
400c1f: 48 89 c7 mov rdi,rax
400c22: e8 9d fc ff ff call 4008c4 <log_wrapper>
400c27: 48 8b 45 80 mov rax,QWORD PTR [rbp-0x80]
400c2b: 48 89 c7 mov rdi,rax
400c2e: e8 dd fa ff ff call 400710 <fclose@plt>
400c33: 8b 45 88 mov eax,DWORD PTR [rbp-0x78]
400c36: 89 c7 mov edi,eax
400c38: e8 33 fb ff ff call 400770 <close@plt>
400c3d: b8 00 00 00 00 mov eax,0x0
400c42: 48 8b 7d f8 mov rdi,QWORD PTR [rbp-0x8]
400c46: 64 48 33 3c 25 28 00 xor rdi,QWORD PTR fs:0x28
400c4d: 00 00
400c4f: 74 05 je 400c56 <main+0x266>
400c51: e8 ca fa ff ff call 400720 <__stack_chk_fail@plt>
400c56: c9 leave
400c57: c3 ret
```
derefrence **argv_stack[1]** into rdx and call `log_wrapper(logfile, "Finished back up", argv_stack[1])`. close `fclose(inputfilestream)` and `close(backupfile)` and return.
## log_wrapper
```
4008c4: 55 push rbp
4008c5: 48 89 e5 mov rbp,rsp
4008c8: 48 81 ec 30 01 00 00 sub rsp,0x130
4008cf: 48 89 bd e8 fe ff ff mov QWORD PTR [rbp-0x118],rdi
4008d6: 48 89 b5 e0 fe ff ff mov QWORD PTR [rbp-0x120],rsi
4008dd: 48 89 95 d8 fe ff ff mov QWORD PTR [rbp-0x128],rdx
4008e4: 64 48 8b 04 25 28 00 mov rax,QWORD PTR fs:0x28
4008eb: 00 00
4008ed: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax
4008f1: 31 c0 xor eax,eax
4008f3: 48 8b 95 e0 fe ff ff mov rdx,QWORD PTR [rbp-0x120]
4008fa: 48 8d 85 f0 fe ff ff lea rax,[rbp-0x110]
400901: 48 89 d6 mov rsi,rdx
400904: 48 89 c7 mov rdi,rax
400907: e8 e4 fd ff ff call 4006f0 <strcpy@plt>
```
Setus up stack and allocates 304 bytes for the stack. Load arg1 at `[rbp-0x118]` aka **logfile**, arg2 at `[rbp-0x120]` aka **string**, arg3 at `[rbp-0x128]` aka **inpfile_path**. write 40 to `[rbp-0x8]` aka **count**. Load a new variable at `[rbp-0x110]` aka **dest**, call `strcpy(dest, string)`.
```
40090c: 48 8b b5 d8 fe ff ff mov rsi,QWORD PTR [rbp-0x128]
400913: 48 8d 85 f0 fe ff ff lea rax,[rbp-0x110]
40091a: 48 c7 85 d0 fe ff ff mov QWORD PTR [rbp-0x130],0xffffffffffffffff
400921: ff ff ff ff
400925: 48 89 c2 mov rdx,rax
400928: b8 00 00 00 00 mov eax,0x0
40092d: 48 8b 8d d0 fe ff ff mov rcx,QWORD PTR [rbp-0x130]
400934: 48 89 d7 mov rdi,rdx
400937: f2 ae repnz scas al,BYTE PTR es:[rdi]
400939: 48 89 c8 mov rax,rcx
40093c: 48 f7 d0 not rax
40093f: 48 8d 50 ff lea rdx,[rax-0x1]
400943: b8 fe 00 00 00 mov eax,0xfe
400948: 49 89 c0 mov r8,rax
40094b: 49 29 d0 sub r8,rdx
40094e: 48 8d 85 f0 fe ff ff lea rax,[rbp-0x110]
400955: 48 c7 85 d0 fe ff ff mov QWORD PTR [rbp-0x130],0xffffffffffffffff
40095c: ff ff ff ff
400960: 48 89 c2 mov rdx,rax
400963: b8 00 00 00 00 mov eax,0x0
400968: 48 8b 8d d0 fe ff ff mov rcx,QWORD PTR [rbp-0x130]
40096f: 48 89 d7 mov rdi,rdx
400972: f2 ae repnz scas al,BYTE PTR es:[rdi]
400974: 48 89 c8 mov rax,rcx
400977: 48 f7 d0 not rax
40097a: 48 8d 50 ff lea rdx,[rax-0x1]
40097e: 48 8d 85 f0 fe ff ff lea rax,[rbp-0x110]
400985: 48 01 d0 add rax,rdx
400988: 48 89 f2 mov rdx,rsi
40098b: 4c 89 c6 mov rsi,r8
40098e: 48 89 c7 mov rdi,rax
400991: b8 00 00 00 00 mov eax,0x0
400996: e8 a5 fd ff ff call 400740 <snprintf@plt>
40099b: 48 8d 85 f0 fe ff ff lea rax,[rbp-0x110]
4009a2: be 4c 0d 40 00 mov esi,0x400d4c
4009a7: 48 89 c7 mov rdi,rax
4009aa: e8 d1 fd ff ff call 400780 <strcspn@plt>
4009af: c6 84 05 f0 fe ff ff mov BYTE PTR [rbp+rax*1-0x110],0x0
```
Prepare arguments to call `snprintf(dest + strlen(dest), 254 - strlen(dest) - 1, inpfile_path)` and then calls `dest[strcspn(dest, "/n")] = 0`
```
4009b7: b9 4e 0d 40 00 mov ecx,0x400d4e
4009bc: 48 8d 95 f0 fe ff ff lea rdx,[rbp-0x110]
4009c3: 48 8b 85 e8 fe ff ff mov rax,QWORD PTR [rbp-0x118]
4009ca: 48 89 ce mov rsi,rcx
4009cd: 48 89 c7 mov rdi,rax
4009d0: b8 00 00 00 00 mov eax,0x0
4009d5: e8 c6 fd ff ff call 4007a0 <fprintf@plt>
4009da: 48 8b 45 f8 mov rax,QWORD PTR [rbp-0x8]
4009de: 64 48 33 04 25 28 00 xor rax,QWORD PTR fs:0x28
4009e5: 00 00
4009e7: 74 05 je 4009ee <log_wrapper+0x12a>
4009e9: e8 32 fd ff ff call 400720 <__stack_chk_fail@plt>
4009ee: c9 leave
4009ef: c3 ret
```
Call `fprintf(logfile, "LOG: %s", dest)` and returns.
# level09
```
objdump -M intel -d level09
objdump -s -j .rodata level09
```
## main
```
aa8: 55 push rbp
aa9: 48 89 e5 mov rbp,rsp
aac: 48 8d 3d 5d 01 00 00 lea rdi,[rip+0x15d] # c10 <_IO_stdin_used+0x58>
ab3: e8 78 fc ff ff call 730 <puts@plt>
ab8: e8 03 fe ff ff call 8c0 <handle_msg>
abd: b8 00 00 00 00 mov eax,0x0
ac2: 5d pop rbp
ac3: c3 ret
```
Load a string and calls
```
puts("--------------------------------------------\n| ~Welcome to l33t-m$n ~ v1337 |\n--------------------------------------------");
```
calls `handle_msg()` and returns 0;
## handle_msg
```
8c0: 55 push rbp
8c1: 48 89 e5 mov rbp,rsp
8c4: 48 81 ec c0 00 00 00 sub rsp,0xc0
8cb: 48 8d 85 40 ff ff ff lea rax,[rbp-0xc0]
8d2: 48 05 8c 00 00 00 add rax,0x8c
8d8: 48 c7 00 00 00 00 00 mov QWORD PTR [rax],0x0
8df: 48 c7 40 08 00 00 00 mov QWORD PTR [rax+0x8],0x0
8e6: 00
8e7: 48 c7 40 10 00 00 00 mov QWORD PTR [rax+0x10],0x0
8ee: 00
8ef: 48 c7 40 18 00 00 00 mov QWORD PTR [rax+0x18],0x0
8f6: 00
8f7: 48 c7 40 20 00 00 00 mov QWORD PTR [rax+0x20],0x0
8fe: 00
8ff: c7 45 f4 8c 00 00 00 mov DWORD PTR [rbp-0xc],0x8c
```
Sets up stack and allocates 192 bytes on the stack. Loads a variable at `[rbp-0xc0]` aka **var1**, increments the pointer to `[rbp-0x34] (c0 - 8c)`, sets `[rbp-0x34]`, `[rbp-0x34+0x8]`, `[rbp-0x34+0x10]`, `[rbp-0x34+0x20]` to 0, and writes 140 to `[rbp-0xc]` aka **num**. Since this is a 64 bit program, a word is 8 bytes so we can assume that `[rbp-0x34]` to `[rbp-0xc]` are contigious zeroes `memset([rbp-0x34], 0, 40)`.
Since the assembly only loaded one address from memory and assigns values relatively, we can also say that they are loading a struct like so
```
struct my_struct {
char msg[0x8c];
char username[0x28];
int msglen;
};
```
```
906: 48 8d 85 40 ff ff ff lea rax,[rbp-0xc0]
90d: 48 89 c7 mov rdi,rax
910: e8 b8 00 00 00 call 9cd <set_username>
915: 48 8d 85 40 ff ff ff lea rax,[rbp-0xc0]
91c: 48 89 c7 mov rdi,rax
91f: e8 0e 00 00 00 call 932 <set_msg>
924: 48 8d 3d 95 02 00 00 lea rdi,[rip+0x295] # bc0 <_IO_stdin_used+0x8>
92b: e8 00 fe ff ff call 730 <puts@plt>
930: c9 leave
931: c3 ret
```
calls `set_username(&var1)` and `set_msg(&var1)` and call `puts(">: Msg sent!")`
## set_username
```
9cd: 55 push rbp
9ce: 48 89 e5 mov rbp,rsp
9d1: 48 81 ec a0 00 00 00 sub rsp,0xa0
9d8: 48 89 bd 68 ff ff ff mov QWORD PTR [rbp-0x98],rdi
9df: 48 8d 85 70 ff ff ff lea rax,[rbp-0x90]
9e6: 48 89 c6 mov rsi,rax
9e9: b8 00 00 00 00 mov eax,0x0
9ee: ba 10 00 00 00 mov edx,0x10
9f3: 48 89 f7 mov rdi,rsi
9f6: 48 89 d1 mov rcx,rdx
9f9: f3 48 ab rep stos QWORD PTR es:[rdi],rax
9fc: 48 8d 3d e1 01 00 00 lea rdi,[rip+0x1e1] # be4 <_IO_stdin_used+0x2c>
a03: e8 28 fd ff ff call 730 <puts@plt>
a08: 48 8d 05 d0 01 00 00 lea rax,[rip+0x1d0] # bdf <_IO_stdin_used+0x27>
a0f: 48 89 c7 mov rdi,rax
a12: b8 00 00 00 00 mov eax,0x0
a17: e8 34 fd ff ff call 750 <printf@plt>
```
Allocates 160 bytes on the stack, loads argument1 **&var1** at `[rbp-0x98]` and loads variable `[rbp-0x90]` aka **temp**. call `memset(temp, 0, 16)` and call
```
puts(">: Enter your username");
printf(">>: ");
```
```
a1c: 48 8b 05 95 15 20 00 mov rax,QWORD PTR [rip+0x201595] # 201fb8 <_DYNAMIC+0x198>
a23: 48 8b 00 mov rax,QWORD PTR [rax]
a26: 48 89 c2 mov rdx,rax
a29: 48 8d 85 70 ff ff ff lea rax,[rbp-0x90]
a30: be 80 00 00 00 mov esi,0x80
a35: 48 89 c7 mov rdi,rax
a38: e8 33 fd ff ff call 770 <fgets@plt>
a3d: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
a44: eb 24 jmp a6a <set_username+0x9d>
a46: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
a49: 48 98 cdqe
a4b: 0f b6 8c 05 70 ff ff movzx ecx,BYTE PTR [rbp+rax*1-0x90]
a52: ff
a53: 48 8b 95 68 ff ff ff mov rdx,QWORD PTR [rbp-0x98]
a5a: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
a5d: 48 98 cdqe
a5f: 88 8c 02 8c 00 00 00 mov BYTE PTR [rdx+rax*1+0x8c],cl
a66: 83 45 fc 01 add DWORD PTR [rbp-0x4],0x1
a6a: 83 7d fc 28 cmp DWORD PTR [rbp-0x4],0x28
a6e: 7f 11 jg a81 <set_username+0xb4>
a70: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
a73: 48 98 cdqe
a75: 0f b6 84 05 70 ff ff movzx eax,BYTE PTR [rbp+rax*1-0x90]
a7c: ff
a7d: 84 c0 test al,al
a7f: 75 c5 jne a46 <set_username+0x79>
a81: 48 8b 85 68 ff ff ff mov rax,QWORD PTR [rbp-0x98]
a88: 48 8d 90 8c 00 00 00 lea rdx,[rax+0x8c]
a8f: 48 8d 05 65 01 00 00 lea rax,[rip+0x165] # bfb <_IO_stdin_used+0x43>
a96: 48 89 d6 mov rsi,rdx
a99: 48 89 c7 mov rdi,rax
a9c: b8 00 00 00 00 mov eax,0x0
aa1: e8 aa fc ff ff call 750 <printf@plt>
aa6: c9 leave
```
Call `fgets(temp, 120, stdin)`, store 0 at a variable at `[rbp-0x4]` aka **count** and jump to `a6a` (loop check)
In `a6a`, **count** is compared to 40. If its greater than 40, or **temp[count]** is not 0, the loop exits.
In the loop at `a44`, do `var1->username[count] = temp[count]` and `++count`
Once the loop exits at `a81`, call `printf(">: Welcome, %s", var1->username)` and return.
## set_msg
```
932: 55 push rbp
933: 48 89 e5 mov rbp,rsp
936: 48 81 ec 10 04 00 00 sub rsp,0x410
93d: 48 89 bd f8 fb ff ff mov QWORD PTR [rbp-0x408],rdi
944: 48 8d 85 00 fc ff ff lea rax,[rbp-0x400]
94b: 48 89 c6 mov rsi,rax
94e: b8 00 00 00 00 mov eax,0x0
953: ba 80 00 00 00 mov edx,0x80
958: 48 89 f7 mov rdi,rsi
95b: 48 89 d1 mov rcx,rdx
95e: f3 48 ab rep stos QWORD PTR es:[rdi],rax
961: 48 8d 3d 65 02 00 00 lea rdi,[rip+0x265] # bcd <_IO_stdin_used+0x15>
968: e8 c3 fd ff ff call 730 <puts@plt>
96d: 48 8d 05 6b 02 00 00 lea rax,[rip+0x26b] # bdf <_IO_stdin_used+0x27>
974: 48 89 c7 mov rdi,rax
977: b8 00 00 00 00 mov eax,0x0
97c: e8 cf fd ff ff call 750 <printf@plt>
981: 48 8b 05 30 16 20 00 mov rax,QWORD PTR [rip+0x201630] # 201fb8 <_DYNAMIC+0x198>
988: 48 8b 00 mov rax,QWORD PTR [rax]
98b: 48 89 c2 mov rdx,rax
98e: 48 8d 85 00 fc ff ff lea rax,[rbp-0x400]
995: be 00 04 00 00 mov esi,0x400
99a: 48 89 c7 mov rdi,rax
99d: e8 ce fd ff ff call 770 <fgets@plt>
9a2: 48 8b 85 f8 fb ff ff mov rax,QWORD PTR [rbp-0x408]
9a9: 8b 80 b4 00 00 00 mov eax,DWORD PTR [rax+0xb4]
9af: 48 63 d0 movsxd rdx,eax
9b2: 48 8d 8d 00 fc ff ff lea rcx,[rbp-0x400]
9b9: 48 8b 85 f8 fb ff ff mov rax,QWORD PTR [rbp-0x408]
9c0: 48 89 ce mov rsi,rcx
9c3: 48 89 c7 mov rdi,rax
9c6: e8 55 fd ff ff call 720 <strncpy@plt>
9cb: c9 leave
9cc: c3 ret
```
Allocate 1040 bytes to the stack, loads argument1 **&var1** at `[rbp-0x408]` and loads variable at `[rbp-0x400]` aka **temp*. Call `memset(temp, 0, 128)` then `puts(">: Msg @Unix-Dude")` and `printf(">>: ")`.
Call `fgets(temp, 1024, stdin)` and `strncpy(var1->message, temp, var1->msglen)` and return.
## secret_backdoor
```
88c: 55 push rbp
88d: 48 89 e5 mov rbp,rsp
890: 48 83 c4 80 add rsp,0xffffffffffffff80
894: 48 8b 05 1d 17 20 00 mov rax,QWORD PTR [rip+0x20171d] # 201fb8 <_DYNAMIC+0x198>
89b: 48 8b 00 mov rax,QWORD PTR [rax]
89e: 48 89 c2 mov rdx,rax
8a1: 48 8d 45 80 lea rax,[rbp-0x80]
8a5: be 80 00 00 00 mov esi,0x80
8aa: 48 89 c7 mov rdi,rax
8ad: e8 be fe ff ff call 770 <fgets@plt>
8b2: 48 8d 45 80 lea rax,[rbp-0x80]
8b6: 48 89 c7 mov rdi,rax
8b9: e8 82 fe ff ff call 740 <system@plt>
8be: c9 leave
8bf: c3 ret
```
Loads a variable at `[rbp-0x80]` aka **cmd** and calls `fgets(cmd, 128, stdin)` and then `system(cmd)`
## notes
7WJ6jFBzrcjEYXudxnM3kdW7n3qyxR6tk2xGrkSC
```
b *0x8048866
set disassembly-flavor intel
lay asm
focus cmd
tty /dev/pts/1
run < /tmp/level05
x/10s (char*)(*environ)
x/10x 0x080497e0
```