전체 글(333)
-
Protostar Format3 [ FSB / objdump ]
Protostar Format3번 문제입니다 [ 그림1 ] 이번에는 target변수에 16진수의 주소값을 넣는 문제입니다 [ 그림2 ] 포맷스트링버그공격에서 제일먼저 해야할 일이 우리가 입력한 값이 어디에 위치하는지 알아내는 것입니다12번째 "%8x"스트링에서 우리가 입력한 데이터 AAAA를 확인할 수 있습니다 [ 그림3 ] objdump명령어를 이용해서 target변수의 주소를 알아내었습니다 ( 옵션은 -t 또는 -d 를 사용해도 됩니다 ) [ 그림4 ] 그리고 공격코드를 작성해줍시다포맷스트링 버그를 이용해서 16진수의 주소값을 원하는 주소에 입력시키려면 주소를 2byte씩 채워주어야합니다( 포맷스트링 버그의 자세한 설명은 http://itsaessak.tistory.com/115 링크에 있습니다 )
2017.06.13 -
Protostar Format2 [ FSB / objdump ]
Protostar Format2번 문제입니다 [ 그림1 ] target변수의 값을 64로 변질시키면 되는 문제입니다 [ 그림2 ] 포맷스트링버그공격에서 제일먼저 해야할 일은 내가 입력한 데이터가 어디에 존재하는지를 알아내는 것입니다 4번째 " %8x "스트링에서 우리가 입력한 데이터 AAAA가 있음을 확인이 가능합니다 [ 그림3 ] target의 주소를 알아야 공격을 할 수 있기 때문에 objdump명령어를 이용해 target의 주소를 알아냅니다 [ 그림4 ]공격코드입니다$ (python -c 'print "\x41\x41\x41\x41"+"\xe4\x96\x04\x08"+"%8x%8x%8x%32c%n"';cat ) | ./format2 코드에 따라서 "%n"스트링에 의해서 0x080496e4 ( tar..
2017.06.13 -
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 -
TCP통신 파이썬 소켓 프로그래밍
[ TCP통신 주요 메서드 개념정리 ][Server]#socket = socket.socket( socket.AF_INET , socket.SOCK_STREAM )1> socket.bind( addr ) // 서버의 아이피와 포트번호를 고정2> socket.listen(0) // 클라이언트의 연결을 받을 수 있는 상태3> socket.accept() // 클라이언트로부터 소켓과 클라이언트의 주소를 반환4> socket.recv( byte수 ) // 연결되어진 클라이언트로부터 데이터를 받는다 [Client]#socket = socket.socket( socket.AF_INET , socket.SOCK_STREAM )1> socket.connect( 서버addr ) // 서버에게 연결을 시도한다2> sock..
2017.06.12 -
UDP통신 파이썬 소켓 프로그래밍
소켓 : 네트워크 통신을 하기 위해서는 소켓을 사용하여야 한다 [1] UDP통신, 서버와 클라이언트의 동기화[ 서버 ] import socket sock = socket.socket( sockt.AF_INET , socket.SOCK_DGRAM) // 소켓을 생성한다 sock.bind( ('192.168.2.179',8080) ) // 서버의 아이피와 포트번호를 고정 data , addr = sock.recvfrom( 200 ) // 데이터 수신 대기 ( 최대 수신가능 데이터의 크기 200byte ) // => 반환값 : ( 데이터 , (IP주소, PORT번호) ) print ( " Server is received data : " , data.decode() ) // 받은 데이터 출력 print ( "..
2017.06.12 -
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