Copy [0x000009e0]> pdf @ sub.malloc_b7d
/ (fcn) sub.malloc_b7d 437
| sub.malloc_b7d (int arg_8h);
| ; var int local_20h @ rbp-0x20
| ; var int local_1ch @ rbp-0x1c
| ; var int local_18h @ rbp-0x18
| ; var int local_10h @ rbp-0x10
| ; var int local_8h @ rbp-0x8
| ; var int local_0h @ rbp-0x0
| ; arg int arg_8h @ rbp+0x8
| ; UNKNOWN XREF from 0x00001144 (main + 127)
| ; CALL XREF from 0x00001144 (main + 127)
| 0x00000b7d push rbp
| 0x00000b7e mov rbp, rsp
| 0x00000b81 sub rsp, 0x20
| 0x00000b85 mov rax, qword fs:[0x28] ; [0x28:8]=0x2170 ; '('
| 0x00000b8e mov qword [local_8h], rax
| 0x00000b92 xor eax, eax
| 0x00000b94 mov qword [local_18h], 0 ; 初始化 [local_18h]
| 0x00000b9c mov qword [local_10h], 0 ; 初始化 [local_10h]
| 0x00000ba4 mov eax, dword [0x0020208c] ; [0x20208c:4]=0 ; 取出当前 gundam 数量
| 0x00000baa cmp eax, 8
| ,=< 0x00000bad ja 0xd17 ; 如果大于 8,函数返回
| | 0x00000bb3 mov edi, 0x28 ; 否则继续
| | 0x00000bb8 call sym.imp.malloc ; [local_18h] = malloc(0x28) 分配一块内存作为 gundam
| | 0x00000bbd mov qword [local_18h], rax
| | 0x00000bc1 mov rax, qword [local_18h]
| | 0x00000bc5 mov edx, 0x28 ; '('
| | 0x00000bca mov esi, 0
| | 0x00000bcf mov rdi, rax
| | 0x00000bd2 call sym.imp.memset ; memset([local_18h], 0, 0x28) 进行初始化
| | 0x00000bd7 mov edi, 0x100
| | 0x00000bdc call sym.imp.malloc ; [local_10h] = malloc(0x100) 分配一块内存作为 name
| | 0x00000be1 mov qword [local_10h], rax
| | 0x00000be5 cmp qword [local_10h], 0
| ,==< 0x00000bea jne 0xc02
| || 0x00000bec lea rdi, str.error ; 0x1295 ; "error !"
| || 0x00000bf3 call sym.imp.puts ; int puts(const char *s)
| || 0x00000bf8 mov edi, 0xffffffff ; -1
| || 0x00000bfd call sym.imp.exit ; void exit(int status)
| || ; JMP XREF from 0x00000bea (sub.malloc_b7d)
| `--> 0x00000c02 lea rdi, str.The_name_of_gundam_: ; 0x129d ; "The name of gundam :"
| | 0x00000c09 mov eax, 0
| | 0x00000c0e call sym.imp.printf ; int printf(const char *format)
| | 0x00000c13 mov rax, qword [local_10h]
| | 0x00000c17 mov edx, 0x100
| | 0x00000c1c mov rsi, rax
| | 0x00000c1f mov edi, 0
| | 0x00000c24 call sym.imp.read ; read(0, [local_10h], 0x100) 读入字符到 name
| | 0x00000c29 mov rax, qword [local_18h] ; 取出 gundam
| | 0x00000c2d mov rdx, qword [local_10h]
| | 0x00000c31 mov qword [rax + 8], rdx ; 将 name 放到 gundam->name
| | 0x00000c35 lea rdi, str.The_type_of_the_gundam_: ; 0x12b2 ; "The type of the gundam :"
| | 0x00000c3c mov eax, 0
| | 0x00000c41 call sym.imp.printf ; int printf(const char *format)
| | 0x00000c46 lea rax, [local_20h]
| | 0x00000c4a mov rsi, rax
| | 0x00000c4d lea rdi, [0x000012cb] ; "%d"
| | 0x00000c54 mov eax, 0
| | 0x00000c59 call sym.imp.__isoc99_scanf ; 读入 type 到 [local_20h]
| | 0x00000c5e mov eax, dword [local_20h]
| | 0x00000c61 test eax, eax
| ,==< 0x00000c63 js 0xc6d
| || 0x00000c65 mov eax, dword [local_20h] ; 大于等于 0 时继续
| || 0x00000c68 cmp eax, 2
| ,===< 0x00000c6b jle 0xc83 ; 小于等于 2 时跳转
| ||| ; JMP XREF from 0x00000c63 (sub.malloc_b7d)
| |`--> 0x00000c6d lea rdi, str.Invalid. ; 0x12ce ; "Invalid."
| | | 0x00000c74 call sym.imp.puts ; int puts(const char *s)
| | | 0x00000c79 mov edi, 0
| | | 0x00000c7e call sym.imp.exit ; void exit(int status)
| | | ; JMP XREF from 0x00000c6b (sub.malloc_b7d)
| `---> 0x00000c83 mov eax, dword [local_20h]
| | 0x00000c86 movsxd rdx, eax
| | 0x00000c89 mov rax, rdx
| | 0x00000c8c shl rax, 2
| | 0x00000c90 add rax, rdx ; '('
| | 0x00000c93 shl rax, 2 ; 最后得到 rax = rax * 20
| | 0x00000c97 lea rdx, str.Freedom ; 0x202020 ; "Freedom" ; 取出起始地址
| | 0x00000c9e add rdx, rax ; rdx 为字符串 type 的地址
| | 0x00000ca1 mov rax, qword [local_18h]
| | 0x00000ca5 add rax, 0x10 ; 取出 gundam->type
| | 0x00000ca9 mov rsi, rdx
| | 0x00000cac mov rdi, rax
| | 0x00000caf call sym.imp.strcpy ; strcpy(gundam->type, type) 将字符串复制过去
| | 0x00000cb4 mov rax, qword [local_18h] ; 取出 gundam
| | 0x00000cb8 mov dword [rax], 1 ; 将 gundam->flag 赋值为 1
| | 0x00000cbe mov dword [local_1ch], 0 ; 循环计数 i,初始化为 0
| ,==< 0x00000cc5 jmp 0xd02 ; 开始循环
| || ; JMP XREF from 0x00000d06 (sub.malloc_b7d)
| .---> 0x00000cc7 mov eax, dword [local_1ch]
| :|| 0x00000cca lea rdx, [rax*8]
| :|| 0x00000cd2 lea rax, [0x002020a0] ; 取出 factory 地址
| :|| 0x00000cd9 mov rax, qword [rdx + rax] ; 找到 factory[i]
| :|| 0x00000cdd test rax, rax
| ,====< 0x00000ce0 jne 0xcfe ; 不为 0 时继续下一次循环
| |:|| 0x00000ce2 mov eax, dword [local_1ch] ; 否则继续
| |:|| 0x00000ce5 lea rcx, [rax*8]
| |:|| 0x00000ced lea rax, [0x002020a0]
| |:|| 0x00000cf4 mov rdx, qword [local_18h] ; 取出 gundam
| |:|| 0x00000cf8 mov qword [rcx + rax], rdx ; 将 gundam 放到 factory[i]
| ,=====< 0x00000cfc jmp 0xd08 ; 结束循环
| ||:|| ; JMP XREF from 0x00000ce0 (sub.malloc_b7d)
| |`----> 0x00000cfe add dword [local_1ch], 1 ; i = i + 1
| | :|| ; JMP XREF from 0x00000cc5 (sub.malloc_b7d)
| | :`--> 0x00000d02 cmp dword [local_1ch], 8 ; 最多能有 9 个 gundam
| | `===< 0x00000d06 jbe 0xcc7 ; 循环继续
| | | ; JMP XREF from 0x00000cfc (sub.malloc_b7d)
| `-----> 0x00000d08 mov eax, dword [0x0020208c] ; [0x20208c:4]=0
| | 0x00000d0e add eax, 1 ; gundam 数量 + 1
| | 0x00000d11 mov dword [0x0020208c], eax ; [0x20208c:4]=0 ; 放回去
| | ; JMP XREF from 0x00000bad (sub.malloc_b7d)
| `-> 0x00000d17 mov eax, 0
| 0x00000d1c mov rcx, qword [local_8h]
| 0x00000d20 xor rcx, qword fs:[0x28]
| ,=< 0x00000d29 je 0xd30
| | 0x00000d2b call sym.imp.__stack_chk_fail ; void __stack_chk_fail(void)
| | ; JMP XREF from 0x00000d29 (sub.malloc_b7d)
| `-> 0x00000d30 leave
\ 0x00000d31 ret
[0x000009e0]> px 60 @ 0x00202020
- offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x00202020 4672 6565 646f 6d00 0000 0000 0000 0000 Freedom.........
0x00202030 0000 0000 5374 7269 6b65 2046 7265 6564 ....Strike Freed
0x00202040 6f6d 0000 0000 0000 4167 6965 7300 0000 om......Agies...
0x00202050 0000 0000 0000 0000 0000 0000