[exploit writing] 1_스택 기반 오버플로우 (4)

이제 test 스크립트를 수정하면서 메모리 위치 범위를 좁혀 나가자.

목표 

EIP를 정확히 덮어쓰기 위해 Kali metasploit의 툴을 이용한다.

과정

1. test.pl 스크립트 수정을 통해 위치 범위를 좁혀 나가보자. 수정한 스크립트는 25,000개의 A와 5,000개의 B를 가지고 있다. 만약 EIP가 41414141을 가지고 있다면, EIP는 20,000 ~ 25,000 개 사이에 있을 것이고 424242라면 25,000 ~ 30,000 사이에 위치할 것이다.

my $file = "crash25000.m3u";
my $junk = "\x41" x 25000;
my $junk2 = "\x42" x 5000;
open($FILE, ">$file");
print $FILE $junk.$junk2;
close($FILE);
print "m3u File Created Successfully \n";

2. 수행 결과(쉬우므로 생략), EIP가 42424242(BBBB)를 가지고 있음이 밝혀졌고, 이제 우리는 EIP가 25,000~30,000 사이의 offset을 가지고 있음을 알 수 있다. 이것은 나머지 'B'들이 ESP가 가리키는 곳 어딘가에 있다는 것을 의미한다.

3. ESP의 내용을 덤프해보자. EIP 뿐만 아니라 ESP에도 공격자가 입력한 버퍼값을 확인할 수 있다. 스크립트를 일부 수정하기 전에 EIP를 정확히 덮어쓰기 위한 위치 발견을 위해 Metasploit을 사용해 보겠다.

4. Metasploit은 오프셋을 계산하는데 도움이 되는 pattern_create.rb 도구를 가지고 있다. 이 도구는 유일한 패턴을 가진 문자열을 생성한다. 이 패턴을 이용해 우리는 EIP에 덮어쓰기 위한 정확한 버퍼의 크기를 알아낼 수 있다. 먼저 5,000개의 문자로 된 하나의 패턴을 만들어 보자.


5. 위에서 생성한 결과를 다시 test.pl 스크립트에 적용하여 m3u 파일을 다시 생성해 보자. 다음과 같은 결과가 나온다. 아래 그림에서 보듯이 EIP가  42356a42로 바뀌었다.



6. 이제 EIP에 쓸 정확한 버퍼 길이를 계산하기 위해 Metasploit에 내장된 도구인 pattern_offset.rb를 사용해 EIP의 값과 버퍼 길이를 계산해보자.



7. EIP를 덮어쓰기 위해 필요한 버퍼의 길이는 1065이다. 결론적으로, 25,000 + 1065개의 A와 4개의 B(42424242)를 가진 파일을 만들면 EIP의 값은 42424242(BBBB)가 될 것이다 ! 


다음에는 ESP가 버퍼에 있는 데이터를 가리키고 있다는 사실을 알고 있기 때문에, 우선 EIP를 덮어쓴 다음에 'C' 문자열을 추가해 ESP를 덮어쓸 것이다.

출처 : Exploit Writing By Corelan

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리