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..