[dreamhack] Linux Exploitation1 & Minigation Part 1 / Return Address Overwrite & NOP Sled
2021. 1. 27. 18:00
Study/System Hacking
스택 버퍼 오버플로우 취약점이 있을 때 스택의 리턴 주소를 덮어서 실행 흐름을 조작한다. 리턴 주소는 현재 함수가 종료된 후 이전 함수로 되돌아가기 위한 주소로 스택에 저장된 리턴 주소를 바꾸면 프로그램 실행 흐름을 공격자가 원하는대로 조작할 수 있다. // gcc -o example1 example1.c -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -m32 #include int vuln(char *src) { char buf[32] = {}; strcpy(buf, src); return 0; } int main(int argc, char *argv[], char *environ[]) { if (argc < 2){ exit(-1); }..
[LOB] gate -> gremlin
2021. 1. 24. 17:58
Study/System Hacking
포스팅을 하기 앞서 나는 Xshell을 사용해서 진행했다. gate로 로그인하고 나서 ls 명령어로 파일 목록을 확인했다. cat 명령으로 gremlin.c 파일 내용을 확인했다. 확인결과 256바이트 크기의 buffer가 있고, strcpy 함수를 사용해서 버퍼 오버플로우의 발생 가능성이 있다는 것을 알아냈다. 일단 실습을 진행하기 앞서 gremlin의 소유주는 gremlin이기 때문에 파일을 따로 복사해둬야 한다. 파일 복사를 완료했으면 gdb를 실행시킨다. 그리고 disas 명령으로 main의 어셈블리 코드를 확인한다. 아래 사진을 보면 main+54에 strcpy를 실행시키고, main+62에서 buffer[256]을 %eax에 복사하는 것을 확인할 수 있다. buffer의 주소를 알아내기 위해 ..
[dreamhack] Memory Corruption - C (I) / 스택 버퍼 오버플로우
2021. 1. 24. 16:35
Study/System Hacking
버퍼 오버플로우는 할당된 버퍼의 영역을 넘어서는 데이터를 입력해서 다른 데이터를 오염시키는 것을 말한다. 버퍼 오버플로우가 발상하는 영역에 따라 지칭하는 명이 다른데, 스택에서 일어나는 경우 스택 버퍼 오버플로우라고 하고 힙 영역에서 일어나는 경우 힙 버퍼 오버플로우라고 한다. 보통 버퍼 오버플로우 취약점은 프로그래머가 버퍼의 길이에 대한 가정을 올바르지 않게 하여 발생한다. 길이 제한이 없는 API 함수들을 사용하거나 버퍼의 크기보다 입력받는 데이터의 길이가 더 크게 될 때 자주 일어나는 실수다. 아래는 버퍼 오버플로우를 발생시키기 위한 실습이다. - Ex1 // stack-1.c #include #include int main(void) { char buf[16]; gets(buf); printf("..
[OverTheWire] bandit / Level 6 -> Level 10
2021. 1. 14. 18:19
Study/System Hacking
: level 5 → level 6 level 5에는 inhere 디렉토리 아래에 있는 파일에 다음 레벨로 가는 패스워드가 있고, 그 파일의 용량이 1033bytes라는 힌트가 주어졌다. find 명령어로 inhere 디렉토리 아래에 size가 1033bytes인 파일을 찾았고, cat 명령어로 파일 내용을 출력했다. 다음 레벨의 게임 패스워드는 "DXjZPULLxYr17uwoI01bNLQbtFemEgo7"이다. : level 6 → level 7 level 6에서 다음 레벨로 가는 패스워드는 소유권자가 bandit7이고 그룹소유는 bandit6, 파일 크기는 33bytes인 파일안에 있다. 따라서 find 명령어로 표현식을 써서 해당 파일을 찾았다. cat으로 해당 파일을 출력해서 다음 레벨로 가는 패..
[달고나] 정리: 끝까지
2021. 1. 13. 04:28
Study/System Hacking
Buffer Overflow 공격 - 고전적인 방법 가장 고전적인 방법은 NOP를 이용하는 것이다. NOP는 No Operation의 약자로 기계어 코드가 다른 코드와 섞이지 않게 하는 역할을 한다. 따라서 CPU가 NOP를 만나면 아무런 수행을 하지 않고 유효한 instruction을 만날 때까지 한 바이트씩 이동한다. 쉘 코드의 시작 주소를 정확하게 알 수 없기 때문에 이러한 NOP의 특성을 이용해서 buffer overflow 공격을 실행하는 것이다. 쉘 코드의 앞을 NOP로 채우고 return address를 NOP가 채워져 있는 영역 어딘가의 주소로 바꾸면 EIP는 NOP를 지나 쉘 코드가 있는 곳을 가리키게 된다. - 환경변수를 이용하는 방법 *nic 계열의 쉘에서 환경변수는 포인터로 참조된다..
[OverTheWire] bandit / Level 0 -> Level 5
2021. 1. 10. 17:59
Study/System Hacking
: level 0 Xshell을 실행해서 게임에 접속했다. : level 0 → level 1 ls 명령어로 readme 파일을 확인하고, cat으로 파일 내용을 출력했다. 다음 레벨의 게임 패스워드는 "boJ9jbbUNNfktd78OOpsqOltutMc3MY1"이다. : level 1 → level 2 level 1에 접속 후 파일명이 '-'인 파일을 읽기 위해 cat ./- 명령을 사용했다. 다음 레벨의 게임 패스워드는 "CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9"이다. : level 2 → level 3 level 2에 접속 후 spaces in this filename 파일을 읽기 위해 cat spaces까지 입력 후 tab키 자동완성으로 파일명을 찾았다. 다음 레벨의 게임 패스워..
[달고나] 정리: 12p~53p
2021. 1. 8. 18:14
Study/System Hacking
프로그램 구동 시 segment에서 일어나는 일 프로그램 구동 시 메모리와 레지스터가 어떻게 동작하는지 살펴보기 위해 다음과 같은 프로그램을 이용하겠다. void function(int a, int b, int c){ char buffer1[15]; char buffer2[10]; } void main(){ function(1, 2, 3); } 이제 위 C 프로그램을 어셈블리 코드로 변환하겠다. (리눅스 gcc 사용) 어셈블리 프로그램은 다음과 같이 simple.asm이라는 파일 이름으로 생성되었다. 이제 simple.c 프로그램이 컴파일 되고, 실제 메모리 어느 위치에 자리하게 될지 알아보기 위해 gdb를 이용할 것이다. gdb를 이용해서 segment의 logical address를 알아보자. 위 사..
[달고나]: 1~3장 레지스터 구조
2021. 1. 3. 20:25
Study/System Hacking
[Pre_시스템] 8086 Memory Architecture 시스템이 시작되면 커널(Kernal)이 가용 메모리에 적재된다. 시스템은 운영에 필요한 기본적인 명령어 집합을 커널에서 찾기 때문에 사진과 같은 위치에 적재시켜야 한다. 프로세스 실행 운영체제는 하나의 프로세스를 처리할 때 segment단위로 묶어서 처리한다. segment는 code segment, data segment, stack segment로 이루어져 있고 가용 메모리 영역에 저장된다. code segment code segment에는 시스템이 인지할 수 있는 명령어 instruction이 들이 있다. 컴퓨터가 instrcution을 실행하려면 메모리 상의 특정 위치에 있는 명령을 지정해야 한다. 그러나 segment는 자신이 현재 ..