tmxklab

[FTZ] Level17 풀이 본문

War Game/FTZ

[FTZ] Level17 풀이

tmxk4221 2020. 1. 12. 21:21

1. 문제확인

 

1) 사용자 및 패스워드 : level17 / king poetic

 

2) 파일확인

 

3) hint 코드 설명

#include <stdio.h>

void printit(){
	printF("Hello there!\n");
}
main()
{
	int crap;
	void (*call)()=printit;
	char buf[20];
	fgets(buf, 48, stdin);
	setreuid(3098, 3098);
	call();
}
  • fgets()로 인해 buf[20bytes]배열의 크기보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재
  • Level16과 달리 shell()가 사라지고 printit()만 존재

2. 접근방법

 

1) attackme 디버깅

  • <main+6> : [ebp-16]에 0x8048490(printit()의 시작 주소값)넣음 → [ebp-16]은 call함수 포인터 변수를 의미
  • <main+24> : fgets함수의 첫 번째 인자 buf배열의 주소 값([ebp-56])을 eax에 넣음
  • <main+57> : fgets(), setreuid()실행 후 call포인터 변수에 저장된 주소 값을 eax에 넣고 call명령어를 통해 실행

2) 스택구조

 

3) 결론

  • fgets()를 통해 buf배열의 크기(20bytes)보다 더 큰 값을 입력할 수 있지만 fgets()에서는 48bytes만 buf배열에 저장하므로 main()의 RET까지 도달하지 못함 -> buf배열은 [ebp-56]에 존재
  • 하지만, 마지막에 실행하는 call변수까지는 도달할 수 있으므로(ebp-16) call변수의 주소 값을 변조해야함 -> printit()의 주소 값 대신에 쉘 코드 주소 값으로 채워넣음

3. 풀이

1) 쉘 코드 작성 및 환경변수에 등록

  • call 포인터 변수에 SHELLCODE 주소 값을 넣기 위해 환경변수로 등록 후 주소 값 확인

2) 공격코드 작성

buf[20bytes] + dummy[20bytes] + call[4bytes, 환경변수 SHELLCODE의 주소 값]

 

3) bof 수행

 

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

[FTZ] Level19 풀이  (0) 2020.01.12
[FTZ] Level18 풀이  (0) 2020.01.12
[FTZ] Level16 풀이  (0) 2020.01.12
[FTZ] Level15 풀이  (0) 2020.01.12
[FTZ] Level14 풀이  (0) 2020.01.12
Comments