Stack BoF / Heap BoF
[root@localhost ~]# vi bof_auth.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int check_auth(char *password) { // 패스워드가 맞는지 확인하는 함수
int auth = 0;
char temp[16]; // 16바이트만큼 temp 크기 할당
strncpy(temp, password, strlen(password));
// temp에 password의 길이만큼 저장하고 길이가 16 이상이면 버퍼오버플로우 발생
if (!strcmp(temp, "SECRET_PASSWORD"))
auth = 1;
// auth가 temp 뒤에 존재하므로 temp의 값을 길게 해서 조작하면
// auth의 값을 0 말고 다른 숫자로 만들 수 있다
return auth;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: ./sbof ADMIN_PASSWORD\n");
exit(-1);
}
if (check_auth(argv[1]))
printf("Hello Admin\n");
} else {
printf("Access Denied\n");
}
}
메모리 보호 기법
ASLR(Address Space Layout Randomize)
NX(None eXecute) bit
Stack Guard -> Canary
[root@localhost ~]# cat /proc/sys/kernel/randomize_va_space
2

[root@localhost ~]# cat /proc/self/maps | grep stack

[root@localhost ~]# gcc -o bof_auth bof_auth.c -fno-stack-protector

GDB
[root@localhost ~]# vi hello
#include <stdio.h>
int main() {
char str[] = "Hello World";
printf("%s",str);
return 0;
}

[root@localhost ~]# dnf install gdb
[root@localhost ~]# gdb hello



dnf install glibc-2.34-168.e19_6.23.x86_64



Assembly Language
Intel / AT&T
Opcoe | Operand1 | Operand2
ADD EAX EBX
범용(EAX, EBX, ECX, EDX)
인덱스(ESI, EDI)
포인터 레지스터(EIP, ESP, EBP)
vi add.c
gcc -o add add.c
./add

vi add.assem
vi name.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(void) {
char secret[16] = "secret message";
char barrier[4] = {};
char name[8] = {};
memset(barrier, 0, 4);
printf("Your Name : ");
read(0, name, 12);
printf("Your Name is %s.", name);
}
[root@localhost ~]# gcc -o name name.c -fno-stack-protector

[root@localhost ~]# ./name

Race Condition
> Mutual exclusion(상호 배제) / Deadlock(교착 상태) / Starvation(기아 상태)
>> 세마포어(Semaphore) / 뮤텍스(Mutex)