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

[pwnable.xyz] note

728x90

1. 문제

해당 문제는 RELRO와 PIE가 안걸려 있다. 따라서 GOT overwrite가 가능하다

문제를 실행시키면 다음과 같은 메뉴가 나온다

코드를 한번 봐보자

while 문으로 입력을 반복적으로 받을 수 있다.

1을 입력하면 edit_note 함수가 실행될 것이고

2를 입력하면 edit_desc 함수가 실행될 것이다

read_int32함수는 입력을 받는 함수이다. 하나씩 확인해보자

  1. read_int32()

      char형 변수에 0x20만큼 입력을 받고 해당 문자열을 atoi 함수를 통해 정수로 바꾼 값을 return 한다.

 

  1. edit_note()

  • read_int32 함수를 이용하여 입력을 받고 그 값만큼 동적할당을 한다
  • 그다음 해당 위치에 입력을, 설정한 크기만큼 받는다
  • 그거를 전역 변수 s에 입력 사이즈 만큼 복사한다
  • 해당 동적할당 주소를 free 시킨다

 

 

  1. edit_desc()

  • 전역변수 buf가 0이면 0x20만큼 동적할당을 한다
  • 해당 전역변수 buf에 0x20만큼 입력을 받는다

 

 

2. 접근방법

우선 note_edit 함수에서 strncpy를 이용하는 부분을 유심히 보자. 느낌적으로 저 부분일 듯싶다

.bss 영역을 확인해보니 s와 buf 변수의 위치가 가깝다

s는 0x601480 주소를 시작으로 32바이트 만큼 배열에 입력을 받을 수 있는데, 그 다음 바로 buf 주소가 나온다

그렇다면 edit_note 함수에서 32+알파 만큼 값을 입력해준다면 s영역을 벗어나 buf 영역에 값이 덮어질 것이고,

edit_desc 함수에서 buf에 값이 들어가 있으니 동적할당을 하지 않고 바로 read함수가 호출될 것이다

 

그럼 이걸 어떻게??

생각해보자. 이전문제에서는 대부분 RELRO 가 다 걸려있었는데, 이번에는 안걸려 있다. 그말인 즉슨 GOT 섹션에 쓰기 권한이 있다는 소리이고 , 이걸 이용하여 GOT overwrite가 가능할 것이다

실제 got 영역이 write가 가능하다

그렇다면 특정 함수의 got 값을 변경시켜 해당 함수가 아닌 win 함수로 변형시키면 될 것이다

정리하면 다음과 같다

  • edit_note를 이용하여 s에 값을 넣을때 buf까지 침범하게 만든다

  • 해당 buf에는 read 함수의 실제 got 주소를 넣어준다

  • 그리고 2번을 입력하여 edit_desc가 실행되게 한다

  • 현재 buf got 주소(0x1234)가 들어가 있기 때문에 read 함수가 실행되면 0x1234 주소에 값을 쓰게 된다

  • 즉, buf에 win함수의 주소를 넣게 되면 read의 got 주소는 win 함수로 변경되어 다음번 read가 실행될시 win함수를 호출할 것이다

 

3. 풀이

최종 익스 코드는 다음과 같다

 

4. 몰랐던 개념

  • plt, got 의 호출과정을 따로 정리할 필요가 있
728x90

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

[pwnable.xyz] two targets  (0) 2020.01.23
[pwnable.xyz] xor  (0) 2020.01.23
[pwnable.xyz] add  (2) 2020.01.23
[pwnable.xyz] GrowUp  (0) 2020.01.22
[pwnable.xyz] misalignment  (0) 2020.01.22