본문 바로가기
  • True knowledge exists in knowing that you know nothing. -Socrates-
Study/lob

LOB level6 (wolfman->darkelf)

by intadd 2016. 9. 13.



LOB level 6



LOB (wolfman -> darkelf)




1. cat 명령어를 통하여 darkelf.c 의 소스 코드를 확인합니다.




2. 소스코드 분석 


1. char 형 buffer  [40] 선언



2. argc 가 2 미만일 경우는 오류 메시지 출력 후 종료

 


3. 에그 헌터 환경 변수 사용 금지.



4. argv[1][47]과  "\xbf"와 같지 않다면 오류 메시지 출력 후 종료



* strlen(arg[1]) 는 길이를 체크하는 함수입니다. arg[1]의 길이가 48을 넘을 경우에는 오류를 출력하고 종료합니다.

  제가 풀었던 level5의 방법과 동일하게 푸셨다면 신경쓰지 않으셔도 됩니다.



5.strcpy 함수 : argv[1]에 있는 것을 buffer에 복사 합니다.



6.printf 로 buffer를 출력 합니다.



7.memset 으로 buffer를 40까지 0으로 초기화 합니다.





3. gdb 권한 문제를 우회하기 위해 tmp에 복사합니다.


      

명령어 cp 를 통해서 복사 하실 수 있습니다.




4. tmp 로 이동 하여 gdb darkelf 명령어를 입력합니다.



disas main 으로 main을 어셈블리어로 확인합니다.




  5. 공격 방법 



1. argv[2]에 쉘코드를 넣습니다.



2. gdb로 argv[2]가 메모리에 올라오는 주소를 찾습니다.



3. buffer(40)+ebp(4)+argv[2]의 주솟값 (return adress)

   gdb로 argv[2]가 시작되는 주소를 찾습니다.



첫 번째 우회해야하는 것은 argv[1][47]!="\xbf" 입니다.

배열은 0 부터 시작되기 때문에 47을 채우고 "\bf"를 채우면 47의 자리에는 bf가 들어가게 됩니다.


두 번째 우회해야할 것은 argv[1]의 길이가 48 이상이라는 것입니다.

이것은 44+ret 이기 때문에 48을 넘지 않게 되어 걱정하지 않으셔도 됩니다.


그후 제가 실제로 쉘코드를 넣어줄 장소에는 B라는 문자를 넣어줍니다.


x/1000x $esp명령어로 확인 하실 수 있습니다.




자 그럼 42(B)가 시작하는 주소를 찾을 수 있습니다.

넉넉하게 0xbfffc10으로 잡아 줍니다.




그렇다면 아까 위에서 했던 것 처럼

40(buffer)+4(ebp)+argv[2]의 주소)  argv[2](쉘코드)


(쉘코드= 주소값의 오차를 제거하기위해 nop을 사용합니다.)





이렇게 입력주면 되겠습니다. 




'Study > lob' 카테고리의 다른 글

lob tips (풀기전 알아야할 것들)  (0) 2017.06.12
LOB 5 (darkelf -> orge)  (0) 2017.06.12
LOB level5(orc->wolfman)  (0) 2016.09.13
LOB level 4 (goblin -> orc)  (1) 2016.08.01
LOB level 3 (cobolt -> goblin)  (0) 2016.08.01

댓글