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

두비니

·

2019. 11. 6. 00:06

We did some subtraction, now let's do some addition.

 

 

정직하게 더한다

 

 

솔직히 아무것도 상관은 없다. NX때문에 권한제한이 조금 있다.

 

 

 

대충 v4랑 v5를 잘 조작해주면 될듯

 

 

win함수 준걸로봐서 ret값을 이걸로 잘 덮으면 되겠쥬?

 

나는 v7을 이용할 것이다. 일단 result를 이용하고싶었지만 v7자체는 v6을 통해 11이상의 값을 입력하면 stack영역 그 밑까지 값을 입력할 수 있으므로 v7을 이용해 입력할 것이다.(전문용어로는 out of bound라고 하더라.)

 

v7은 rbp-60h에 있기때문에 v7 + 104가 시작주소(96 + 8)

이때 v7이 배열이라는 점을 잘 생각해보자. v7은 8byte인 __int64를 변수로 두기때문에 v7 + 104에 접근하고 싶다면 v6에 13을 입력하면 될 것이다.

 

참고로 나는 int64가 그냥 int랑 같은줄알고 4byte로 생각하고 계산하다가 한참을 헤맸다....ㅎ int64는 int와는 다르다는 점 기억하자

그러면 이제 flag함수의 주소만 넣어주면 된다

 

 

==final payload==

 

 

봐줄 점은 win함수의 주소값을 10진수로 변환하여 넣어줬고(입력받을때는 항상 dec의 형태로 입력받음), 한번 돌린 뒤 다시 a a a를 입력해주는 이유는 6번줄까지 입력한 상황은 ret값은 변조가 완료되었지만, 막상 while문이 종료되어야지 ret값까지 갈 수 있기때문에 scanf의 리턴값을 3이아닌 값을 주게되면 됩니다. 즉 문자열을 넣어주거나 값을 3개를 넣어주지 않으면 되겠죠!

scanf에 리턴값에 대해 잘 모르겠다면 다음 링크 참조

https://modoocode.com/36

끝!