tmxklab

[FTZ] Level14 풀이 본문

War Game/FTZ

[FTZ] Level14 풀이

tmxk4221 2020. 1. 12. 21:21

1. 문제확인

1) 사용자 및 패스워드 : level14 / what that nigga want?

 

2) 파일확인

 

3) hint 코드 설명

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

main()
{
	int crap;
	int check;
	char buf[20];
	fgets(buf, 45, stdin);
	if(check==0xdeadbeef)	
	{
		setreuid(3095, 3095); // level15의 ruid, uid값으로 변경
		system("/bin/sh"); // 
	}	
}
  • 프로그램 실행 후 fgets함수를 통해 사용자의 입력을 받을 수 있음(stdin)
  • buf변수의 20bytes보다 더 큰 입력 값을 넣을 수 있음 → bof 취약점 존재

2. 접근방법

1) attackme 디버깅

main() 시작

  • 함수의 프롤로그(push ebp, mov ebp, esp)이후에 ebp-0x38(56bytes)만큼 스택 확보

fgets()

  • fgets()의 인자 값을 받기 위해 3번의 push를 진행, 첫 번째 인자 값(buf배열의 주소)를 받기 위해 push하는데 이때 [ebp-56]에 buf배열(20bytes)이 존재함을 알 수 있음

if문

  • if문으로 인해 cmp, jne명령어를 수행함, 이때 if문에서 check변수와 0xdeadbeef를 비교, 따라서 [ebp-16]에 check변수(4bytes)가 존재함을 알 수 있음

  • 함수의 에필로그(leave, ret)

 

2) 스택구조

 

 

3) 결론

  • if문에 진입하면 setreuid()와 system()으로 인해 level15의 쉘 권한 획득 가능
  • 따라서, if문의 조건을 충족시키기 위해 buf값을 조작하여 check의 변수 값을 0xdeadbeef로 변경해야함

3. 풀이

1) 공격 코드 작성

  • buf[20bytes] + dummy[20bytes] + check[4bytes]
  • 40bytes는 쓰레기 값, 나머지 4bytes는 0xdeadbeef로 채우면 됨

 

2) bof 수행

  • fgets()로 입력을 받으므로 2개의 명령어를 사용해야함(python, cat) → 세미콜론 사용
  • 따라서, python프로그램을 통해 공격코드를 화면에 출력하고 이를 cat과 파이프를 사용하여 화면에 출력한 값을 ./attackme의 입력 값으로 받으면 됨

'War Game > FTZ' 카테고리의 다른 글

[FTZ] Level16 풀이  (0) 2020.01.12
[FTZ] Level15 풀이  (0) 2020.01.12
[FTZ] Level13 풀이  (0) 2020.01.12
[FTZ] Level12 풀이  (0) 2020.01.12
[FTZ] Level11 풀이  (0) 2020.01.12
Comments