이번 vampire 코드에는 새롭게 ultra argv hunter! 가 생겼네요
for(i=0; i<saved_argc; i++)
memset(argv[i], 0, strlen(argv[i]));
i= 0이고 saved_argc보다 작을때까지 for문으로 반복을하는데
argv[0]까지 사용 못하네요 그러면 이제는 도대체 어떻게 공격을 해야할까요
스켈레톤을 tmp폴더로 옮긴 후 gdb로 열어봤습니다 .
몇시간을 끙끙 거리다가 도저히 안될거 같아서 지인에게 여쭤보고 찾은 기법
fake ebp입니다
*먼저 fake ebp는 leave , ret을 이용합니다
leave = move esp , ebp ret pop eip
pob ebp jmp eip
ret 에서 eip에 leave의 주소를 넣어줌으로써 leave를 두번 실행한다
문제를 풀면서 예시와 함께 설명을 드리겠습니다 .
먼저 leave에 브레이크 포인트를 잡아주겠습니다
먼저 A*40[버퍼] + BBBB [SFP] +CCC+\xbf [RET]
leave 말고 buffer의 주소를 찾기위해 strcpy 다음에 브레이크 포인트를 걸어줬습니다
버퍼에 A가 쌓여있는것을 확인할 수 있습니다 SFP와 RET도 보이는군요
------------------------------------------------------------------실패햇읍니다
(fake ebp로 푸는게 아님)
남아있는 값을 확인하기 위해서 48개만큼 bf로 채웠습니다
0xbfffffec에 argv[0]에서 남아있는 값들이 남아 있는 것을 확인했습니다
argv[0] 값을 확인해보기 위해서 x/s로 하나하나 봤더니 지워지지 않은 argv[0]이 존재하였습니다
심볼릭 링크를 이용하고 ../AABB 로 시작을 하기 때문에 +6을 해서 ee +6 을해서
0xbffffff2를 argv[1] ret에 넣었습니다
export SHELL =/bin/bash2 를 하면 gdb에서 bash2가 적용됩니다
gdb에서 아까 처음에 심볼릭 주소 +6이 되있어서 argv[0]주소에 +6을 해준 값을 ret 주소에 넣어줬습니다
세그멘테이션 폴트가 발생한것을 파악하고 0xbfffffa0 의 주소들을 한번 봐보기 위하여 x/100wx 로 봐줬습니다 . 0xbfffffc0 : ~ 0xeb424241 이 발견됬고
0xbfffffc0 부터 4바이트씩 표현을 해주면서 파악해줬습니다
쉘코드가 시작되는 0xeb가 0xbfffffcb에서 확인되었고 얻은 cb를 이용해 놉*44+ret주소에 0xbfffffcb로 바꿔줘서
eip = 현재 명령어를 확인하게 해주는 친구 를 사용해서 봐줬는데
연산결과가 스택끝값을 넘어가는것을 확인해서 세그폴이 발생하는것을 확인하였습니다.
그래서 a를 추가적으로 쉘코드 뒤에 추가적으로 써줘서 주소의 끝값에 닿지 않도록 하여서 공격을 하였습니다
주소를 넣기 편하게 해주기 위해서 \x90 놉 코드를 50개 정도 넣어주었고 아까 말씀 드렸더건처럼 a를123개 그냥 무작위로 크게 넣어줘서 주소 끝값에 닿지 않도록 하였습니다 .
stack is still your friend 라는 문구가 뜨지않도록 그냥 \xbf를48번째에 넣어준후에 주소를 봐보니 a의 주소값들이 정상적으로 출력되고 있습니다 .
0xbfffff40에서 값을 봐주니 nop코드가 보이고 쉘코드가 보이는것을 확인할 수 있습니다 .
*번외 rm -rf `python -c 'print "\x90'`*
=\x90으로 시작하는 친구들을 모두 지워준다
'해커스쿨 lob' 카테고리의 다른 글
LOB darkknight (0) | 2016.05.11 |
---|---|
LOB golem (0) | 2016.05.10 |
LOB vampire (0) | 2016.05.04 |
LOB troll (0) | 2016.05.04 |
LOB orge (0) | 2016.05.02 |