본문 바로가기

overthewire :: Vortex level9 by ORANG 더보기
overthewire :: Vortex level8 by ORANG 보호되어 있는 글입니다. 더보기
overthewire :: Vortex level7 by ORANG CRC32의 취약점을 이용한 문제 코딩자체보다는 CRC32 알고리즘을 이해하는데 시간이 더 들었다.. http://anch0vy.tistory.com/60 -> anch0vy님이 쓴 글이 도움이 많이 되었다. 내가 이해한대로 기록해두자면..CRC32(cyclic redundancy check)는 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식이다.미리 만들어진 256개의 테이블을 통해 1바이트 단위로 계산하는데,'>>8' 과정에서 최상위 바이트가 0이 되므로, 테이블의 최상위값 바이트가 남게된다.이를 통해 해당 테이블을 알아낼 수 있다. 또, 1바이트 단위로 시프트 연산이 진행되므로CRC32 는 4바이트(32bit), CRC64 는 8바이트(64bit)만 조작할 수 있다 면역연산 과정을 통.. 더보기
overthewire :: Vortex level6 by ORANG 헥스 레이로 보면.. if(*(_DWORD *)a3) 일경우 restart(*argv)함수가 호출된다.restart함수에서는 *argv에서 그대로execlp(argv[0], argv[0], 0)으로 이어지므로, argv[0]에 실행시킬 파일명을 넣어주면 된다. 일반적으로 main(int argc, char **argv, char **env)이면ebp -> SFPebp+4 -> RETebp+8 -> argcebp+12 -> argvebp+16 -> env인자 전달시 이런식으로 진행된다. gdb로 간단하게 분석해보자면.. 0x0804846f :mov 0x10(%ebp),%eax 0x08048472 :mov (%eax),%eax 0x08048474 :test %eax,%eax 0x08048476 :je 0x8.. 더보기
overthewire :: Vortex level5 by ORANG 글자수는 5글자, 브루트 포싱을 통해 패스워드를 알아내야한다. 주어진 소스를 수정해, 브루트 포싱을 위한 코드를 작성했다. 수정된 main함수 부분브루트 포싱하는데 속도가 느려..아스키 코드에서 특수문자+문자 부분인 0x21~0x7E 부분으로 제한했다. 계속 buf 출력이 바뀌어서 헤맸는데.. 아주 사소한 부분이 문제가 되었다.시행착오 끝에 코드 완성 삽질의 끝은 역시 개뿌듯..!! 더보기
overthewire :: Vortex level4 by ORANG if(argc) exit(0); 의 조건을 우회하는 방법을 몰라서 한참 헤맸다 execve함수를 통해, args는 NULL로 전달하고 env를 전달 arr[idx] 는 arr base + datatype*idx 로 계산 되기때문에 argv가 없으면 argv[3]을 env[3]으로 받아들이게 된다. 환경변수를 통해 전달하기 때문에, 메모리 값이 뒤죽박죽? 그냥 조금만 바꿔도 크게 바뀌었다 정확한 FSB 공격을 하기 힘들었던 부분.. 밑도 끝도 없는 삽질로 공격에 성공했다. 쉘코드를 환경변수에 올리고, 그 주소를 exit@got에 덮어씌우는 방법 사용 메모리가 계속 섞이길래 그냥 쉘코드 앞에 nop을 화끈하게 10만개 넣어줬다, 그리고 그냥 삽질해서 성공시킴.. 더보기
overthewire :: Vortex level3 by ORANG %esp+0x9c -> lpp%esp+0x98 -> tmp%esp+0x18 -> buf [nop+shellcode+nop] [*(exit@got)] 0x9c-0x18 바이트 더블 포인터 문제 -> lp에 *(exit@got)로 덮어씌워 exit@got에 buf(쉘코드)의 주소가 들어가게끔 한다.gdb 상에서 find 명령어를 통해 특정 메모리 주소를 찾는 방법이 있었음-> find 시작범위, 끝범위, 찾을 메모리 패턴 더보기
overthewire :: Vortex level2 by ORANG 더보기
overthewire :: Vortex level1 by ORANG 먼저 스택의 구조를 그려보면ptr이 buf[256]의 주소를 가리킵니다. 이후 소스를 보면.. while((x = getchar()) != EOF) { switch(x) { case '\n': print(buf, sizeof(buf)); continue; break; case '\\': ptr--; break; default: e(); if(ptr > buf + sizeof(buf)) continue; ptr++[0] = x; break; } } 이 부분을 통해 ptr의 값을 조절할 수 있겠네요'\\' 을 입력할 때마다 ptr-- 이고 ,default의 ptr++[0]=x; 부분을 통해 메모리 입력이 가능하네요 #define e(); if(((unsigned int)ptr & 0xff000000)==0x.. 더보기
overthewire :: Vortex level0 by ORANG vortex.labs.overthewire.org : 5842에 연결한 후, 4개의 unsigned integer를 입력받아 합을 입력하면 vortex1의 패스워드를 획득할 수 있다. 더보기