문제 코드 // Name: rtl.c // Compile: gcc -o rtl rtl.c -fno-PIE -no-pie #include #include const char* binsh = "/bin/sh"; int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Add system function to plt's entry system("echo 'system@plt"); // Leak canary printf("[1] Leak Canary\n"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); // Overwrite retur..
인공지능(AI, Artificial Intelligence) : 인간의 학습능력과 추론능력, 언어이해능력을 컴퓨터 프로그램으로 실현하는 학문 또는 기술입니다. 사람의 지능과 마찬가지로 '문제해결능력', '학습', '범용성'의 세 가지 특징을 가지고 있다. 1. 문제해결능력 : 수식 계산, 사진 속 대상 판단, 알파고의 바둑판을 이해하고 다음 수를 결정하는 것 등 문제를 해결하기 위한 지능적인 행동을 의미한다. 2. 학습 : 과거에는 지능을 구현하기 위해 사람이 직접 모든 프로그램을 작성했지만 복잡해질 경우 사람이 설계하는 것이 불가능하여 이를 해결하기 위해 입력과 출력의 데이터가 주어지면 규칙을 자동으로 파악하는 모델인 '머신러닝'과 '딥러닝'을 만들었다. 3. 범용성 딥려닝 모델을 수정하여 다양한 분야..
예제 // Name: rao.c // Compile: gcc -o rao rao.c -fno-stack-protector -no-pie #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL); } int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0; } A를 여러개 입력했을 때, Segmentation fault라는 에러가 출력되며, 프로그램이 비정..
orw 셸코드 char buf[0x30]; int fd = open("/tmp/flag", RD_ONLY, NULL); read(fd, buf, 0x30); write(1, buf, 0x30); syscall rax arg0 (rdi) arg1 (rsi) arg2 (rdx) read 0x00 unsigned int fd char *buf size_t count write 0x01 unsigned int fd const char *buf size_t count open 0x02 const char *filename int flags umode_t mode 1. int fd = open(“/tmp/flag”, O_RDONLY, NULL) syscall rax arg0 (rdi) arg1 (rsi) arg2 ..
0x0000000000401136 :endbr64 // 인텔 프로세서 관련 보안 기술 0x000000000040113a :push rbp // rbp 레지스터의 값을 스택에 push 0x000000000040113b :mov rbp,rsp // rsp의 값을 rbp에 대입 0x000000000040113e :lea rax,[rip+0xebf] # 0x402004 // [rip+0xebf]의 유효주소를 rax에 대입 0x0000000000401145 :mov rdi,rax // rax의 값을 rdi에 대입 0x0000000000401148 :mov eax,0x0 // 0x0을 eax에 대입 0x000000000040114d :call 0x401040 // printf 함수 호출 0x0000000000401..
gdb : 리눅스의 대표적인 디버거. 실습예제 // Name: debugee.c // Compile: gcc -o debugee debugee.c -no-pie #include int main(void) { int sum = 0; int val1 = 1; int val2 = 2; sum = val1 + val2; printf("1 + 2 = %d\n", sum); return 0; } gdb debugee로 디버깅 시작 $ gcc -o debugee debugee.c -no-pie $ gdb debugee 리눅스는 실행파일의 형식으로 ELF (Executable and Linkable Format)를 규정하고 있다. ELF는 크게 헤더 와 여러 섹션 들로 구성되어 있다. 헤더에는 실행에 필요한 여러 정보..
* 웜 : 감염된 컴퓨터 시스템에서 스스로를 복제하고 다른 컴퓨터로 복사본을 확산시킬 수 있는 악성 프로그램이다. 네트워크를 이용해 자신의 복사본을 다른 컴퓨터로 전송할 수 있으며, 때때로 자신의 복사본을 계속 만들어 하드 드라이브와 네트워크에 과부하를 주거나 대역폭과 같은 시스템 리소스를 고갈시킬 수 있다. 웜은 바이러스와 다르게 사람의 개입 없이 확산될 수 있는 자가 복제 프로그램이다.웜은 일단 시스템에 감염되면 스스로 새로운 감염원을 찾아 감염시킬 수 있다. * 웜의 감염 : 웜은 바이러스와 같이 호스트 프로그램이 필요하지 않기 때문에 다양한 운영 체제 취약점을 이용해 능동적으로 활용할 수 있다. 네트워크의 취점을 이용해 ActiveX, HTML 페이지에 숨어 있다가 사용자가 웹 페이지에 접속하면 ..
Opcode: 스택 * push val: val을 스택 최상단에 쌓음 연산 rsp -= 8 [rsp] = val * pop reg: 스택 최상단의 값을 꺼내서 reg에 대입 연산 rsp += 8 reg = [rsp-8] Opcode: 프로시저 컴퓨터 과학에서 프로시저(Procedure)는 특정 기능을 수행하는 코드 조각을 말한다. 프로시저를 사용하면 반복되는 연산을 프로시저 호출로 대체할 수 있어서 전체 코드의 크기를 줄일 수 있으며, 기능별로 코드 조각에 이름을 붙일 수 있게 되어 코드의 가독성을 크게 높일 수 있다. 프로시저를 부르는 행위를 호출(Call)이라고 부르며, 프로시저에서 돌아오는 것을 반환(Return)이라고 부른다. 프로시저를 호출할 때는 프로시저를 실행하고 나서 원래의 실행 흐름으로 ..