SystemHacking/Protostar(16)
-
Protostar Format1 [ FSB / objdump ]
Protostar Format1번 문제입니다 포맷스트링버그를 이용해서 target변수의 값을 변질시키는 문제입니다[ 그림1 ] $objdump -t format1 | grep target // targer변수의 주소를 알아냈습니다 [ 그림2 ] 포맷스트링버그를 이용한 공격코드를 만들었습니다./format `python -c print "\x41\x41\x41\x41"+"\x38\x96\x08\x04"+"%08x"*127+"%08x"'` 127번째 %08x 에서 "\x41\x41\x41\x41" 의 메모리에 접근할 수 있습니다 따라서 마지막의 %08x 스트링을 %08n 으로만 바꿔주면 "\x04089638"메모리에 값이 입력되어져 변질시킬 수 있습니다./format `python -c print "\x41..
2017.06.13 -
Protostar Format0 [ FSB ]
Protostar Format0번 문제입니다 [ 그림1 ] sprintf( buffer , string )함수를 통해서 실행파일의 첫번째 인자를 buffer에 strcpy 하는 프로세스입니다기존에 버퍼 오버 플로우 처럼 A문자를 64개 오버플로우 시킨뒤 target변수를 변질시키면 되지만, 조건이 있습니다input의 byte크기가 10byte미만이여야합니다따라서 아래와 같이 코드를 짭니다 [ 그림2 ] " %64c "스트링에 의해서 64byte만큼 오버플로우 되었습니다 ( 공백이 63개 들어간 뒤 문자열 하나가 들어가는 형태입니다 )
2017.06.13 -
Protostar Stack7 [ROP]
Protostar Stack7번 문제입니다 [ 그림1 ] 리턴주소에 6번문제보다 더 강한 규약이 걸려있습니다단순한 RTL( Return to Libc )기법으로 사용할 수 없고 ROP( Return Oriented Programming )기법과 함께 사용합니다 objdump명령어를 이용해서 " ret "명령어의 주소를 알아옵니다 [ 그림2 ] 얻어온 " ret "주소를 RET에 덮어씌워주고 RTL기법을 사용하면 된다 다른 설명은 5번과 6번문제에서 해놓았으므로 생략하겠습니다
2017.06.12 -
Protostar Stack6 [Channing RTL]
Protostar Stack6번 문제입니다RTL ( Return to Libc ) 기법을 사용하는 문제입니다RTL을 응용해서 Channing RTL 기법까지 사용해보겠습니다 [ 그림1 ] 소스코드를 보시면 변수 " ret "에 __builtin_return_address(0) 함수를이용해서 getpath()함수의 리턴주소를 저장합니다" ret "의 값과 " 0xbf000000 " 을 and연산합니다. 즉," ret "에 저장된 주소의 시작부분이 " bf "일 때 함수는 종료됩니다 이러한 방어기법은 쉘 코드를 버퍼에 올린 후 쉘 코드 주소를 RET에 덮어씌우는 공격을 방어하려고 고안되었습니다해당 방어기법을 무력화시킨 공격기법이 바로 " RTL "입니다 ( http://itsaessak.tistory.com..
2017.06.12 -
Protostar Stack5 [RTL]
Protostar stack5번 문제입니다. 쉘코드에 대해서 공부하는 문제입니다 기계어코드와 어셈블러를 이용해 쉘코드를 작성해서 사용할 수도 있지만 저는 RTL(Return to Libc) 기법을 사용하겠습니다 우선 환경변수 " code "를 선언하였고 " /bin/sh "로 초기화시켰습니다 " code "를 이용해서 쉘을 실행시킬 예정입니다 해당 소스코드는 환경변수의 주소값을 구하는 파일입니다이러한 코드를 짜서 환경변수의 주소를 구하는 이유는 실행되는 파일의 이름의 길이에 따라서 환경변수의 주소값이 변하는 문제가 발생하는데 이를 해결하기 위한 방안입니다그리고 다음으로 system()함수와 exit()함수의 libc내에서의 주소를 찾아야합니다 위 그림처럼 소스코드를 만들고 gdb분석을 실시합니다 함수의 ..
2017.06.11 -
Protostar Stack4 [gdb]
Protostar Stack4번 문제입니다 버퍼 오버플로우 시켜서 RET의 주소를 변질시키는 문제입니다 ( 힌트에서 버퍼와 EIP사이에 더미가 있음을 알려줍니다 ) gdb를 통해서 해당 파일을 분석해보겠습니다지역변수의 공간이 80byte할당되었습니다. 해당 파일의 스택구조는 아래와 같습니다buffer(64byte)dummy(8byte) SFP(4byte) RET(4btye) win()함수의 주소를 RET주소공간에 덮어씌우면 함수가 종료될 때 win()함수가 실행됩니다( 모르시겠다면 http://itsaessak.tistory.com/110 참고 ) 76byte(buffer+dummy+SFP) 만큼 버퍼오버플로우 시킨 뒤 RET주소공간에 win()함수의 주소를 덮어 씌웠습니다
2017.06.11