nemo의 이야기
이번에는 gremlin에 있는 cobolt를 풀어볼 것이다. c파일을 확인해보면 아래와 같다. 소스를 확인해 보면 전과 비슷하다 하지만 퍼버에 사이즈가 16byte라는 것을 확인할 수 있다. 이러면 쉘코드에 크기는 24byte가 들어가기에 충분하지 않을 것이다. 따라서, 공격방법은 스택메모리에 쉘코드를 올리던가 환경변수에 쉘코드를 올리는 방법을 사용해야될 것이다. 환경변수로 하면 쉽게 할 수 있지만 스택메모리를 이용해서 공격해보자 우선 gdb를 이용해서 메모리를 확인해보자 dummy(20byte) + 스택주소(4byte) + argv dummy(4byte) + nop(1000byte) + 쉘코드(24byte) 메모리에 정확히 들어가 있는 것을 확인할 수 있다. 스택 주소를 0xbffff778쯤 설정해주고..
BOF 원정대에 gate부분 문제를 풀어보자 gremlin.c 코드를 확인하면 아래와 같다. 코드를 분석해보면 strcpy를 사용하는데 이는 argv[1]을 버퍼에 복사는 함수이다. 복사할 목적지 문자열에 크기를 제한하지 않음으로 오버플로우가 가능하다. 즉, 버퍼에 쉘코드를 입력하여 오버플로우를 하여 공격하면 될 것이다. 우선 gremlin 실행 파일을 복사하여 gate권한인 실행파일을 생성해야된다. gdb명령어를 사용해서 분석해보자 main+54 부분에 strcpy 시스템콜을 확인할 수 있다. 그러면 이 부분에서 버퍼에 복사가 되는데 메모리를 확인하기 위해 dummy를 써보자 우선 buf에 크기는 256byte이다 그러면 A를 256byte를 쓰고 나머지 4byte를 B로 써보자 버퍼에 위치는 0xbf..
#> cat narnia2.c를 이용해서 narnia2.c를 확인해보았다. 문제를 보니 strcpy를 이용해서 오버플로우를 발생시켜 메모리를 조작하는 문제이다. 그럼 gdb를 이용해서 값을 넣어서 메모리를 확인해보자 버퍼메모리(128) + dump(4) + ebp(4)을 합하면 136바이트 뒤에 return 주소가 있다. 이제 공격 코드를 작성해보자 nop 슬라이딩을 이용해서 버퍼값에 넣어보자 버퍼에 주소는 0xffffd638이고 return주소에 버퍼주소를 넣어 공격해보자 우선 nop(100) + 쉘 코드(29) + dump(7) + 버퍼주소(4)