orge의 소스를 열어봤습니다 저번 소스와 크게 변한거는 마찬가지로 없지만
here is changed!
if(strlen(argv[0]) != 77 ) {
printf("argv[0] erro\n");
exit(0);
}
이 부분이 추가됬군요 gdb로 분석해서 해당부분을 읽어보겠습니다 .
35에서 ebp+12 즉 argv[0]의 값을 eax안에 복사합니다
38번에서 edx에 eax값을 복사하고
40번에서 edx를 집어 넣습니다 .
41에서는 strlen함수를 호출합니다 .
46에서는 esp에 4 만큼 넓혀서 argv[1]값으로 이동하네요
49에서는 eax에 eax값을 복사합니다
51에서는 eax와 77을 비교합니다 .
54에서 eax가 77과 같으면 main+80으로 이동을 합니다
그렇지않다면 56이후로 쭉 실행을해서 종료를 시킵니다 .
저번처럼 argv[1]에 쉘코드를 넣어서 클리어하는 방식을 똑같이 사용해도 괜찮을거 같습니다.
근데 제가 여태까지 이용해오던 방식은 argv[1],[2] 이 두개를 이용하였는데 갑작스럽게 argv[0]이 등장하였네요
배열을 뒤로 움직이는 방법이라도 존재하는것일까요
일단 주소부터 구해보도록 하겠습니다
main+224에 브레이크포인트를 잡아준 후에 argv[1] 과 argv[2]의 주소를 구하기 위하여 실행을 햇으나 argv[0]에서 에러가발생하네요
그렇다면 아까 main + 35~ main+ 76 즉 argv[0]을 검사하는 부분에서 브레이크 포인트를 잡은후에 어떡하면 에러가 나지않을까? 하고 한번 찾아보겠습니다 .
argv[0]에 대해서 알기 위해서 이런식으로 무작위로 대입해봤습니다 .
argv[1].[2] 같은 값이 아니라 argv[0]뒤에 잇는 값이라서 무작위로 뒤로 넣으면 되지 않을까? 싶어서 시도해봤습니다.
하지만 모두들 실패했습니다.
그러다가 문득
Starting program: \tmp\orge `python~~
앞에잇는 \tmp\oreg 뭔가 수상했습니다 스타팅 프로그램에 저렇게 나와있네? 하고 생각이 들더군요
그래서 이런식으로 시도를 다시 한번 많이 해봤습니다.
main+66 즉 에러 메시지가 뜨는부분에서 열심히 실행을 해봤습니다.
처음에는 단순히 파일명이 argv[0]일까 생각을 했습니다만 파일명을 정확히 77로 맞춰서 여러번 시도해봐도 모두 실패했습니다 .
Starting program: \tmp\orge `python~~
\tmp\ << 이 친구들이 존재하고잇었습니다 그래서 argv[0]을 비교하는 값인 77에서 -5(\tmp\)를 빼줘서 72자리의 값 만큼 해줬더니
시도 했더니 argv[0] error 라는 메시지가 안뜨네요!
브레이크 포인트를 308에 잡고 실행을 햇더니 argv[0] error 와 세그멘테이션 폴트가 뜨지않네요 !
그렇다면 아까와 마찬가지로 주소를 구해봐야겠습니다 .
argv[1]의 값이 나옵니다
argv[2]의 값이 나옵니다 .
저번과 같이 A(44)+쉘코드가잇는 주소의값 (마지막자리는 \xbf) +b(적절한값+쉘코드)가 되겠습니다 .
다만 문제는 권한이 걸려있는 본래에 orge는 제가 임의로 이름을 변경하지 못합니다 .
그러면 어떻게 argv[0] 즉 본래의 orge의 길이를 77이라고 생각하게 만들 수 있을까요 ? 또 여러가지 시도를 해봐야겠습니다 .
[안보이는건 눌러서 봐주세요]
argv[0]에러가 역시나 발생하네요 그럼 처음에 써봣던 ////를 혹시나해서 사용해보겠습니다 .
세그먼트 에러가 떠서 쉘코드가 들어잇는 주소를 살짝 바꿧습니다 .
권한이 따이네요 신납니다!!
'해커스쿨 lob' 카테고리의 다른 글
LOB vampire (0) | 2016.05.04 |
---|---|
LOB troll (0) | 2016.05.04 |
LOB darkelf (0) | 2016.05.02 |
LOB wolfman (0) | 2016.05.02 |
LOB goblin (0) | 2016.05.01 |