문제를 보면 flag를 출력하는 쉘 코드를 작성해야 하는데, execve 시스템 콜을 사용할 수 없습니다.그래서 강의에서처럼 orw 쉘 코드를 작성해서 문제를 풀어야 합니다.위에 코드처럼 open-read-write를 하면 되는데, pwntools에 쉘 코드를 작성해주
문제 소스코드를 출력해보면scanf() 함수에서 크기에 제한없이 입력을 받고 있어서 버퍼 오버플로우 공격이 가능합니다.그리고 get_shell() 함수를 보면 쉘을 띄워주는 기능을 가지고 있습니다.먼저 gdb로 어셈블리어 코드를 봐보면메모리 구조를 그려보면A 56 +
basic_exploitation_000소스코드를 출력해보면scanf("%141s", buf)에서 buf에는 141 Byte 크기의 문자열을 입력받지만, 입력값이 141 Byte를 넘으면 남는 값은 버퍼에 그대로 남게 됩니다.결론적으로 입력 크기에 제한이 있는 것이 아
문제 소스코드를 출력해보면gets() 함수로 크기에 제한 없이 입력을 받고 있기 때문에 버퍼 오버플로우 공격이 가능합니다.read_flag() 함수를 실행시키면 flag 파일을 읽을 수 있기 때문에, RET에 read_flag() 함수의 주소가 들어가게 하면 될 거 같
문제 코드보호 기법NX 보호 기법이 걸려있어서 쉘 코드를 직접 실행시킬 수 없습니다.Canary가 스택에 삽입되어 있어서 공격을 위해 카나리 값을 릭을 해야 합니다.코드 분석입력을 받는 코드를 봐보면입력 크기에 제한이 없는 scanf 함수가 있습니다. 그래서 처음에는
쉘을 띄워주는 get_shell 함수가 있습니다.read(0, buf, 0x80) 부분에서 버퍼 오버플로우가 발생합니다.임의 주소에 원하는 값을 쓸 수 있는 기능이 있습니다.카나리 보호 기법이 걸려있는데, 코드를 보면 카나리 릭을 할 수가 없어서 다른 방법을 사용해야
먼저 문제 파일에 걸린 방어기법을 확인해보면카나리 방어기법이 걸려있습니다.문제 코드를 보면r2s를 실행시켜보면 buf ~ rbp 사이의 거리가 96 Byte 밖에 안되는데, read로 256 Byte 만큼 입력을 받고 있기 때문에, 카나리 릭을 할 수 있습니다.그리고
Canary와 NX 보호 기법이 걸려있습니다.read함수로 buf~canary 거리 + 1 만큼 입력을 주어 canary 앞 '\\x00'를 제거하면 printf 함수로 카나리를 출력하게 할 수 있습니다.read 함수로 buf에 0x30보다 훨씬 큰 0x100 크기의
첫 번째 read 함수와 printf 함수로 카나리 릭을 하고 puts 함수와 두 번째 read 함수로 ROP를 하는 문제인 거 같습니다.NX방어기법과 Canary 방어기법이 걸려있습니다.익스플로잇 코드를 실행시켜보면 Got EOF while reading in int
read 함수와 write 함수를 이용해서 ROP를 하는 문제인 거 같습니다.NX 보호기법이 걸려있습니다.익스플로잇 코드를 실행시켜보면공격에 성공해서 쉘이 떴습니다.flag 파일을 출력해보면
이번에는 Return-to-Csu 기법을 사용해서 풀어보겠습니다.csu_init1 = 0x40087acsu_init2 = 0x400860call 계산식을 위해 rbx는 0, 여러 함수를 호출하기 위해 rbp는 1로 고정합니다.function에는 호출할 함수의 got가
read 함수와 write 함수를 이용하는 ROP 문제인 것 같습니다.NX 보호 기법이 걸려있습니다.read함수와 write 함수는 인자가 3개 이기 때문에, pop3ret 가젯을 사용하면 됩니다.pop3ret = 0x8048689익스플로잇 코드를 실행시켜보면공격에 성
Hook Overwrite를 하는 문제인 거 같습니다.모든 보호 기법이 다 적용되어 있습니다.스택의 어떤 값을 읽을 수 있다. ⇾ read(0, buf, 0x100); printf("Buf: %s\\n", buf);임의 주소에 임의 값을 쓸 수 있다. ⇾
read 함수를 이용해서 버퍼 오버플로우를 시키고 one-shot gadget으로 RET를 덮는 문제일 거 같습니다.NX와 PIE 보호 기법이 걸려있습니다.첫 번째 one gadget 0x45216을 이용해서 익스플로잇을 해보겠습니다. check는 0이상이면 프로그램이
printf("stdout: %p\\n", stdout)에서 stdout을 이용해서 base를 구할 수 있습니다.\*(long )ptr = \*(ptr+1)을 보면 주소를 덮을 수는 있는데 free(ptr)이라 인자를 전달할 수는 없을 거 같습니다.코드를 실행시켜보면공
index idx에 대한 경계값 검사 없이 바로 해당 주소에 접근하고 있기 때문에 out of bound 오류가 발생합니다.read에서 name에 입력을 받고 있고 scanf에서 idx에 입력을 받고 있어서name에 원하는 값을 입력하고 idx 값을 조정해 comman
쉘을 띄워주는 get_shell 함수가 있습니다.size 만큼 문자열에 입력을 받고 입력 받은 길이에 해당하는 인덱스에 '\\0'을 넣어주는 read_str 함수가 있습니다.age가 0이면 쉘을 띄웁니다.⇾ A를 20개 입력하면 name20에 접근하여 0을 넣게 되고
쉘을 띄워주는 get_shell() 함수가 있습니다.printf(buf) 부분에서 포멧 스트링 버그가 발생합니다.exit() 함수의 got 를 get_shell() 함수의 got 로 overwrite 하면 쉘을 띄울 수 있습니다.NX 방어기법이 걸려있습니다.바로 0x4
쉘을 띄워주는 get_shell() 함수가 있습니다.sprintf(stack_buf, heap_buf) 부분에서 포멧 스트링 버그가 발생합니다.heap_buf에 %\[n]c 를 넣으면 n 바이트 길이의 문자열이 stack_buf에 들어가는데, 만약 n이 stack_bu
Human과 Robot 구조체는 16 Byte \* 3으로 크기가 같습니다.human_func() 함수와 robot_func() 함수를 보면 메모리 할당 후 초기화를 하지 않습니다.⇾ 두 구조체가 크기가 같기 때문에 Human 구조체의 age에 onegadget 주소를
원하는 크기의 청크를 할당, 해제할 수 있습니다.case 2에서 청크를 해제하고 초기화지 하지 않아서 Double Free Bug가 발생합니다.case 3와 Double Free Bug를 이용해 libc base를 릭할 수 있습니다.case 4를 통해 보호 기법을 우회
1번을 통해 원하는 크기의 청크를 할당할 수 있습니다.2번을 이용해서 보호 기법을 우회할 수 있습니다.3번을 통해 청크를 해제할 수 있는데, 청크를 해제후 초기화하지 않고 있어서 Double Free Bug가 발생합니다.쉘을 띄워주는 get_shell() 함수가 있습니
Canary와 NX 보호 기법이 걸려있습니다.1번을 통해 원하는 크기의 청크를 할당할 수 있습니다.2번을 통해 청크를 해제할 수 있는데, 청크를 해제후 초기화하지 않고 있어서 Double Free Bug가 발생합니다.근데 이번에는 청크 값을 수정할 수 있는 함수가 없어
쉘을 띄워주는 get_shell 함수가 있습니다.size가 256 초과거나 0미만이면 프로그램을 종료합니다.size 값을 입력 받고 size-1만큼 buf에 입력을 받습니다.⇾ size에 0을 넣으면 if문을 우회할 수 있습니다. 그리고 read 함수의 세번째 인자는
system 함수를 통해 명령어를 실행하고 있기 때문에 command injection이 발생할 수 있습니다.read(0, center_name, 100) 부분에서 버퍼 오버플로우가 발생해서 cmd_ip 값을 조작할 수 있습니다.offset : 0x20; 구분자를 사용
모든 보호 기법이 꺼져 있습니다.read(0, s, 0x400)으로 인해 버퍼 오버플로우가 발생합니다.validate(s, 128) 함수를 호출합니다.문자열의 처음 열 글자는 DREAMHACK!이어야 합니다.문자열의 12번째 글자부터 128번째 글자 까지는 s\[i]
read함수 밖에 없어서 libc base를 구할 수 없을 때는 read나 sleep함수를 syscall 가젯으로 만들어 익스플로잇을 할 수 있습니다.read 함수를 봐보면 끝에 1 바이트만 주소가 변하고 앞에 주소는 동일하게 유지됩니다.그래서 뒤에 1바이트 주소를 0
사용자로 부터 쉘 코드를 입력 받고 실행을 시킵니다.open, execve, execveat, write 시스템 콜을 사용할 수 없습니다.open 대신 openat을 write 대신 sendfile을 사용하면 될거 같습니다.
STRICT 모드라 read, write, exit, sigreturn 시스템 콜만 호출 가능합니다.처음에는 강의 내용대로 syscall 번호에 0x40000000를 or 연산해서 seccomp을 우회하려고 했는데익스플로잇 코드를 실행시켜보면쉘이 안뜹니다.gdb로 봐보
1번 옵션으로 쓰레드를 생성할 수 있습니다.2번 옵션으로 size를 입력하고 해당 size 만큼 입력을 받을 수 있습니다. 그래서 버퍼 오버플로우가 발생합니다.3번 옵션을 보면 read 함수로 1024 Byte 크기의 입력을 받고 있어서 버퍼 오버플로우가 발생합니다.C
실습에서 했던 것처럼 카나리를 무작위 값으로 변조하고 해당 값으로 카나리 값을 덮어 보호 기법을 우회하면 될거 같습니다.Canary와 NX 방어 기법이 걸려있습니다.환경: ubuntu 18.04먼저 버퍼와 카나리 거리 차를 구해보면거리차는 0x948 입니다.익스플로잇
모든 보호기법이 다 걸려있습니다.출력되는 stdout 값을 통해 libc_base 값을 구할 수 있습니다.임의 주소 쓰기 취약점이 존재합니다.local 환경에서 익스플로잇을 해보면쉘이 뜹니다.이제 원격 환경에서 익스플로잇을 해보면쉘이 안뜹니다.그래서 구글링을 해보니 l
read_file() 함수에서 flag 파일을 열고 읽고 있습니다.stdout을 출력하고 있습니다.임의 주소 읽기 취약점이 존재합니다.⇾ 예제처럼 \_\_environ 주소를 기준으로 스택에서 flag 파일 주소를 알아내고 임의 주소 읽기 취약점으로 flag 파일 내용
stdout이 출력되어 libc base를 구할 수 있습니다.임의 주소 쓰기 취약점이 존재합니다.쉘을 띄워주는 get_shell() 함수가 존재합니다.⇾ 임의 주소 쓰기 취약점을 이용해서 dl_rtld_lock_recursive를 get_shell()로 덮어 쉘을 따면
buf 크기가 16 바이트인데 1024 바이트 만큼 입력을 받고 있어서 버퍼 오버플로우가 발생합니다.gadget 함수를 이용해 SROP 공격을 할 수 있습니다.
8 바이트 버퍼에 0x400 바이트 크기의 입력을 받아서 버퍼 오버플로우가 발생합니다.바이너리에 "/bin/sh" 문자열이 존재합니다.PIE가 걸려있지 않아서 "/bin/sh" 문자열을 사용할 수 있을거 같습니다.익스플로잇 코드를 실행시켜보면쉘이 뜹니다.flag 파일을
"flag" 파일을 읽고, flag_buf 변수에 저장"testfile" 파일을 쓰기 모드로 열었고 파일 포인터에 300 바이트 만큼의 값을 입력할 수 있습니다. 그래서 \_IO_FILE 구조체를 조작할 수 있습니다.익스플로잇 코드를 실행시켜보면flag가 출력됩니다.
"/etc/issue" 파일을 열고, 파일 포인터에 300 바이트 만큼의 값을 입력할 수 있습니다.fread 함수를 통해 파일의 내용을 읽고, 출력합니다. 이때 overwrite_me 변수 값이 0xDEADBEEF라면 read_flag 함수를 호출해 "flag" 파일의