블로그 이전했습니다. https://jeongzero.oopy.io/
[pwnable.xyz] add
본문 바로가기
워게임/pwnable.xyz

[pwnable.xyz] add

728x90

1. 문제

이번 문제에는 PIE가 안걸려 있다

실행을 시켜보면 뭐.. 다음과 같다

아이다로 코드 흐름을 봐보자

  • v4, v5, v6 int64 변수와, v7 배열을 하나 선언하고

  • 각 변수에 입력을 받는다

  • v7 배열의 v6 인덱스에 v4와v5 값을 더한것을 넣고 해당 부분을 출력해서 보여준다

처음에 아무 생각없이 33 55 66 이렇게 입력을 해보았다

33와 44를 더한것이 77인데 이것이 바로 출력되었다?

인덱스 값은 v7[55]일텐데.....

 

 

2. 접근방법

Out of Bound 문제이다. 인덱스를 설정한 값보다 큰 값을 넣을 수 있고 ret 주소까지 덮을수 있다.

해당 문제에서 win() 함수라는 플래그 출력 함수를 제공해줬으므로 ret 주소를 저 주소로 변경하면 될 것이다

그리고 PIE와 ASLR이 꺼져 있으므로 win 주소 그대로 사용 하면 될 것이다

현재 메모리 구조가 이렇게 구성되어 있다

따라서 v[13] = win() 주소 이렇게 주면 된다

  • win 주소

 

 

3. 풀이

  • 첫번째 인자 v4 : win()주소의 10진수
  • 두번째 인자 v5 : 0
  • 세번째 인자 v6 : 13

여기까지 입력하면 ret주소는 변경되었고 scanf 탈출을 위해 문자열 아무거나 입력하면 된다

 

 

 

4. 몰랐던 개념

  • scanf의 리턴값은 서식문자의 개수이다. 만약 scanf가 정상적으로 입력을 받지않을 경우 0을 반환한다

      a=1, a1=2, a2=3, b1="aa"
    
      1. scanf("%d %d %d",a, a1, a2)     ->   리턴값 3
      2. scanf("%d", a)                  ->   리턴값 1
      3. scanf("%d", b1)                 ->   리턴값 0 
  • Out-of-Bound

    str[index] = 5; 이렇게 배열의 항목을 지정할 떄 상수가 아닌 변수를 사용한다면 컴파일러는 인덱스 값을 예측할 수 없기 때문에 오류처리가 불가능하다

    따라서 그대로 기계어로 번역할 것이고 인덱스 값이 배열의 크기를 넘어갈수 있고 크기가 5인배열이, str[8]=5 라고 그대로 들어가게 된다. 이런 인덱스에 대한 유효성을 개발자가 체크하는것이 맞다고 한다

728x90

'워게임 > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] xor  (0) 2020.01.23
[pwnable.xyz] note  (0) 2020.01.23
[pwnable.xyz] GrowUp  (0) 2020.01.22
[pwnable.xyz] misalignment  (0) 2020.01.22
[pwnable.xyz] sub  (0) 2020.01.22