본문 바로가기
워게임/FTZ

FTZ - level9

by meanjung 2021. 7. 6.

hint : 다음은 /usr/bin/bof의 소스이다. 이를 이용해 level10의 권한을 얻어라.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main(){

  char buf2[10];
  char buf[10];

  printf("It can be overflow : ");
  fgets(buf,40,stdin);

  if ( strncmp(buf2, "go", 2) == 0 )
   {
        printf("Good Skill!\n");
        setreuid( 3010, 3010 );
        system("/bin/bash");
   }

}

1. buf배열에 40바이트까지 입력받음

2. buf2와 "go" 비교 -> 같으면 0 반환

3. 즉, buf와 go가 같다면 /bin/bash가 실행되겠다.

 

buf[10] (낮은 주소)

-----------------------

buf2[10] (높은 주소)

스택이 위와 같이 쌓일 것이라고 예상했다. 때문에 buf 입력받을때  a*10 + go를 하면 buf2[0:2] = "go"가 될 거라 생각해 입력했는데 개뿔...

 

스택 쌓이는 순서가 다른가? 뭘 다르게 알고 있나.. 

 


cd tmp

cat > bof.c 해서 코드를 그대로 복붙했다.

gcc -o bof bof.c

gdb bog

> disas main

어셈을 하나하나 이해하지는 못하지만, call 부분을 기준으로 buf와 buf2의 위치를 파악할 수 있다.

 

* int a; int b; 이렇게 나온다고 연속으로 4byte씩 스택에 쌓이는 게 아닌가보다. 

 

- fgets 인자 buf -> ebp-40

- strncmp 인자 buf2 -> ebp-24

둘 차이가 16이구나.

 

답 : "a"*16 + go

'워게임 > FTZ' 카테고리의 다른 글

FTZ - level11  (0) 2021.07.21
FTZ - level10  (1) 2021.07.12
FTZ - level8  (0) 2021.07.06
FTZ - level7  (0) 2021.07.06
FTZ - level6  (0) 2021.07.06

댓글