document.onkeypress = getKey;


레벨 15!


전 번 문제와 같지만 check에 포인터를 이용했기 때문에 check가 가리키는 곳에 0xdeadbeef가 존재해야 한다.


여러가지 시나리오를 생각해보았다.

1. buf의 크기를 넘겨 check 메모리부분을 건드릴 수 있다면 buf배열의 처음을 0xdeadbeef로 채워주고 buf주소를 가리키면 될 것이다.

2. 0xdeadbeef가 만약 메모리 어딘가에 적혀있다면 그 부분을 가리켜주는 것이다. (아마 하드코딩되어있다면...?)


일단 디버깅으로 확인을 해보아서 뭐가 편한지 확인해보자.

빠르게 tmp로 옮겨 디버깅을 해보자..


우리가 관심있는 cmp (if문)에 breakpoint를 걸어놓고

A 20개를 입력해보고 확인해보자.

그 전에 약간 관심을 가져야 하는 부분은 바로 ebp-16 이다. 이부분이 바로 check 부분일 것이다.


ebp -16위치가 우리가 원하는 check부분을 확인하고

결국 우리는 $ebp-16위치에 있는 0xbfffe9d8 이 값을 0xdeadbeef가 있는 다른 주소로 덮어써주면 된다.


세보면 마지막 0x41414141 뒤로 20개 더 있으니까

페이로드는

40개의 A + 0xdeadbeef가 있는 어느 주소 

로 이루어주면 된다.

0xdeadbeef과 일단 있는지 확인해보자.


필자는 main함수를 확인해보아서 변수에 존재하는지 보려했는데 있다...!!


저기!! 걸쳐있는 beef와 dead가 보이는가!!


0x080484b2로 확인을 해주면 된다. 여기가 우리의 페이로드에 들어갈 주소가 된다....!!!!


짜보면..


아마 이번 문제는 이렇게 푸는것이 훨씬 쉬웠을 것이다.

1번 시나리오 대로 풀어보니 자꾸 주소가 바뀌는 문제점이 있었다.

'pwnable > FTZ' 카테고리의 다른 글

FTZ level18  (0) 2016.07.24
FTZ level17  (0) 2016.07.24
FTZ level16  (0) 2016.07.24
FTZ level14  (1) 2016.07.23
FTZ level13  (3) 2016.07.23

+ Recent posts