SystemHacking/Protostar(16)
-
Protostar Heap3 [ Double Free Bug ]
참고한 사이트 : https://bpsecblog.wordpress.com/2016/10/06/heap_vuln/ Protostar 3번 문제입니다. 더블프리버그(DFB)에 관한 문제입니다[ 그림1 ]해당 프로세스는 변수 a,b,c 가 32byte만큼 메모리가 동적할당 된 후 인자들을 입력받은 다음 반환되는 흐름입니다우선 힙 구조를 살펴 보면 다음과 같습니다 [ 높은 주소 ] Stack 빈 공간 c ( 32byte ) b ( 32byte ) a ( 32byte ) [ 낮은 주소 ] 낮은주소에서 높은주소의 방향으로 해당 그림과 같이 a,b,c가 위치하고 있습니다free(c), free(b), free(a) 과정의 아래의 그림들을 살펴보면서 설명하겠습니다 $gdb file heap3(gdb) breab *a..
2017.06.14 -
Protostar Heap2 [ Heap Overflow ]
Protostar Heap2번 문제입니다[ 그림1 ] Heap에서는 Stack과는 반대로 낮은주소에서 높은주소로 데이터가 쌓입니다해당 문제에서는 service변수에서 데이터를 입력받을 때 오버플로우 시켜서 auth chunk를 건들일 수 있는지를 물어보고 있습니다따라서 우리는 service변수를 낮은 주소에 위치시킨 그 이후 주소에 auth chunk를 위치시킵니다 [ 그림2 ] 위 그림을 보시면 service : 0x0804c008 , auth : 0x0804c018 가 출력되는 것이 확인됩니다service와 auch청크와의 거리는 16byte만큼차이가 나서 "A"*16 을 오버플로우시키면 auth값을 변질시킬 수 있습니다
2017.06.14 -
Protostar Heap0 [구조체활용]
Protostar Heap0번 문제입니다 [ 그림1 ] 힙에서의 메모리 구조는 스택의 구조와는 반대로 생각하시면 됩니다( First-in-Frist-out )임의로 인자를 주어 파일을 실행시켜보면 포인터 d와 f의 주소가 나와있습니다이를 이용해 메모리 구조를 그려보자면 다음과 같습니다[ 높은 주소 ][ Stack ][ f ][ dummy (6byte) ][ d ][ 낮은 주소 ] [ 그림2 ] 포인터 d가 가리키고 있는 구조체 data의 name변수를 버퍼 오버 플로우 시키고 나머지 dummy값도 버퍼오버플로우시킵니다그리고 objdump명령어를 사용하여 알아낸 winner()함수의 주소를 포인터f의 값으로 덮어 씌우면 공격성공입니다
2017.06.14 -
Protostar Format4 [ FSB / PLT / GOT ]
Protostar Format4번 문제입니다 [ 그림1 ] vuln()함수에서 exit(1)함수가 실행되어 종료됩니다exit(1)함수가 실행되는 주소값을 변질시켜서 hello()함수가 실행되게 해보도록 하겠습니다objdump명령어를 사용하여서 필요한 함수들의 주소를 찾아내겠습니다 [ 그림2 ] $objdump -TR ./format4 | grep exitexit(1)함수가 실행(호출)되는 주소 : 0x08049724 [ 그림3 ] $objdump -d ./format4 | grep hello -F10 hello()함수의 시작주소 : \x080484b4 exit(1)함수가 호출되는 주소에 hello()함수의 시작주소를 덮어씌우는 공격코드를 작성하면 끝입니다 [ 그림4 ] [1] 먼저 우리가 입력한 데이터가..
2017.06.13 -
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