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

LOB level 4 (goblin -> orc)

by intadd 2016. 8. 1.




 LOB level 4



 LOB (goblin -> orc)



 1. 첫 번째로 cat  명령어를 사용하여 orc파일의 코드를 확인합니다.



2. 코드 분석

1) char형 buffer[40]을 생성


2) 전달 받는 인자의 수가 2개 미만이면 프로그램 종료


3) strcpy argv[1]을 buffer에 복사한다.

여기서 argv[0]은 프로그램을 실행시키는 명령어 입니다. 예를 들어 ./cobolt 여기서는 이것이 argv[0]이 되겠습니다.


   4) egghunter 바로 환경변수를 사용하지 못하게 막는 것입니다. c언어 함수 memset은 원하는 부분을 초기화 시켜주는 함수입니다.
 
5) argv[1][47] 이 부분은 argv[1]에서 47번째가 "bf"와 같아야 한다. 라는 의미 입니다. (이것을 쉽게 해석하면 환경변수의 주솟값이 아닌 argv[2]의 주솟 값을 확인하고 사용하라 라는 뜻 같습니다.)


3. cp 명령어를 사용해 /tmp로 복사시켜줍니다. $ cp  orc  /tmp/orc 

( gdb 권한 문제)




(tmp위치에서 gdb orge를 한 후)



gdb를 이용해 스텍의 크기는 40 이라는 것을 알 수 있습니다.

40byte+main함수의 ebp(4byte)=44byte 

를 채운 후 return address (4byte)에 쉘코드가 있는 주소를 불러와 주면 됩니다.


(여기서 A*47을 넣어줬죠? 이것은 argv는 배열의 형태이기 떄문에 [0]부터

쌓입니다. 그래서 47을 넣어주면 46까지 A가 쌓이고 47에는 "\xbf"가 쌓이는 것 입니다.)


b * 는 breakpoint를 말합니다.

프로그램을 멈출 지점을 정해주는 것 입니다.

(break point는 strcpy함수가 끝난 후의 지점에 설정해 주어야 합니다.)


r(run) 은 프로그램을 실행시키는 명령어 입니다.

r 뒤에 나오는 것은 인자값을 전달해주는 것 입니다.



4. breakpoint가 걸린 상태에서 x/1000x $esp 명령어를 사용하여 메모리에 쌓여있는 것들 을 확인합니다. 


저는 r 명령어를 사용 할 때 argv[1]에는 A를 argv[2]에는 

B를 넣어주었습니다.



쭉 보다가 보면 4141에서 4242로 바뀌는 지점이 있습니다. 

여기서 B[16진수로 42]가 시작 되는 주소를 확인해 줍니다.

오차가 있을 수 있기 때문에 넉넉히 몇칸 뒤의 주소로 결정합니다.




A를 40가지 채운 후 리턴어드레스에서 아까 확인한 argv[2]가 시작되는 지점을 리턴어드레스에 넣어줍니다. argv[2]에는 null값과 쉘코드를 입력 해 줍니다.


( 자 여기서 null값을 넣는 이유는 주솟값의 오차를 없애기 위해서인데여 gdb로 확인한 주솟값이 정확히 일치 하지 않습니다. 그래서 argv[2]가 시작할 때 즈음에 null을 만나면 계속 뒤로 이동하게 됩니다. 그럼 뒤로 이동하다 쉘코드를 만나면 쉘코드를  딱!!!! 실행시켜 주는 것입니다.)  





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

LOB level6 (wolfman->darkelf)  (0) 2016.09.13
LOB level5(orc->wolfman)  (0) 2016.09.13
LOB level 3 (cobolt -> goblin)  (0) 2016.08.01
LOB level 2 (gremlin -> cobolt)  (0) 2016.08.01
LOB level1 (gate->gremlin)  (0) 2016.07.13

댓글