목록Information security/System security (34)
nemo의 이야기
소스를 확인해보면 위과 같다. 분석해보면 return 주소가 bf로 시작해야되서 스택 메모리를 사용해야되고 마지막에 memset함수를 사용하여 buffer에 메모리가 0으로 초기화되는 것을 확인할 수 있다 이를 해결하기 위해서는 argv[1]에 쉴코드를 넣어서 공격해야된다. 우선 argv[1]에 주소를 확인해 보자 c소스에서 printf("%s") => %x로 바꿔서 argv[1]에 주소를 확인해보자 bffff6e0라는 것을 확인할 수 있다. 그러면 이제 공격코드를 작성해서 공격해보자
orc.c 파일을 확인해보면 위와 같은 소스 파일을 확인할 수 있다. 소스파일을 분석해보면 memset함수를 이용해서 환경변수를 초기화하는 것을 확인할 수 있다. 그리고 argv[1]에 리턴 주소 마지막 byte가 bf으로 끝나지 않으면 프롤그램이 종료 되게 설정해놨다. 이 문제를 해결하기 위해서는 버퍼에 쉘코드를 삽입하여 공격을 해야된다. 우선 버퍼에 A를 44byte를 넣고 리턴주소에 bfbfbfbf를 넣어 메모리를 확인해보자 버퍼에 주소는 bffffad0라는 것을 확인할 수 있다. 그러면 해당 주소에 쉘코드를 넣고 나머지는 nop으로 채워서 공격해보자 메모리를 확인해보면 정확히 들어가 있는 것을 확인할 수 있다. 그러면 원본 파일에 가서 공격을 시도해보자 위 사진처럼 실패한 것을 확인할 수 있다. ..
이번 문제는 cobolt에 있는 goblin 문제이다. 소스 파일을 확인하면 아래과 같다. 문제를 확인하면 버퍼에 크기는 16바이트 이다. 그리고 중요한것은 프로그램이 실행 후 gets() 함수를 이용해서 버퍼에 문자를 입력하는 형식에 프로그램이다. 이 문제를 해결하기 위해서는 파이프라인을 이용해서 프로그램 수행과 동시에 문자열을 입력해야 된다. 우선 gdb를 이용해서 스택 메모리를 확인해보자 실행 시켜서 gets함수를 이용해서 a를 20byte를 넣어보자 메모리에 정확히 들어가 있는 것을 확인할 수 있다. 그러면 argv 뒤에 있는 스택 메모리에 nop슬라이딩을 한 후 쉘코드를 넣어보자 그리고 스택 메모리는 대략 bffffb58정도로 설정해보자 dummy(20byte) + 스택 주소(4byte) + n..
이번에는 gremlin에 있는 cobolt를 풀어볼 것이다. c파일을 확인해보면 아래와 같다. 소스를 확인해 보면 전과 비슷하다 하지만 퍼버에 사이즈가 16byte라는 것을 확인할 수 있다. 이러면 쉘코드에 크기는 24byte가 들어가기에 충분하지 않을 것이다. 따라서, 공격방법은 스택메모리에 쉘코드를 올리던가 환경변수에 쉘코드를 올리는 방법을 사용해야될 것이다. 환경변수로 하면 쉽게 할 수 있지만 스택메모리를 이용해서 공격해보자 우선 gdb를 이용해서 메모리를 확인해보자 dummy(20byte) + 스택주소(4byte) + argv dummy(4byte) + nop(1000byte) + 쉘코드(24byte) 메모리에 정확히 들어가 있는 것을 확인할 수 있다. 스택 주소를 0xbffff778쯤 설정해주고..