no image
FTZ Level19 //Chaining RTL Calls
문제확인우선 문제는 아래와 같이 단순한 형태를 띄고 있다. 하지만 여기에서 주의 해야할 것은 기존과는 다르게도 setreuid가 존재 하지 않는 것을 유의 하여야 한다. 이제 아래와 같이 GDB를 통하여 스택을 확인해보면 40바이트가 할당이 되어 있는 것을 확인 할 수가 있다. 이는 buf[20] - Dummy[20] - SFP - RET의 형태로 존재하는 것을 확인 할 수가 있다. RTL - 실패우선 RTL을 통하여 공격을 하여보자. 기존과 같이 system( ) 함수를 이용한 공격을 할 경우 권한 상승이 이루어지지 않은 것을 확인 할 수가 있다. 바로 setreuid가 존재하지 않기 떄문이다. 따라서 system()함수를 이용한 공격은 현재 이 자체만으로는 효력이 부족하다는 것을 알 수 있다. 따라서..
2015.05.28
no image
FTZ Level17
문제 확인이제 벌써 17번 문제이다. 끝이 보이고 있으니 마저 풀이를 계속하여보자. 아래의 소스와 같이 16번 문제와는 다르게 Shell()이라는 함수가 존재하지 않고 main()에 setreuid가 존재하고 있는 것을 확인 할 수가 있다. 따라서 우리는 *call 포인터변수를 통하여 printit()가 아니라 우리가 쉘코드를 메모리에 올려 그 메모리의 주소를 가리키도록 해야 이 문제에서 쉘을 획득 할 수가 있다. GDB를 통하여 디스어셈블링을 해본다면 우선 main()에서 0x38만큼의 스택이 할당 되는 것을 확인 할 수가 있다. 또한 이전의 문제들을 통하여 우리는 스택의 구조를 짐작 할 수가 있다. 우선 Buf[20] - Dummy[20] - *Call[4] - Crap[4] - Dummy[8] - ..
2015.05.24
no image
FTZ Level11 //BOF,EGG,Format String
문제 확인 나중에 디버깅을 하는데 있어서 권한이 없으므로 cp 명령어를 통하여 tmp 폴더로 복사를 하여 분석을 한다.Disas을 통하여 보았을때 Dummy 8바이트가 추가로 붙은 것을 확인 할 수가 있으며, 스텍을 그림으로 나타내면 아래와 같은 모양이 된다. Buffer Over Flow를 통한 풀이 *RET에 넣을 주소를 구하여보자. 아래의 코드에서 25Byte의 Shell Code는 B로 대입을 하고 A는 NOP, C에는 나중에 넣을 RET의 크기 만큼 대입을 하여 x/256x $ESP를 통하여 RET에 넣을 주소를 구하는 과정이다. 여기에서 주의해야 할 사항으로는 ` , ' , " 의 사용에 유의하여야 한다는 것이다.여기서 우리는 0xbffffadc의 주소를 RET로 사용 할 것이다. 그리고 공격..
2015.05.09

문제확인


우선 문제는 아래와 같이 단순한 형태를 띄고 있다. 하지만 여기에서 주의 해야할 것은 기존과는 다르게도 setreuid가 존재 하지 않는 것을 유의 하여야 한다. 이제 아래와 같이 GDB를 통하여 스택을 확인해보면 40바이트가 할당이 되어 있는 것을 확인 할 수가 있다. 이는 buf[20] - Dummy[20] - SFP - RET의 형태로 존재하는 것을 확인 할 수가 있다.





RTL - 실패


우선 RTL을 통하여 공격을 하여보자. 기존과 같이 system( ) 함수를 이용한 공격을 할 경우 권한 상승이 이루어지지 않은 것을 확인 할 수가 있다. 바로 setreuid가 존재하지 않기 떄문이다. 따라서 system()함수를 이용한 공격은 현재 이 자체만으로는 효력이 부족하다는 것을 알 수 있다.


따라서 이번에는 execl() 함수를 통한 공격을 해보려 했다. 하지만 깔끔하게 Segmentation fault가 발생 한 것을 확인 할 수가 있다. //사실 이 방법은 첫 시도 였는데...실패..





Chaining RTL Calls


위 와 같이 그냥 공격으로는 공격이 성공하지 않는 다는 것을 확인 했다. 그래서 RTL과는 비슷하면서도 좀더 고급기법인 ROP를 공부하던 도중에 Chaining RTL Calls 라는 방식을 알게 되었다. 이는 RTL을 체인처럼 이어 여러 함수를 호출 하게 하는 것이고 그것을 가능하게 하는것이 바로 POP-RET 이다. 

대략적인 페이로드는 아래와 같이 구성을 하면 된다. 여기서 pop-pop-ret를 통하여 argv1,argv2를 Setreuid()함수에 인자로 전달을 해주고 마지막의 ret를 통하여 다시 system() 함수를 이어서 호출하게 된다. 그렇게 호출된 system()함수는 4바이트의 Exit()를 지나 "/bin/sh"를 인자로 전달 받게 되면서 결국 RTL을 통하여 한개가 아닌 함수를 호출하는 것을 볼 수가 있다. 


아래와 같이 연속된 주소로 구성된 지점을 찾아야 한다. objdump를 통하여 찾을 수가 있으며 여기서 우리는 setreuid가 인자를 2개 전달받아야 하기 떄문에 붉은 테두리 안에 표시한 지점을 사용 할 것이다. 만약 인자 수가 더 많으면 pop-pop-pop-ret를 사용하면 되고 더 여러개의 함수를 사용하고자 할 경우에는 exit()의 위치에 다시 pop-ret를 넣어주면 된다. 저 붉은 상자에서 맨위의 pop주소가 우리가 사용할 주소가 되는 것이다.








EGG


Shell Code에 setreuid를 추가한 새로운 쉘코드이다. 기존의 쉘코드에 Setreuid(3100,3100)만 추가하면 되는 것으로 이 부분의 쉘코드는 아래와 같다. 쉘 코드는 다른 블로그를 찾다가 발견한 것 >> http://geundi.tistory.com/132 

"\x31\xc0\x31\xdb\x31\xc9\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xb0\x46\xcd\x80"

따라서 여기에 기존의 25바이트 코드를 추가하면 된다. (붉게 표시한 부분이 해당 uid의 번호인 것 같다.)

"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

따라서 최종 쉘코드는 다음과 같다.

"\x31\xc0\x31\xdb\x31\xc9\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"



'Hacking > System Hacking' 카테고리의 다른 글

Cracking Windows Password Hash with Kali linux Live Booting  (1) 2015.08.22
FTZ Level20 //FSB  (0) 2015.05.31
FTZ Level18  (0) 2015.05.25
FTZ Level17  (0) 2015.05.24
FTZ Level16  (0) 2015.05.22

FTZ Level17

Kail-KM
|2015. 5. 24. 15:59

문제 확인


이제 벌써 17번 문제이다. 끝이 보이고 있으니 마저 풀이를 계속하여보자. 아래의 소스와 같이 16번 문제와는 다르게 Shell()이라는 함수가 존재하지 않고 main()에 setreuid가 존재하고 있는 것을 확인 할 수가 있다. 따라서 우리는 *call 포인터변수를 통하여 printit()가 아니라 우리가 쉘코드를 메모리에 올려 그 메모리의 주소를 가리키도록 해야 이 문제에서 쉘을 획득 할 수가 있다.


GDB를 통하여 디스어셈블링을 해본다면 우선 main()에서 0x38만큼의 스택이 할당 되는 것을 확인 할 수가 있다. 또한 이전의 문제들을 통하여 우리는 스택의 구조를 짐작 할 수가 있다. 우선 Buf[20] - Dummy[20] - *Call[4] - Crap[4] - Dummy[8] - SFP - RET 의 순으로 할당이 되는 것을 알 수가 있다. 하지만 여기선 fgets를 통하여 48바이트 만큼만 전달을 할 수가 있기에 우리는 RET를 통한 공격을 할 수가 없다.


우선 브레이크지점을 형성 한 후 메모리의 상태를 확인 하여 보자. 아래와 같이 0xbfffe080에서부터 buf가 시작이 되며 그 후에 0xbfffe0a8에 *call과 crap이 순차적으로 있는 것을 확인 할 수가 있다. 





공격


환경변수를 통하여 공격을 진행하여 보자. 아래와 같이 페이로드를 입력한 후에 공격을 시도하면 공격에 성공하는 것을 확인 할 수가 있다.


Shell_Code[25Byte] : 

"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"





의문점


아래와 같이 메모리를 확인할떄 A를 40개 만큼 줄경우 *call 위치에 0x804000a가 들어가는 것을 확인 할 수가 있으며, 만약 44만큼 A를 줄경우 Crap으ㅢ 위치에 0x804000a가 들어가므로 인하여 세그먼트 폴트를 일으켜 실행을 할 수가 없었다.




'Hacking > System Hacking' 카테고리의 다른 글

FTZ Level19 //Chaining RTL Calls  (0) 2015.05.28
FTZ Level18  (0) 2015.05.25
FTZ Level16  (0) 2015.05.22
FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17

문제 확인



나중에 디버깅을 하는데 있어서 권한이 없으므로 cp 명령어를 통하여 tmp 폴더로 복사를 하여 분석을 한다.

Disas을 통하여 보았을때 Dummy 8바이트가 추가로 붙은 것을 확인 할 수가 있으며, 스텍을 그림으로 나타내면 아래와 같은 모양이 된다.



Buffer Over Flow를 통한 풀이



*RET에 넣을 주소를 구하여보자. 아래의 코드에서 25Byte의 Shell Code는 B로 대입을 하고 A는 NOP, C에는 나중에 넣을 RET의 크기 만큼 대입을 하여 x/256x $ESP를 통하여 RET에 넣을 주소를 구하는 과정이다. 여기에서 주의해야 할 사항으로는 ` , ' , " 의 사용에 유의하여야 한다는 것이다.

