- Today
- Total
목록분류 전체보기 (300)
Phantom
이번 단계는 기본적인 BOF문제에 스택가드가 있다 스택가드란 우리가 레벨12에서와 같은 방법으로 버퍼오버플로우 시켜서 리턴주소를 변조하게 되면 당연히 스택가드 영역도 함께 다른 값으로 변조될 수밖에 없다 그러므로 스택가드에 저장돼있는 값이 바뀌었다는 것은 버퍼 오버플로우 공격이 일어났다는 것을 의미 하고 스택가드의 변경이 확인되면 프로세스 실행을 차단해서 공격을 방어할 수 있다 그러므로 우리는 스택가드의 영역을 건들이지 않고 공격을 해야한다 지금 우리가 푸는 문제는 아주 쉽지만 소스 없이 프로그램만으로 알아내기란 무척 어렵다는 것을 알아두자 자 그럼 이제 문제를 풀어보자 우선 스택을 살펴보자 Buf 1024, I 4 바이트 소스에는 1028바이트가 사용됐다 그리고 스택 프레임을 보면 0x418, 1048..
자 이번문제부터 본격적인 BOF문제이다 소스코드를 보니 버퍼는 256바이트이며 gets함수를 사용한다 gets함수도 strcpy와 같이 길이를 재지 않고 복사를한다 아 우선 BOF에 대해 설명하자면 BOF란 Buffer OverFlow의 약자로 버퍼가 넘치는 데이터를 집어 넣어 쉘을 얻는 공격기법중 하나이다 시스템 해킹 공격기법중의 기초라고도 할 수 있으며 BOF의 공격기법 또한 다양하다 우리는 가장 기초적인 BOF공격기법과 환경변수를 이용한 공격기법, 그리고 RTL이라는 공격기법을 통해 쉘을 얻을 것이다 아 참고로 기본적인 RET SFP이런것들은 알고 있다고 가정하고 설명하겠다 우선 스택을 파악해보자 우선 스택에 0x108, 즉 264가 할당이 됐다 버퍼가 256바이트인데 264가 할당이 됐다, 더미가..
이번 난이도부터는 attackme라는 파일과 힌트에는 소스코드가 주어진다 취약점을 보고 공격하란 뜻인 것 같다 소스코드를 보니 취약점이 2개가 있다 Strcpy(str, argv[1])에 BOF취약점 하나와 Printf(str)에 포맷 스트링 취약점 먼저 첫번째 BOF취약점은 strcpy함수가 문자열의 길이를 검사하지 않고 복사하는 것 때문에 오버플로우 취약점이 생긴 것이다 그리고 두번째 포맷스트링은 원래 기본적인 printf함수 라면 printf("%d",x) 나 printf("%s",str)이렇게 아니면 printf("hello world"); 처럼 인자가 정해져 있어야 한다 그런데 소스에는 printf함수 안에 배열 이름이 적혀져 있다 잘은 모르겠지만 실행해보면 출력이 된다 그러나 이렇게 사용하게 ..
음…우선 공유메모리가 무엇인지부터 알아야겠다 한 공간을 여러 프로세스가 공유 한다는 것으로만 알았지 이런 실습적인 부분은 아직 본적이 없어서…;; 자 그럼 이제 공유하고 여럿이서 사용할 수 있다는 것도 알았다 그럼 어떻게 공유를 하고 사용할 것인가 우선 공유메모리 함수부터 봐야 알 것 같다 #include #include Shmget() – 공유메모리 생성 접근 Int shmget(key_t key, int size, int shmflg); Key_t key : 공유 메모리를 구별하는 식별 번호 Int size : 공유 메모리 크기 Int shmflg : 동작 옵션 IPC_CREATE : key에 해당하는 공유 메모리가 없다면 새로 생성한다 IPC_CREAT값을 입력한 후 |(pipe) 연산자를 덧붙여 ..
먼저 level10소유의 파일을 먼저 찾는다 디버깅을 하려했지만 권한이 없다 어차피 소스코드가 있으니 컴파일하고 디버깅한다 이번 문제는 다른 내용들은 크게 중요하지 않다 먼저 스택 프레임, 즉, 프로그램이 로딩될 때 얼마의 용량을 차지하는지에 대한 부분을 볼것이다 0x28, 40바이트가 할당된다 소스코드를 보면 char buf2[10]; char buf[10]; 이렇게 총 20바이트가 할당된다 더미가 들어간다는 것이다 그럼 더미가 어디에, 얼마나 들어가는지 알아보자 저 부분을 보면 ebp-40에 fget함수를 사용하고 0x10을 정리한다 즉 ebp-40부터 10만큼을 사용하는 것이다 그리고 ebp-24를 strcmp에 사용하면서 0x10을 정리한다 ebp-24부터 10만큼 사용하는 것이다 소스코드를 보면..
힌트를 보고 조금 멍했다 단서는 용량이 2700이라는 것 find에 용량으로 검색하는 것이 있나 찾아봤는데 있더라. 그래서 그걸 이용했다 Find / -size 2700 2>/dev/null 결과는 아무것도 안나왔다 네이버에 검색해보니 단위가 c, b, k등등 여러 가지가 있더라 그래서 그걸 이용해봤다 C와 b는 아무것도 나오지 않았다 저기서 /etc/rc.d/found.txt라는게 관심이 간다 무엇인지 열어보자 level9:$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.:11040:0:99999:7:-1:-1:134549524 진짜 shadow 파일이다 이걸 이용해 패스워드를 얻으라 비밀번호의 salt세글자 $1$를 보니 MD5인 것 같다 John-the-ripper 를 이용하자 VM에 ..
/bin/level7을 실행하면 패스워드를 요청하는데 힌트는 저렇게 주어져 있다 일단 실행해보자 무작정 패스워드를 입력하라 한다 일단 아무거나 넣자 읭? 에러가 뜬다 /bin/wrong.txt가 없다 한다 처음엔 이게 맞는줄 알았다 혹시나 해서 해커스쿨에 들어갔는데 다음과 같은 내용이 출력됐다 이게 뭘까 힌트를 다시보니 2진수를 10진수로 바꿀수 있는가? 이다 "_"를 0으로 "-"를 1로 변환해 보면 0110 1101 0110 0001 0111 0100 0110 0101 이 나온다 이것을 다시 10진수로 바꾸면 6 D 6 1 7 4 6 5 가 나온다 일단 답에 넣어보자 답이 틀리고 아까와 같은 2진수가 출력된다 뭘까? 그러다 문득 하나가 스쳐 지나간다 이것을 두 자씩 나눠서 보면? 6D 61 74 65..
힌트만으론 이번문제는 어떤것인지 감이 잡히지 않는다 엔터를 누르면 다음 화면이 나타난다 예전 90년도의 PC통신인 것 같다 1번 2번 3번을 누르면 연결이 되야 하는데 인터넷의 등장으로 사라진 것이라 추측된다 Ctrl + C로 빠져나와 tn이란 프로그램을 분석해보자 Cat hint, clear등 시스템 함수가 실행되고 이유는 모르지만 getchar함수가 실행된다 그리고 printf("\n #####################################\n"); printf(" ## ##\n"); printf(" ## 텔넷 접속 서비스 ##\n"); printf(" ## ##\n"); printf(" ## ##\n"); printf(" ## 1. 하이텔 2. 나우누리 ##\n"); printf(" ##..
이번 단계는 나는 솔직히 공략을 조금 봤다 공략을 보기 전까지 계속고민했다 결국 공략을 봤다 물론 공략 그대로 따라하진 않았다 보고 난 후에 내 방식대로 문제를 풀었다 먼저 힌트를 봤을 때 레이스컨디션이구나 라는게 단박에 떠올랐다 /usr/bin/level5는 소유자가 level6으로 되있어 디버깅이 안된다 그래서 level6으로 로그인 후 디버깅을 했다 0x0804842c : push ebp 스택 프레임 0x0804842d : mov ebp,esp 8바이트 만큼 할당 0x0804842f : sub esp,0x8 ------------------------------------------------------------------------------------------------------------..
[level4@ftz level4]$ cat hint 누군가 /etc/xinetd.d/에 백도어를 심어놓았다.! 일단 이 힌트만으론 어떤 문제일지 감이 안온다 /etc/xinetd.d 에 가보자 [level4@ftz level4]$ cd /etc/xinetd.d/ [level4@ftz xinetd.d]$ ls -l -r--r--r-- 1 root level4 171 9월 10 2011 backdoor 백도어라는 파일이 하나 나온다 파일을 확인해보니 Xinetd 설정파일이다 [level4@ftz xinetd.d]$ cat backdoor service finger { disable = no flags = REUSE socket_type = stream wait = no user = level5 server..