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]이 되겠습니다.
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 |
댓글