jam 블로그

[bof 원정대] bugbear -> giant (RTL2, only execve) 본문

해킹/시스템

[bof 원정대] bugbear -> giant (RTL2, only execve)

kid1412 2012. 3. 23. 22:29
728x90
다음 문제의 소스를 봅시다.

 [그림 1] giant.c

소스 분석
1. buffer의 크기는 44
2. /home/giant/assasin 파일에서 연계된(?) library에서 execve의 주소값을 얻어옵니다.
3. libc.so.6의 정보들에서 __execve의 주소값을 받아옵니다.
4. argv[1]의 45번째값부터 4byte를 ret에 복사합니다.
5. ret과 위에서 만든 execve 주소값과 같아야 합니다.


풀기위한 과정은 다음과 같습니다.

0. bash2
1. 소스 복사시 /home/giant/assassin -> /home/bugbear/giant로 변경
2. execve의 주소값 구하기
3. exit의 주소값 구하기
4. /bin/sh의 주소값 구하기
5. argv[0]의 주소값 구하기
6. argv[0]에 있는 /bin/sh 주소값을 giant에 심볼릭 링크 걸기
7. bof 공격 


1. 소스 복사시 /home/giant/assassin -> /home/bugbear/giant로 변경

 [그림 2] giant1.c

1. 지금 권한에서는 /home/giant/assassin에 접근이 안되기 때문에 변경합니다.


2. execve의 주소값 구하기

 [그림 3] execve의 주소값


3. exit의 주소값

 [그림 4] exit의 주소값


4. /bin/sh의 주소값 구하기

 [그림 5] 앞에서 쓰던 /bin/sh 주소값 구하는 소스 


5. argv[0]의 주소값 

 [그림 6] argv[0]의 주소값  


6. argv[0]에 있는 /bin/sh 주소값을 giant에 심볼릭 링크 걸기

 [그림 7] argv[0]의 주소값을 심볼릭 링크 걸기

 
7. bof 공격

execve의 구조는 execve("/bin/sh",argv,null) 이런 형태로 넣어줄때는 다음과 같이 넣어야 합니다.
[buffer 40byte 쓰레기값] [sfp 4byte 쓰레기값] [execve의 주소값] [exit의 주소값] [/bin/sh의 주소값] [argv[0]에 들어간 /bin/sh의 주소] [null 값]
 

 [그림 8] bof 공격

 주소값이 약간의 변경이 필요합니다. (다른 곳의 블로그에서는 계산 한방에 되시던데 다시 해봐야 할듯합니다.)

 
Comments