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

LOB level 2 (gremlin -> cobolt)

by intadd 2016. 8. 1.




 LOB level 2 


 LOB (gremlin -> cobolt)



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



2. 코드 분석

1. char형 buffer[16]을 생성

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

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


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



   3. gdb 를 사용하여 인자값들의 주솟값을 확인하기 위해 cp 명령어를 사용해 /tmp로 복사시켜줍니다. $ cp  cobolt  /tmp/cobolt 

( gdb 권한 문제)


(tmp위치에서 gdb cobolt을 한 후)



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

16byte+main함수의 ebp(4byte)=20byte 

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



b * 는 breakpoint를 말합니다.

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

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


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

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


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


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

B를 넣어주었습니다.



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

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

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




A를 20가지 채운 후 리턴어드레스에서 아까 확인한 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 4 (goblin -> orc)  (1) 2016.08.01
LOB level 3 (cobolt -> goblin)  (0) 2016.08.01
LOB level1 (gate->gremlin)  (0) 2016.07.13

댓글