여기서 우리는 0xbffffadc의 주소를 RET로 사용 할 것이다. 그리고 공격에 쓰일 25Byte의 쉘코드는 인터넷을 통하여 쉽게 구할 수가 있다.

"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

*여기서 유의 해야할 사항으로는 `,',"을 헷갈리지 않고 사용하는 것과 \x90이 \xc2로 치환될 경우가 있는 UTF-8을 대신하여 en_US를 사용하여야 한다. 이를 위해서는 콘솔에 다음과 같이 입력을 하여야한다. "export LANG=en_US "




환경 변수를 이용한 풀이


이번에는 환경변수를 이용한 풀이를 하여보자. 우선 환경변수를 등록하여 준다.그 후 아래와 같이 하면 된다.



Format String Attack


포멧스트링에서 가장 대표적으로 언급되는 중요한 호출 시점이란 main() 함수의 소멸자이다. 소멸자란 main()함수가 종료되는 시점에 소멸자가 호출된다고 볼수 있는데, 이러한 소멸자 역할을 수행하는 함수를 셸코드로 흐름을 바꿀수 있다면 셸이 떨어진다는 의미이다. nm 명령어를 통하여 함수의 소멸자를 찾아보자.

여기서 중요한 소멸자 함수는 바로 0x08049610에 위치하여 있는 __DTOR_END__ 함수이다. 이제 공격에 앞서 위의 방법과 같이 환경변수를 등록하여 주고 이제 이 값의 위치를 셸코드가 들어 있는 환경변수의 위치로 바꾸어주면 된다.

우리가 공격해야 할 주소는 소멸자가 있는 __DTOR_END__(0x08049610) 이고 덮어써야할 셸 코드 주소는 0xbffffc69이다. 여기서 마지막에 있는 명령어에 대하여 설명을 하자면, 우선 __DTOR_END__의 주소와 Half Word(2Byte) 뒤의 주소를 두번씩 입력하고 있다. 이렇게 하면 char str[256] 배열에 이 주소값이 들어 갈 것이다.

그리고 %8x%8x%8x%64577c%n%50070c%n :  %8x 지정자를 이용해 8바이트 단위의 출력 포멧을 만들면서 포인터를 3자리 앞으로 옮겼다. 즉 %8x 지정자 3개로 인해 포인터가 str 배열 바로 앞으로 이동한다. 그리고 %c 지정자때문에 포인터가 한번 더 이동해서 str배열을 가리키게 된다.

여기서 64577의 값은 "0xFC69"를 10진수로 변환한 후에 다른 입력된 값(40byte)를 빼주는 것이다. 그래야 앞의 40Byte와 더해져서 0xFC69가 스트링에 입력이 될 수 있기 떄문이다. 그리고 50070은 0xBFFF를 입력하기 위한 값으로 0x1BFFF-0xFC69를 빼준 값이다.







'Hacking > System Hacking' 카테고리의 다른 글

FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17
FTZ Level13 //RTL, EGG  (0) 2015.05.13
FTZ Level12 //BOF,RTL,EGG,Backdoor  (0) 2015.05.10
#25 Bytes Shell Code  (0) 2015.05.07