[LOB] orge -> troll
2021. 2. 9. 17:48
Study/System Hacking
오늘은 troll로 가는 패스워드를 알아보자. orge에 로그인 후 현재 위치의 파일 목록을 출력했다. 이번엔 troll.c 파일이 있다. troll.c 파일을 출력시켜보자. here is changed 주석을 보면 이번엔 인자의 개수를 2개로 제한하는 것을 알 수 있다. 즉 argv[2]를 이용할 수 없다는 뜻이다. 맨 마지막에 one more! 주석에는 argv[1]의 값을 0으로 초기화 해주는 것을 볼 수 있다. 이렇게 되면 쉘코드를 argv[1], arg[2]에 넣을 수 없다. 하지만 아직 초기화 되지 않은 공간이 존재한다. argv[0]에 쉘코드를 넣어서 공격해보자. argv[0]은 파일명이다. 그렇기 때문에 파일명을 쉘코드로 바꾼다면 ret를 argv[0]의 주소로 덮어서 쉘을 실행시킬 수 있..
[LOB] darkelf -> orge
2021. 2. 9. 16:44
Study/System Hacking
orge의 패스워드를 알아내보자! darkelf에 로그인하고 ls 명령어로 현재 위치에서 파일 목록을 출력했다. orge.c 파일이 보인다. 이 파일도 출력해보자. here is changed!라는 주석이 추가됐다. 코드를 보면 argv[0]의 길이가 77이어야 하는 것 같다. 즉 파일을 실행시킬 때 파일명의 길이를 77로 맞춰야 한다. 그 외에는 달라진 점이 없다. 실행 파일명의 길이를 77로 맞추고 지난번처럼 argv[2]를 이용해서 공격해보자. python으로 파일명의 길이를 77로 맞추고 argv[2]에 \x90를 넣어서 실행시켰다. 아래와 같이 core파일이 생성됐다. core 파일을 열어서 argv[2] 주소를 찾아봤다. 아래쪽에서 \x90이 반복되는 것을 확인했다. 이중에서 임의의 주소를 골..
[LOB] wolfman -> darkelf
2021. 2. 9. 15:58
Study/System Hacking
이번에는 darkelf로 가기 위한 패스워드를 구해보자. 일단 wolfman에 지난 시간에 구한 패스워드로 로그인했다. 로그인한 후에는 ls명령으로 파일 리스트를 확인했다. 이번에는 darkelf.c 파일이 있는 것을 볼 수 있다. 해당 파일을 출력해보면 아래와 같다. 코드를 잘 살펴보면 check the length of argument라는 부분이 추가된 것을 알 수 있다. 이 부분 때문에 argv[1]의 크기가 48바이트를 넘으면 안 된다. 즉 ret 영역 뒤에 쉘코드를 삽입할 수 없다. argv[1]에 쉘코드를 넣을 수 없으니 argv[2]에 입력해서 공격해보자. 공격에 앞서 argv[2]의 주소를 알아내야 한다. 일단 gdb를 실행시키자. main에서 적당한 부분에 브레이크 포인트를 걸어보겠다. ..
[LOB] orc -> wolfman
2021. 2. 3. 02:09
Study/System Hacking
orc에서 wolfman으로 가는 password를 획득하자! ls 명령어로 디렉토리를 확인해보면 wolfman과 wolfman.c 파일이 있다. 그 중 wolfman.c 파일을 열어보자. 파일 내용을 보면 이전 orc.c와 달라진 부분이 한 군데 있다. buffer hunter 코드가 추가되었다. 이번 문제에서는 환경변수와 buffer를 이용한 공격은 할 수 없다. 이번엔 ret 영역 뒤에 쉘코드를 넣어 공격해보겠다. 문제를 풀기 전에 wolfman 파일을 복사해두자. wolfman1의 main을 gdb로 덤프하자. 이번에도 에 b를 걸어보겠다. 임의의 값을 인자로 전달하고 실행한 후, $esp 메모리를 살펴보면 sfp와 ret 영역을 찾을 수 있다. 이 ebp와 esp의 값이 같아지는 후이기 때문에 ..
[LOB] goblin -> orc
2021. 2. 2. 23:43
Study/System Hacking
이번에는 goblin에서 orc로 가는 password를 획득해보자. goblin에는 orc와 orc.c 파일이 있다. 이중 orc.c 파일을 열어봤다. orc.c 파일에 //egghunter 부분이 생겼다. 환경변수 메모리를 초기화 시켜주는 코드다. 이 코드 때문에 환경변수를 이용한 공격은 못 할 것 같다. 그 다음 if 문을 보니 argv[1]의 48번째 문자가 \xbf여야 하는 것 같다. main의 지역변수가 buffer[40]와 i이고, buffer[40]가 i위에 있는 것으로 보아 메모리 구조는 buffer(40)+sfp(4)+ret(4)이다. ret까지 덮으려면 총 48바이트 코드가 필요한데 buffer로 복사되는 argv[1]의 48번째 문자가 \xbf여야 하기 때문에 return addre..
[lazenca] Protection Tech / NX bit(MS: DEP)
2021. 2. 2. 19:28
Study/System Hacking
NX bit(Never eXecute bit, 실행 방지 비트)란 프로세스 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU 기술이다. NX 특성으로 지정된 메모리 구역은 데이터 저장을 위해서만 사용된다. DEP(Data Execution Prevention)이란 마이크로소프트 윈도우 운영 체제에 포함된 보안 기능이며, 악의적인 코드가 실행되는 것을 방지하기 위해 메모리를 추가로 확인하는 하드웨어 및 소프트웨어 기술이다. DEP에는 하드웨어 DEP, 소프트웨어 DEP 두 가지 모드가 있다. 하드웨어 DEP는 메모리에 명시적으로 실행 코드가 포함되어 있는 경우를 제외하고 프로세스의 모든 메모리 위치에서 실행할 수 없도록 표시한다. 대부분의 최신 프로세서는 하드웨어 DEP를 지원하고..
[dreamhack] Linux Exploitation & Mitigation Part 1 / NX bit
2021. 2. 2. 17:01
Study/System Hacking
이전 글에서는 스택 메모리에 셀코드를 삽입한 후 실행 흐름을 조작하여 쉘을 획득했다. 하지만 일반적으로 스택 메모리는 코드를 실행시키는 용도로 쓰이지 않고 데이터를 읽고 쓰는데 사용되기 때문에 실행 권한이 있을 필요가 없다. 때문에 메모리를 이용한 공격을 어렵게 하기 위해 NX bit(No-eXecute bit)가 등장했다. NX bit가 설정되었을 경우 쓰기 권한과 실행 권한이 동시에 있는 메모리 영역이 존재하지 않는다. 따라서 전처럼 쉘코드를 스택 영역에 저장해 실행 흐름을 바꾸는 공격방법은 통하지 않는다. 다만 프로그램에 스택 오버플로우 취약점이 있다면 실행권한이 있는 메모리 영역의 코드를 활용해서 익스플로잇 할 수 있다. C언어에서 printf와 같은 라이브러리 함수가 사용될 때 프로그램은 메모리..
[LOB] cobolt -> goblin
2021. 1. 28. 00:01
Study/System Hacking
오늘은 goblin으로 가는 password를 찾아보겠다. 먼저 지난 번에 알아낸 password로 로그인을 해준다. 그리고 현재 위치에서 파일 목록을 확인했다. goblin.c 파일이 있다. 이 파일 내용을 출력해보도록 하자. 지난 시간에 했던 cobolt.c 파일과 크게 다를 것 없지만 입력을 인자가 아닌 표준 입력을 통해서 받고 있다. gets 함수는 입력의 크기를 따로 지정하지 않기 때문에 버퍼 오버플로우가 발생할 수 있다. 이번에도 역시 BOF를 이용해서 쉘코드를 실행시킬 수 있다. 하지만 buffer의 크기가 16바이트이기 때문에 쉘코드를 넣을 수 없어 보인다. 따라서 환경변수를 이용해서 해결하겠다. nop sled와 쉘코드를 합친 환경변수 SHELLCODE를 만들었다. 그 후 getenv.c..
[LOB] gremlin -> cobolt
2021. 1. 27. 22:20
Study/System Hacking
오늘은 cobolt로 가는 password를 찾아보겠다. ls 명령어로 cobolt.c 파일이 있는 것을 봤고, cobolt.c 파일 내용을 출력해봤다. strcpy 함수가 사용됐고 buffer의 크기는 16바이트다. strcpy 함수 때문에 버퍼 오버플로우가 발생할 수 있다는 것은 이전 레벨과 동일하지만, buffer의 크기가 16바이트이기 때문에 쉘코드를 넣을 수 없다. 대신에 환경변수를 사용해서 해결할 수 있다. 먼저 쉘코드를 값으로 갖는 환경변수를 만들어야 한다. 나는 SHELLCODE 환경변수를 만들었다. 이때 환경변수의 주소가 조금씩 바뀔 수 있는 것을 고려해 쉘코드 앞에 nop sled를 붙였다. 그리고 환경변수의 주소를 얻어야 한다. getenv 함수로 환경변수의 주소를 얻을 수 있다. 나..