글
[FTZ] 해커스쿨 Level16
보안/시스템 보안
2018. 4. 25. 22:12
[해커스쿨] Level16
1. level16에 접속을 하면 위의 힌트를 볼 수 있다. 아래의 소스 코드를 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> void shell(){ // 쉘 권한을 획득 setreuid(3097, 3097); system("/bin/sh"); } void printit(){ // 출력 함수 printf("Hello there!\n"); } main(){ int crap; void (*call)()=printit; // call 포인트 변수에 printit() 함수의 주소지를 넣음 char buf[20]; // 문자열 배열 buf를 20byte크기만큼 선언 fgets(buf, 48, stdin); // buf에 48byte 크기만큼 읽어온다. call(); } | //cs |
2. 소스코드를 보고 난 후 /home/level16 디렉토리에 있는 attackme 파일을 gdb 파일로 열게 된다면
간단한 어셈블리어를 볼 수 있다. 함수가 선언된 부분은 어셈블리어에서 따로 표시가 안 되어서
gdb 창에서 위의 그림처럼 입력하면 된다.
(gdb) p shell
(gdb) p printit
(gdb) p 함수명
위의 명령대로 입력을 하게 된다면 함수가 위치해 있는 메모리 주소를 볼 수 있다.
그리고 어셈블리어에서 보면 main+6 줄에서 어떤게 이동을 하는 지 볼 수 있다.
저 위치에 있는 함수는 call 포인트 변수에 printit() 함수를 넣고 있다. 그렇다면
0xfffffff0(%ebp)에 저 함수를 넣는다는 소리인데, 스택의 제일 위의 메모리 주소는
0xffffffff이니깐 맨 끝자리의 0을 빼고 나면 f가 남는데, f는 10진수로 15다.
printit()는 ebp레지스터의 시작점부터 15만큼 떨어져있다는 소리다.[epb-15]가
printit()의 주소지다.
선언된 자리 56byte에서 15byte만큼 뺀다면 41byte 메모리만큼 덮으면 공격을
할 수 있다.
king poetic
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level17 (0) | 2018.04.27 |
---|---|
[FTZ] 해커스쿨 Level18 (0) | 2018.04.27 |
[FTZ] 해커스쿨 Level15 (0) | 2018.04.24 |
[FTZ] 해커스쿨 Level14 (0) | 2018.04.23 |
[FTZ] 해커스쿨 Level13 (0) | 2018.04.17 |