이번엔 CBC 모드를 공격하는 문제입니다. CBC모드는 이전 블럭의 암호화 결과가 현재 블럭의 평문에 XOR 되는 블럭암호 운영모드입니다. 자세한건 위키피디아를 참고하세요.
여러번 해본 결과 IV는 늘 일정함을 알 수 있었습니다. 그리고 따로 스샷은 찍지 않았지만 &를 인자로 보내는 것이 불가능했습니다. 만약 &를 보내는게 가능했으면 그냥 ddddd&admin=1을 보내고 쿠키의 일부를 제거하는 방식으로 해결할 수 있었겠지만 그게 불가능합니다.
이 대신에 생각한 방식은 다음과 같습니다. &admin=0과 &admin=1은 최하위비트만 다릅니다. 그렇다면 id=ddddd12345678&admin=0일 때 id=ddddd / 12345678 / &admin=0 / padding으로 평문이 나눠질 것이고, 각각을 $P_0, P_1, P_2, P_3$이라고 할 때
$C_0 = Enc(P_0 \oplus IV)$
$C_1 = Enc(P_1 \oplus C_0)$
$C_2 = Enc(P_2 \oplus C_1)$
$C_3 = Enc(P_3 \oplus C_2)$
가 됩니다. 우리는 $P_2$의 최하위 1비트를 조작하는게 목표이므로 $C_0$, $C_2$, $C_3$은 그대로 두고 $C_1$만 최하위비트를 1에서 0으로 변경합니다. 영향을 받는 P는 $P_1$, $P_2$입니다.
단 이 때 $P_1 = Dec(C_1) \oplus C_0$가 이상한 값이 될 테지만 아무 상관 없습니다. 또한 $P_2 = Dec(C_2) \oplus C_1$은 최하위비트만 바뀌게 되어 &admin=0이 &admin=1로 바뀔 것입니다.
바꿔보면
성공했습니다.