nemo의 이야기
BOF 원정대 gate -> gremlin 본문
BOF 원정대에 gate부분 문제를 풀어보자
gremlin.c 코드를 확인하면 아래와 같다.
코드를 분석해보면 strcpy를 사용하는데 이는 argv[1]을 버퍼에 복사는 함수이다.
복사할 목적지 문자열에 크기를 제한하지 않음으로 오버플로우가 가능하다.
즉, 버퍼에 쉘코드를 입력하여 오버플로우를 하여 공격하면 될 것이다.
우선 gremlin 실행 파일을 복사하여 gate권한인 실행파일을 생성해야된다.
gdb명령어를 사용해서 분석해보자
main+54 부분에 strcpy 시스템콜을 확인할 수 있다.
그러면 이 부분에서 버퍼에 복사가 되는데 메모리를 확인하기 위해 dummy를 써보자
우선 buf에 크기는 256byte이다 그러면 A를 256byte를 쓰고 나머지 4byte를 B로 써보자
버퍼에 위치는 0xbffff968이라는 것을 알 수 있다 그리고 해당 버퍼에 A = '41'이라는 아스키코드가 들어 가 있는것을 확인할 수 있다.
그리고 ebp주소에 B ='42'가 들어가 있는 것을 확인할 수 있다. 그러면 해당 argv[1]에 쉘코드를 넣고 공격을 해보자
우선 nop슬라이딩을 이용해서 쉘코드를 제외한 나머지 byte에 nop = '\90'을 넣어보자
버퍼에 주소는 중간 지점으로 두고(bffff998)
여기서 주의할 점은 ff는 00으로 인식하기 때문에 bash2쉘을 이용해서 공격을 시도해야된다.
260 = nop(200byte) + 쉘코드(24byte) + nop(36byte) + "bffff978"
여기서 nop슬라이딩에 안정성을 위해 앞뒤에 nop을 사용하는 것이 좋다.
$(python -c 'print "\x90" * 200 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90" * 36 + "\x78\xf9\xff\xbf"')
메모리를 확인해 보면 정화히 들어가 있는 것을 확인할 수 있다.
그러면 gdb를 나와 복사본을 공격해보면 쉘을 획득할 것을 확인할 수 있다.
그러면 이제 원본파일을 공격해보자
원본 파일도 공격에 성공을 한 것을 확인할 수 있다.
'Information security > System security' 카테고리의 다른 글
BOF원정대 cobolt -> goblin (0) | 2017.10.05 |
---|---|
BOF원정대 gremlin -> cobolt (0) | 2017.10.04 |
워 게임(OverTheWirte) narnia2 (0) | 2017.09.09 |
워 게임(OverTheWire) narnia1 (0) | 2017.09.03 |
워 게임(OverTheWire) narnia0 (0) | 2017.09.03 |