System/Pwnable.xyz

JMP Table Write-up

pyozzi 2020. 1. 20. 02:51

[그림 1] JMP Table (100)

간단한 OOB문제다.

OOB도 바로 터지고 원샷 함수도 있어서 익스를 수월하게 진행할 수 있다.

 


Problem

[그림 2] 바이너리 실행

바이너리에서 메뉴마다 각 기능을 제공해주고, 각 기능을 통해 Exploit을 진행하는 방식이다.

 

[그림 3] main( )

특이사항은 메뉴를 호출할 때, 전역변수 vtable을 인덱싱하여 실행하고 있다.

여기서 포인트는 사용자 입력값으로 인덱스를 참조하고 있다는 점이다.

 

[그림 4] 전역변수 View

vtable외에도 sizeheap_buffer가 전역변수로 관리되고 있다.

 

[그림 5] Menu - malloc( ) 

size와 heap_buffer는 malloc( )메뉴에서 값을 입력할 수 있다.

size는 malloc( )으로 할당할 크기가 저장되고, heap_buffer는 할당된 Chunk의 주소가 저장된다.

 


Solve

위에서도 말했듯이 이 문제는 OOB(Out of Bound)취약점이 발생한다.

 

[그림 6] OOB Point

메뉴를 실행할 때, vtable을 사용자 입력으로 인덱싱하는데 큰 값에 대한 예외처리는 이루어지고 있지만 작은 값에 대한 예외처리는 이루어지지 않고 있다.

 

[그림 7] Size 저장공간

따라서, -n으로 다른 공간에 저장된 주소를 호출할 수 있게 된다.

vtable 이전 주소에 우리가 입력할 수 있는 공간은 malloc( ) size가 저장되는 0x6020B0이 있다.

 

[그림 8] Size - oneshot( ) 주소 저장

size공간에 oneshot( )주소 0x400A31(4196913)을 저장해주고, -2로 vtable을 인덱싱해주면 size공간을 참조하게 된다.

 

[그림 9] vtable size공간 참조

메뉴를 호출할 때 size공간에 저장된 0x400A31을 참조하게 되면서 oneshot( )가 호출된다.

 

[그림 10] Solve