목록분류 전체보기 (62)
농소
분석 해 봅시다LD_PRELOAD도 못쓰고 eip를 제외한 스택메모리를 전부 초기화합니다.또, 스택메모리를 못쓰게 막았고=("\bf") text영역도 못쓰게 막았네요=("\x08")그리고 leave, ret 명령어가 있는 함수들이 있으면 강제로 종료되게 만들었습니다.여기서 의문점은 왜 40으로 막질 않고 궂이 이런식으로 막아놨을까 입니다.즉, 저렇게 막아도 40으로 시작하는 사용가능한 메모리영역이 있다는 겁니다. 그리고 여지껏 쓰지않았던 fgets를통해 입력값을 받습니다. 먼저 fgets함수의 원형을 보면 char *fgets(char *s, int size, FILE *stream);첫번째 인자로 옮길버퍼두번째로 옮길 사이즈세번째로 파일 포인터입니다 fgets는 보통 특정파일 내용을 읽어들일때 사용하고..
분석 해 봅시다.strcpy의 주소를 addr에 저장하고 save eip위치의 값과 addr을 비교하고 있습니다.여기서 주의할점은 &strcpy는 GOT(=실제 주소)가 아닌 PLT(=참조주소)입니다. 그리고 마지막에 버퍼와 EBP, EIP 공간을 A로 덮고있네요GDB로 살펴봅시다 strcpy의 plt값 입니다. eip위치에 저 값을 넣으면 강제종료가 되지않고 다음으로 넘어갈 수 있습니다. 우선 인자를 채우기 전에 strcpy함수 원형을 보면첫번째 인자로 목적지 주소값이 들어가고두번째 인자로 출발지 주소값이 들어갑니다. 어떤식으로 진행될지 생각을 해 본다면우선 에필로그를 거쳐 strcpy함수쪽으로 점프하게 되고 인자값을 통해 strcpy가 실행될 것이고 또 에필로그가 수행이 될 것입니다. 이제 대략 만들..
음 이번문제는 알고보면 윷놀이와는 전혀 상관이없지만 ㅎ 도개걸윷모 함수가 존재합니다 보시면 알다시피 순서대로 호출을 해야만 함수가 정상적으로 실행이 되고 마지막 모함수에 system함수를 실행할 수 있게됩니다. 또 모 함수에서만 cmd라는 인자를 받아 system 인자로 들어가게 되네요 차근차근 따라가면 풀 수 있는 문제입니다. call을 하지않고 jmp를 이용하여 함수에 접근하기에 기존 eip가 함수에 접근했을 때 eip가 호출함수의 ebp가 되는 성질을 이용하여 풀면 될 것 같습니다. 우선 각각 함수의 시작 주소를 찾고 순서대로 호출할 수 있게 만들어 줍니다 정상적으로 값이 채워진것을 확인 했고 실제 실행을 했을때 모든함수가 호출된 것이 확인됩니다자 이제 인자를 넣어야 system(arg)가 실행이 ..
자 이번에도 문제를 풀어보겠습니다 이번 zombie_assassin는 strncpy를 이용하고있네요 ㅎㅎ전과 같은 방법으로 풀 수는 없을것 같네요근데 정말 친절하게도 FEBP를 이용하라고 합니다. 전에도 FAKE EBP를 이용한 문제가있었는데 이번엔 응용버전이네요기본적으로 FAKE EBP를 이용하려면 에필로그가 두번 실행이 되어야합니다여기선 에필로그가 한번밖에 실행이 안되므로 FAKE EBP를 사용할 수 없습니다그러나 전 문제를 풀어보셨으면 눈치를 채셨을 겁니다eip에 text segment영역중 leave명령어를 호출하면 에필로그가 두번 실행이 될 수 있게 만들 수 있습니다.자 이제 진행해 봅시다. 우선 main문의 leave 주소를 기억해 둡시다 처음 "aaaa" 4바이트는 fake eip가 될 것이..
이어서 다음 문제를 진행해 보겠습니다. 전 단계에서는 RTL을 이용하여 문제를 풀었다면이번에는 RTL을 막아놨네요스택메모리 영역("\xbf")과 라이브러리 영역("\x40") 을 못 쓴다면 이제 남은건 data, text영역이 있네요그러나 data은 사용할 수 없으니 text segment("\x08)를 이용하도록 합시다 c파일에서 확인했듯이 eip를 제외한 buf+ebp영역을 전부 0으로 초기화 되어있습니다.환경변수를 충분히 변조하여 이용 가능하지만 stack메모리 영역도 이용할 수 없고.이런경우 ret 슬레이딩 기법을 이용하면 해결 가능하겠네요 eip(=ret ) 에 main문의 에필로그 ret을 넣어준다면 pop eip, jmp eip가 실행되므로 스택포인터가 증가하게되어결과적으로 eip가 4바이트..
c파일을 보시면 execve의 주소와 execve오프셋을 합하여 execve의 실제 주소를 구하고 있습니다.복잡해 보이지만 그냥 execve라이브러리 함수와 ret과 비교하여 일치여부를 확인하고 있네요execve를 이용하여 RTL공격을 하라는 문제 같습니다.gdb를 열어 확인합니다. execve의 주소를 확인해주고 ret에 넣어서 실행해 봅시다 ldd : /home/giant/assassin: No such file or directory파일을 찾을 수 없다고 하네요현재 권한이 다르기 때문에 실행이 안됩니다 c파일을 편집기를 통해 수정을 해주어야 겠네요 이렇게 현재 id인 bugbear로 고쳐 다시 실행시키겠습니다. 네 이번엔 정상적으로 동작하네요이제 execve의 인자를 넣어야 하는데요원형을 봅시다. ..
C파일을 보면 스택메모리를 사용할 수 없게 만들었고힌트로 RTL을 이용하라고 나와있네요 RTL을 이용합시다. GDB를 펼쳐서 system함수의 주소를 알아내고 system(arg) 함수 arg의 인자값을 /bin/sh를 넣어주기위해 ebp +8 위치에 /bin/sh 주소를 ebp+12에 /bin/sh값을 넣어주었습니다. gdb에서 잘 떨어지는 것을 확인했으니 실제 프로그램에 동일한 코드로 16바이트씩 이동하여 실행하다보면 쉘이 떨어지게 됩니다.
이번에도 문제를 풀어봅시다. c코드를 보면 argv[1]의 인자를 받아 인자값을 strncpy를 통하여 버퍼에 복사를 진행하네요그런데 strncpy함수를 잘 보시면 버퍼크기는 40byte인데 복사를 41byte 까지 할 수 있게 해놨네요즉 1byte를 overflow 하게 만들도록 설계를 해두었습니다.구조를 보면 이 1byte 오버플로우 되는곳이 해당 problem_chile 함수의 ebp값을 오버플로우 할 수 있겠네요 우선 gdb로 들어가서 해당 ebp값을 오버플로우 해보도록 하겠습니다. 네 정상적으로 ebp의 1byte를 overflow하여 해당 버퍼의 중간주소쯤으로 변조시켜줬습니다.그러나 bof원정대를 진행하면서 스택메모리를 이용하여 overflow시킬때 항상 eip의 값을 이용하여변형을 시켜 주었..
이번에도 문제를 풀어보겠습니다. 이번에 추가된 바로는 stack destroyer가 추가되었네요 스택을 전부 못쓰게 막아놨습니다. gdb로 살펴본 결과 스택에 쉘코드를 넣을 공간이 아무리 찾아봐도 없네요후킹기법을 이용 해야겠네요 우선 hook.c라는 간단하게 원본geteuid함수에 갈것을 7777로 낚아채는 코드를 만들었습니다. gcc를 이용하여 공유라이브러리 형태로 만들어주고 LD_PRELOAD라는 환경변수를 추가하여 직접만든 공유라이브러리 PATH를 값으로 지정해줍니다.이렇게 하면 어떤것이든 실행을 할때 이 해당 공유라이브러리가 먼저 실행이 됩니다.id라는 명령어를 쳐본결과 euid가 7777로 반환됨을 확인이 되었습니다후킹이 제대로 먹히네요여기서 물론 편하게 다음 레벨의 euid에 접근하여 my-p..
이번에도 비슷해 보이지만 눈에띄는게 마지막에 보이네요음.. argv값을 전부 초기화 시켜버립니다. . . 쓸 공간이 있으려나. . .?gdb로 살펴보도록 하겠습니다. 살펴보니 스택 제일 밑자락에 무엇인가 값이 담겨있습니다.무엇인지 보니 0xbfffffe2주소부터 해당 파일의 절대경로를 보여줍니다이것을 이용하면 될 것 같네요 메모리 공간이 작으니 쉘코드 크기를 신경써서 넣어주도록 합시다저는 25byte 쉘코드를 넣겠습니다. 우선 경로를 만들어주고 링크로 쉘코드 파일을 만듭니다. 아까 확인한 주소에 값을 넣으니 쉘이 실행 되었네요