문제 코드 // 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..
예제 // 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)이라고 부른다. 프로시저를 호출할 때는 프로시저를 실행하고 나서 원래의 실행 흐름으로 ..
기본 명령어 · su : Switch User · sudo : SuperUser DO sudo [명령어] : superuser 권한으로 명령어 실행 설치 및 파일 수정할 때 superuser 권한이 필요 · sudo su : superuser 계정으로 전환 · whoami : 현재 사용자 확인 · exit : superuser 계정이었다면 이전의 계정으로 이동 · pwd : Print Working Directory, 현재 위치한 디렉토리를 보여줌 · sudo apt-get install [설치할 프로그램명] superuser 권한으로 설치 터미널 켰을 때나 설치 후에 한 번씩 sudo apt-get update 해주기 자매품으로 sudo apt-get upgrade도 있음 · cd : Change Di..