chunk1 = malloc(0x40000uLL);
*chunk1 = 1LL; _printf_chk(1LL, "Leak: %p\n", chunk1); |
먼저 malloc(0x40000);
을 호출하고, 할당받은 영역의 첫 바이트에 1을 쓴 뒤 해당 영역의 주소를 알려준다.
_printf_chk(1LL, "Length of your message: ");
_isoc99_scanf("%lu", &size); chunk2 = (char *)malloc(size); _printf_chk(1LL, "Enter your message: "); read(0, chunk2, size); chunk2[size - 1] = 0; write(1, chunk2, size); |
다음으로 유저가 정수를 입력하고, 그 값을 크기로 malloc
을 호출해서 새 chunk를 할당받는다.
if ( !*chunk1 )
system("cat /flag"); |
마지막에는 chunk1[0]
의 값이 0일 때 플래그를 준다.
일반적인 상황에서는 chunk1
과 chunk2
가 겹쳐질 일이 없으므로 chunk1[0]
의 값을 0으로 만드는 게 불가능하다. 하지만 size
가 매우 큰 값이라면 malloc
에서 메모리 할당에 실패하여 NULL을 리턴하고, 이 값이 chunk2
가 되기 때문에 const memory에 0을 쓰는 게 가능해진다. 따라서 (leak 된 주소값)+1 을 메시지 길이로 설정해 주면 원래 1이 쓰여있던 위치에 0을 쓸 수 있고, 플래그를 가져올 수 있다.
Last update: 10/22/2020
'Wargame > pwnable.xyz' 카테고리의 다른 글
pwnable.xyz / note (0) | 2020.01.13 |
---|---|
pwnable.xyz / GrownUp (0) | 2020.01.13 |
pwnable.xyz / misalignment (0) | 2020.01.13 |
pwnable.xyz / add (0) | 2020.01.13 |
pwnable.xyz / sub (0) | 2020.01.13 |