네 misalignment 문제인데요. IDA로 디스어셈블 해서 보면 Add 문제와 상당히 비슷하게 생겼습니다.
배열을 이용해서 문제를 푸는 방식인것은 동일한데요.
조건이 달라지긴 했습니다.
3735928559가 보이는데 이는 16진수로 바꿨을 때 deadbeef입니다.
그리고 이 값을 47244640437로 바꿔야하죠.
이거 전 문제와 상당히 비슷해서 쉬울 줄 알았는데... 좀 어려웠습니다.
일단 제가 알고 있어야 했던것은 v5+7의 의미입니다.
그리고 QWORD의 의미도 있고요.
GDB를 보고 풀어보려고 했는데... 문제에서 GDB를 사용하지 말라고 하네요..ㅎ
어쩔 수 없죠.
제가 삽질을 많이 해서 결론만 적겠습니다.
47244640437를 16진수로 바꿨을 때 B 0000 00B5가 됩니다.
scanf에서 16진수로 값을 입력하게 되면, 리틀 엔디안 방식으로 들어가기 때문에
B 0000 00B5는 b5 00 00 00 0b가 되어 입력되게 됩니다. 하지만 이건 문제에서 원하는 것과는 다르죠.
그래서 우리는 b5 00 00 00 0b로 입력해줘서 리틀 엔디안을 거치면, b 00 00 00 b5가 되게 해야합니다.
또 문제를 보니 v5+7번째에서부터 넣게 되네요.
이걸 종합해보면
0 1 2 3 4 5 6 7 8 9 10 11 12
00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 b5 00 00 00 0b
이렇게 입력이 되어야 하는 것이죠.
이게 뭔지 모르실거같은데.
숫자 3개 줄에서
첫 번째 줄은 v5로부터 떨어진 거리입니다. v5+7이기 때문에 앞선 7칸이 00으로 채워져야 합니다.
두 번째 줄은 그냥 자리를 나타내기 위한 수입니다. v5로부터 0칸 떨어진 위치, 1칸 떨어진 위치, 등등을 나타냈습니다.
세 번째 줄은 실제로 입력되어야 할 공간입니다. 여기서는 첫 번째 줄의 7 위치부터 11위치까지만 똑같으면 됩니다. if문에서 저부분만 검사하기 때문이죠. ㅎㅎ
예를 들어
00 00 00 00 00 00 00 b5 00 00 00 0b
ff ff ff ff ff ff ff b5 00 00 00 0b
이런 식으로 입력되어도 상관 없다는 겁니다.
아무튼 저런 식으로 데이터가 들어가도록 해야하는데...
저걸 통째로 계산하려면...
b000000b500000000000000
이걸 10진수로 바꾼
3.4043351210772203e+27
이걸 써야하는데... 도저히 사용할 엄두가 나지 않습니다.
인터넷 보니까 다들 나누기도 하고 그래서 저도 나눴습니다.
배열 한칸의 길이가 8바이트니까...
저기 위에
이거에서
0이 첫번째 배열 변수, 8이 두번째 배열 변수가 될거니까...
b5 00 00 00 00 00 00 00
0b 00 00 00
이렇게 두개로 나눌 수 있습니다. 위치만 제대로 들어가면 되는거죠 뭐...
그래서 이걸 입력을 하도록 하면?
b5 00 00 00 00 00 00 00 = -5,404,319,552,844,595,200
0b 00 00 00 = 184,549,376
이렇게 두개를 입력해주면 됩니다. 10진수로 입력을 받기 때문이죠.
-5,404,319,552,844,595,200를 v5[0]에 입력하고
184,549,376를 v5[1]에 입력하게 되면?
이렇게 코드를 구성할 수 있게 되며,
이렇게 답을 찾을 수 있게 됩니다.
'Hacking-기초 > [PWN] Pwnable.xyz' 카테고리의 다른 글
[PWN] xor (50pts) (0) | 2020.08.01 |
---|---|
[PWN] note (50pts) (0) | 2020.07.30 |
[PWN] add (50pts) (0) | 2020.07.28 |
[PWN] sub (50pts) (0) | 2020.07.28 |
[PWN] Welcome (50pts) (0) | 2020.07.28 |