[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가 없기도하고, 그냥 제가 다시 우분투키기 귀찮아서 그랬읍니다... 죄성합니다
'War Games > pwnable.xyz' 카테고리의 다른 글
[pwnable.xyz] note(50 pts) :: Write-Up (0) | 2020.10.09 |
---|---|
[pwnable.xyz] grownup(50 pts) :: Write-Up (0) | 2020.09.17 |
[pwnable.xyz] xor(50 pts) :: Write-Up (0) | 2020.08.12 |
[pwnable.xyz] Add(50 pts) :: Write-Up (0) | 2019.11.06 |
[pwnable.xyz] Sub(50 pts) :: Write-Up (0) | 2019.11.05 |