Wargame/pwnable.xyz
pwnable.xyz / misalignment
Syine Mineta
2020. 1. 13. 17:55
*(_QWORD *)((char *)buf + 7) = 0xDEADBEEFLL;
while ( (unsigned int)_isoc99_scanf("%ld %ld %ld", &x, &y, &n) == 3 && n <= 9 && n >= -7 ) { buf[n + 6] = x + y; printf("Result: %ld\n", buf[n + 6]); } if ( *(_QWORD *)((char *)buf + 7) == 0xB000000B5LL ) win(); |
buf+7
주소가 가리키는 8바이트 값이 0xB000000B5가 되면, system("cat /flag");
를 실행하는 win
함수를 실행할 수 있다.
이해하기 쉽게 그림으로 표현하면 다음과 같다. (little endian에 주의해야 한다)

즉, buf[0]
에 0xB5FFFFFFFFFFFFFF, buf[1]
에 0xFF0000000B000000를 맞춰 넣으면 win
이 실행된다. (FF는 ?에 해당하는 바이트로, 다른 값으로 설정해도 문제가 없다.)
아래에서는 x+y=0xB500000000000000
, n=-6
과 x+y=0xB000000
, n=-5
를 넣어 봤다.

Last update: 10/22/2020