[pwnable.xyz] misalignment(50 pts) :: Write-Up

두비니

·

2020. 9. 8. 18:30

 

 

 

Try not using a debugger for this one.

 

 

pwnable.xyz misalignment입니다.

간단히 포인터 장난인데, 봅시다

 

 

 

 

v5+7의 값을 0xDEADBEEF에서 0xB000000B5로 값을 바꾸어 주면 되네요.

add랑 비슷한 맥락인것 같습니다.

 

 

일단 쉬운 이해를 위해 입력을 받기 전 v5의 상태를 보겠습니다.

 

 

저렇게 0xdeadbeef가 들어가있는 상황입니다. 리눅스에서는 리틀엔디안 기법이 적용되기때문에 저렇게 반대로 입력이 됩니다. 그럼 우리가 만들고 싶은 상황은 다음과 같겠죠?

 

 

네 그럼 v5[0]에는 0xb500000000000000를 넣으면 되고, v5[1]에는 0x0b000000를 넣어주면 됩니다. 

입력받는건 10진수로 입력받으니 각 값을 10진수로 바꾸면?

 

 

v5[0] : 0xb500000000000000 >> -5404319552844595200(dec)

v5[1] : 0x0b000000 >> 184549376(dec)

 

 

 

==Final Payload==

끝!

 

나올만한질문1. 왜 배열 하나당 8바이트죠?

일단 64비트상에서 int형 배열이니깐 8바이트죠. 근데 간혹 헷갈린다면 이렇게 봐도 됩니다; 디버거나 ida를 통해서 보면 v5[3]이 rbp-98h에서 시작하고, 그 다음 변수인 v6이 rbp-80h에서 시작하는걸 볼 수 있습니다. 

 

그렇기때문에 v5[3]은 0x18인걸 알 수 있고, 0x18 / 0x03 = 0x8이므로 배열 하나당 8byte임을 알 수 있습니다.

 

**주의**

근데 이렇게 아이다로 확인해서 보면 안됩니다. 변수 사이에 dummy가 껴있을 수도 있기 때문에 아이다말고 직접 peda로 얼만큼 할당되는지 확인해야합니다. 이 문제의 경우 실제로 확인해보면 dummy가 없기도하고, 그냥 제가 다시 우분투키기 귀찮아서 그랬읍니다... 죄성합니다