★if(argc < 2) : 실행파일 이름에 주는 인자가 1개 이상 아니면 종료
=>인자를 argv[1] 이상 줘야한다.
★egghunter: memset() 함수로 환경변수를 0으로 초기화한다.
★if(argv[1][47] != ‘\xbf’): argv[1]의 48번째 원소가 ‘\xbf’가 아니면 종료. ret이 꼭 argv[1]의 45~48번째를 차지해야 한다.
★if(strlen(argv[1]) > 48): argv[1]의 크기가 48보다 크면 종료
=>argv[1]에는 NOP+shellcode를 줄 수 없고, 주려면 argv[0]이나 argv[2]에서 줘야한다.
★strcpy(buffer, argv[1]): argv[1]에 든 것을 buffer에 복사한다. 길이를 검사하지 않고 복사하므로 bufferoverflow 취약점이 있다.
★memset(buffer, 0, 40): buffer 크기인 40바이트를 0으로 초기화한다.
★saved_argc = argc: 인자의 개수를 saved_argc에 저장해놓는다. 모든 인자를 초기화할 때 사용한다…
★memset(argv[i], 0, strlen(argv[i])): 아까 저장한 인자 개수를 이용해서 모든 인자를 0으로 초기화한다.
=>memset(buffer, 0, 40)만 있었을 때는 buffer의 처음 40바이트만 초기화하므로 앞에 40바이트는 제외하고 ret 뒤에 NOP과 shellcode를 주면 돼서 상관없었는데, strlen(argv[i])로 인자 길이만큼을 초기화해버리므로 문제가 생겼다.
복사한 파일에서는 core dumped가 됐다… 일단 ret에 넣을 주소를 찾아보자.
(다 초기화되겠지만 일단 되니까 해보고 생각하자.)
역시 보면 argv가 다 초기화된 것을 확인할 수 있다.
x/200s로 확인해봤을 때도 보면 argv를 제외한 부분은 모두 초기화된 것을 확인할 수 있다. argv니까 파일 이름도 초기화되는 것 같다. 없는 것을 보니.
인자로 주지 않는 방법이 있을까?
아예 파일이름을 바꿔도…똑같을 것 같은데…(처음엔 이렇게 생각했는데 파일이름을 바꿔야 했다!)
Leave 부분의 주소에서 breakpoint를 잡아보자.
여기에 argv[1]이 조금 잘려있는 것을 확인할 수 있고…
x/3000s로 확인하니까 끝부분에 파일 이름이 남아있는 것을 확인할 수 있다.
이것은 실행했을 때 명령어가 남아있는 것을 의미한다.
따라서 파일이름에 NOP과 shellcode를 주면 된다. 위에서 보면 ret부분은 안 없어지는 것을 보니 ret에 주소를 문제없이 넣을 수 있을 것이다.
쉘코드는 \x2f가 없는 것을 사용해야 한다.
Core 파일이 생성되었으니 ret에 넣을 주소를 찾아보자.
$ gdb -q -c core
(gdb) x/3000s $esp
./부분을 제외한 “\x90” 위치의 주소를 선택하면 된다.
0xbfffff9a? 주소를 사용해보자.
주소가 제대로 안 구해진 것 같으니 이번엔 더 정확하게 바이너리 상태로 주소를 구해보자.
(주소가 제대로 안 구해진 것이 아니었다...뒤에 나올 것)
“\x90”과 shellcode가 들어가있다. NOP이 위치한 0xbfffffb0을 주소로 선택해보자.
왜 안 되나 했는데...
쉘코드가 너무 스택의 바닥에 가까우면 제대로 작동하지 않는다고 한다.
따라서 쉘코드 뒤에 NOP을 더 채워봤다.
0xbfffff30을 ret에 넣을 주소로 선택하겠다.
이번엔 쉘코드가 NOP으로 충분히 바운딩되서 쉘코드가 제대로 작동할 수도 있을 것 같은데…!
뒤에 NOP을 100만 줘도 쉘코드가 충분히 바운딩되어서 작동하는데는 문제가 없나보다.
임시 디렉터리에서는 성공! 이제 홈디렉터리에서 원본파일의 심볼릭 링크 파일로 해보자.
아까 만든 파일에 인자만 주면 된다.
./skeleton `python -c ‘print “A”*44+”\xff\xff\xff\xff”’`
이것처럼 생성한 NOP+shellcode가 든 파일도 파일이름이므로 앞에 ./만 붙이면 실행하는 명령어이다.
./`python -c ‘print “\x90”’`* `python -c ‘print “A”*40+”B”*4+”\x30\xff\xff\xbf”’`
홈 디렉터리에서 원본파일에 대한 심볼릭 링크 파일로 공격해도 성공!
“shellcoder”
[LOB] level 12: golem -> darkknight (0) | 2019.05.15 |
---|---|
[LOB] level 11: skeleton -> golem (0) | 2019.05.15 |
[LOB] level8: orge->troll (0) | 2019.04.28 |
[LOB] level3: cobolt -> goblin (0) | 2019.04.01 |
BOF(Buffer Overflow) 공격-고전적인 방법 (0) | 2019.03.29 |