LEVEL4
(goblin -> orc) : egghunter
일단 코드를 봐보자..
//egghunter 부분을보면
memset함수로 환경변수를 0으로 초기화 시킨다.그러므로 우리는 환경변수를 이용할 수 없다.
여태까지 풀이법에서도 환경변수를 사용하지 않아서 //egghunter 부분은 신경을 크게 쓰지 않아도 될 것 같다.
if(argv[1][47] != '\xbf')부분을 봐보자....
argv[1]을에[47]부분이 \xbf가 아니면 exit(0)을 실행해서 프로그램이 꺼진다.
argv[1]은 ./[파일이름] [입력받는 값]에서 입력받는 값 부분이 argv[1]이고 파일이름 부분이 argv[0]이다.
그리고 [47]이라고해서 47번째라고 착각은 하지말자.[0]부터 시작이니 48번째이다.
(※후에 문제들도 argv를 이용한 문제가 많으니 기억해두자!)
gdb로 파일을열어서 call strcpy의 다음줄에 브레이크 포인트를 걸어보자.
브레이크 포인트를 건 후
r `python -c 'print "A"*47+"\xbf"'`를 해주었다.(buffer+saved ebp=44,saved eip=4)
\xbf를 해 줌으로써 if문으로 들어가지 않고 정상적으로 strcpy이 실행됬다.
saved eip의 주소가 \xbf으로 시작을 해야 strcpy가 실행될 것이다.
문제의 답은 예상외로 간단하다!
buffer의 주소가 \xbf으로 시작하니까 buffer에 쉘코드를 넣어주고 saved eip에 buffer의 주소를 적어주면 쉘코드가 실행될 것이다.
그럼 실행해보자!
흠.... 에러가 뜬다.
core파일을 열어보자...
값이 다른 주소공간에 들어가 있었다.
그럼 saved eip를 다시 설정해주면 정상적으로 될 것이다.
크... 정확하게 들어갔다!
'WarGame > The Lord of Bufferoverflow(LOB)' 카테고리의 다른 글
The Lord of Bufferoverflow(LOB) wolfman -> darkelf (0) | 2017.12.08 |
---|---|
The Lord of Bufferoverflow(LOB) orc -> wolfman (0) | 2017.12.03 |
The Lord of Bufferoverflow(LOB) cobolt -> goblin (0) | 2017.12.03 |
The Lord of Bufferoverflow(LOB) gremlin -> cobolt (0) | 2017.12.01 |
The Lord of Bufferoverflow(LOB) gate -> gremlin (0) | 2017.11.30 |