예, 이미 비슷한 질문이 있습니다 (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 바이트 프롤로그를 가정하면? 아마도이 예제는 결국 가장 쉽지 않을 것입니다 ...
나는 혼란 스러워요. 어떤 아이디어?
사실, printf에 대한 인수가 스택에 푸시되므로 반환 주소의 주소가 입력에 따라 변경됩니다.형식 문자열은 그 자체만큼 많은 바이트를 "소비"해야하며 리턴 주소까지 다른 모든 바이트를 "소비"해야합니다. –
예를 들어 50 바이트 쉘 코드와 NOP가 없다고 가정하고 구체적인 예를 들어 주시겠습니까? –
http://stackoverflow.com/questions/7459630/how-can-a-format-string-vulnerability-be-exploited –